发送缓冲区与接收缓冲区实际上不是同一地址,16~28的RAM只是2个窗口。真正的发送缓冲区在96~108,接收缓冲区在32~95。如果实验(在复位模式下)往96~108里写数据,然后CMR.0启动发送,与程序中send()函数由16~28写入发送缓存,发送结果一样。<br /> 操作模式下,96~108只读不可写,数据是通过窗口16~28写入的。16~28窗口比喻起来就好像是一个餐厅的传菜口。仅仅是个“孔洞”,没有硬件内存的。<br /> 接收缓存RXB也是如此,接收到的数据实际是写到了RAM地址32~95里。程序读出的只是从16~28窗口看见的部分。比喻起来RXB就象是轮船的货舱口,每吊出一“帧”货物之后,就要把里面的货物往舱口移,......只是货舱操作是先入后出FIBO罢了。<br /> RX寄存器(RAM地址29)是报文计数器,它记录了所接收到的报文数目,每接收到一帧报文,RX加一。RBSA寄存器(RAM地址30)是指针,指向64字节FIFO接收缓存RX中未读取报文的起始地址。每次执行释放命令CMR=4,RX减一,RBSA+DLC+3/5,指向新的报文起始地址,FIFO接收缓冲区滚动,RBSA指向下一帧接收区,相当于窗口移动,窗口内数据更新。......反复进行,直到RX=0,接收中断位RI才等于0,接收缓冲器状态位RBS也才等于0。<br /> 可见,接收缓存RXB窗口所看到的数据内容总是FIFO内以RBSA所指向的起始地址的13字节数据内容。<br /> 这些内容书上写的挺清楚的。没有强调的是RX和RBSA的联动行为,以及SR.0/IR.0与RX的关联关系。<br /><br />
|