接收描述符存放在存储器的一个数组中。数组的基址存放在RxDescriptor寄存器中,并且应该与4字节地址边界对齐。数组中描述符的个数存放在RxDescriptorNumber寄存器中,该寄存器使用减1编码,如果数组有8个元素,则该寄存器的值应该是7。还有一个与描述符平行的“状态数组”。对于描述符数组中的每个元素,“状态数组”中均有一个相关的状态区域。状态数组的基址存放在RxStatus寄存器中,并且该基址必须与8字节地址边界对齐。在操作过程中(当接收通道使能时),不可以对RxDescriptor、RxStatus和RxDescriptorNumber寄存器进行修改。

你知道吗?这个过程涉及两个关键寄存器:RxConsumeIndex和RxProduceIndex,它们用于定义下一个将被硬件和软件使用的描述符单元。这两个寄存器可充当计数器,从0开始计数并在计数值到达RxDescriptorNumber寄存器中的值时回到0。RxProduceIndex包含的是将被接收到的下一帧数据填充的描述符的索引。RxConsumeIndex由软件来编程,它是软件接收驱动程序下一次即将处理的描述符的索引。

想了解更多关于寄存器的内容吗?看看这篇五存储器控制的详细介绍,它将带你深入理解寄存器的工作原理。

当RxProduceIndex==RxConsumeIndex时,接收缓冲区为空。当RxProduceIndex==RxConsumeIndex-1(考虑到它是一个封包设计)时,接收缓冲区满,新接收到的数据将产生溢出,除非软件驱动程序将一个或多个描述符释放。每个“接收描述符”在存储器中占据两个字(8个字节)。同样,每个“状态区域”也在存储器中占据两个字(8个字节)。每个接收描述符均由一个“数据包指针(PACKET)”和一个“控制字(CONTROL)”组成,指针(接收描述符区域中的包)指向用来存放接收数据的数据缓冲区,控制字包含的是控制信息。数据包区域的地址偏移量为0,控制区域的地址偏移量为4字节。

你可能会感兴趣的是,这种描述符的使用方式在单片机的存储器寄存器中也有类似的应用,想知道更多?阅读这篇单片机的存储器寄存器介绍吧!