SI4463 发送与接收不同步的问题
SI4463配置为使用变长度包传送模式,主机发送数据,从机接收数据,然后从机回传数据至主机。
发现,主机数据发送完毕后,从机并不是立即接收到,而是经过一个延迟(该延迟不固定,与包长度有关)。在此,将主机和从机的SI4463上的NIRQ信号接至示波器观察(使能包传送完毕和接收完毕中断)。
这里,通信前导字为8个字节,同步字为2个字节,包长度位为1个字节,包数据为8个字节,无CRC。数据串行速率为1kbps,主机理论上发送完毕需时间(8+2+1+8)*8/1k=0.152s,实际测试为160ms。而示波器显示,从机经过0.12s后,NIRQ才变低。
读取RX FIFO的状态,在从机接收完毕后,RX FIFO中的个数理论上应该是(1个字节的包长度+8个字节的数据=9),而在从机NIRQ变低后,读取的RX FIFO个数为0x18,即24个,多读取了15个,理论上多耗时15*8/1k=0.12s,与实测相吻合。
因为读取时是按包读取,即RX FIFO第一个值为8(包长度),然后接下来只读取8个数据,并且在下次接收数据之前,会重新reset RX FIFO,所以并不会出错(倘若在进行下次操作之前不重新reset RX FIFO,则下次接收会出错)。但仍然存在的问题是带来的延迟较大。
奇怪现象:若从机只是接收,不进行发送操作,则主机发送完毕后,从机也同时收到,RX FIFO中的个数与主机发送的个数相吻合。一旦进行发送操作后,则从机的接收就会出现延迟现象,RX FIFO中的个数也异常。所以,自然想到若在从机发送完毕后,重新对SI4463进行初始化操作(像上电初始化那样),则一定可以保证下次接收会与主机的发送同步。事实也是如此。但如果全部重新初始化,也耗费时间。进一步发现,只须对RF_PKT_LEN_12部分进行初始化(由WDS自动生成的头文件)。
即在每次发送完毕后,重新配置下RF_PKT_LEN_12部分的寄存器(进一步发现是PKT_FIELD_1_LENGTH_12_8、7_0),然后可保证从机下次接收与主机的发送同步。