|
背景
本文旨在便于模块使用者理解LORA系类芯片中的FIFO地址的问题。SX27X,SX126X,LLCC68等LORA芯片的情况都可以提供参考。
过程
LORA芯片配备256字节RAM数据缓冲区,在LoRa模式下可唯一访问。该RAM区域(这里称为FIFO数据缓冲器)可由用户完全定制,并允许访问接收的或将要传输的数据。所有对LORA FIFO数据缓冲区的访问均通过SPI接口完成。FIFO数据缓冲区的用户定义内存映射图如下所示。
这些FIFO数据缓冲区可在除睡眠和存储与上次执行的接收操作相关的数据外的所有操作模式下读取。每次转换到接收模式时,都会自动清除旧内容。
FIFO的物理长度是256字节,由于其双端口配置,它可以同时存储发送和接收信息在先进先出数据缓冲区。寄存器RegFifoTxBaseAddr指定存储传输信息的内存点。类似地,对于接收器操作,寄存器RegFifoRxBaseAddr指示数据缓冲区中信息所在的点将在接收操作时写入。默认情况下,设备在通电时进行配置,使可用内存的一半专用于Rx(RegFifoTxBaseAddr在地址0x00处初始化)另一半专用于Tx(RegFifoTxBaseAddr在地址0x80)。
由于FIFO数据缓冲区的连续性,Tx和Rx的基址是完全可配置的跨越256字节的内存区域。每个指针可以在FIFO中的任何位置独立设置。利用最大FIFO数据缓冲区大小在发送或接收模式下,整个FIFO数据缓冲区可在每种模式下使用在内存底部设置基址RegFifoTxBaseAddr和RegFifoRxBaseAddr(0x00)。
当设备处于休眠模式时,FIFO数据缓冲区被清除,因此无法访问FIFO数据缓冲区可能在睡眠模式下。然而,当在另一个存储器之间切换时,FIFO数据缓冲器中的数据被保留操作模式,以便在控制器端以最小的数据处理重新传输接收到的包。这个FIFO数据缓冲区不是自动清除的(除非设备处于休眠模式),只有当新的数据集被写入占用的内存位置。要通过SPI接口读取或写入的FIFO数据缓冲区位置由地址指针定义regfioaddrptr。因此,在执行任何读或写操作之前,必须将该指针初始化为相应的基价值观。读取或写入FIFO数据缓冲区(RegFifo)时,地址指针将自动递增。寄存器RegRxNbBytes定义在接收成功时要写入的内存位置的大小操作。寄存器RegPayloadLength指示要传输的内存位置的大小。隐式标题中模式下,由于有效负载字节数已知,因此不使用寄存器REGRXNBYTES。否则,在显式标头中模式下,接收缓冲区的初始大小设置为接收报头中的数据包长度。登记册RegFifoRxCurrentAddr表示在FIFO中接收到的最后一个数据包的位置,以便可以删除接收到的最后一个数据包通过将寄存器RegFifoAddrPtr指向此寄存器,可以轻松读取。重要的是要注意,所有接收到的数据都将写入FIFO数据缓冲区,即使CRC是无效的,如果允许的话损坏数据的用户定义后处理。还需要注意的是,在接收时,如果数据包大小超过为接收分配的缓冲存储器,它将覆盖数据缓冲区的传输部分。
关于一些可能的疑问:
(1)datasheet中的接收指针(The RX modem address pointer)到底是什么?
接收指针是RegFifoRxByteAddr,可以手动将RegFifoAddrPtr设置为RegFifoRxByteAddr减去RegRxNbBytes的值,使该指针从当前数据包开始,一直指向最后接收的数据包的存储位置。可以通过RegRxNbBytes次读取寄存器RegFifo中的地址,以提取数据包的有效负载字节。意思就是在连续接受模式读取FIFO中数据的另外一种方式:用RegFifoRxCurrentAddr = RegFifoRxByteAddr - RegRxNbBytes。这就说明了接收指针就是RegFifoRxByteAddr,接收数据前,它被用户指定指向FIFO中的某一个地址(缺省值为0x00),接收到数据后,它会指向接受到的数据的末尾地址。
(2)FIFO可读取时间
不是的,睡眠模式不可读取。这些FIFO中的数据保存最后接收操作相关的数据,除了睡眠模式之外,在其他操作模式下FIFO均可读,在切换到新的接收模式时,会自动清除旧内容。
(3)在单次接收模式下,一次接收数据结束后,RegFifoRxByteAddr会重置为基地址0x00
会的,datasheet中有单次接收流程:用户从FIFO的基地址0x00处(如果你把基地址设置为其他值,则从你设置的值处)开始读取数据,一次读取数据结束,下次读取时,需要将再次从基地址0x00处(如果你把基地址设置为其他值,则从你设置的值处)读取,那么就是说完成每次的单次接收后,都会RegFifoRxByteAddr都会重置。
(4)连续接收模式下,需要判断接收缓冲区满的情况吗?
需要的,datasheet中也明确说明:关联微控制器MCU必须对地址指针进行处理,以保证FIFO数据缓存不会溢出。这种情况下,就要视情况来对接收指针RegFifoRxByteAddr进行设置,只要在FIFO没有满的情况下,将接收指针RegFifoRxByteAddr指向基地址就行,当然,RegFifoRxCurrentAddr也要同时指向基地址。
(5)FIFO操作过程和注意事项
LORA芯片的FIFO拥有双端配置,可以同时缓存将要发送和接收的数据。寄存器RegFifoTxBaseAddr内是将要发送信息的起始位置,RegFifoRxBaseAddr内是接收操作在FIFO的起始位置。
SX127X的RegFifoRx/TxBaseAddr默认情况是上电后RegFifoRxBaseAddr初始化为0x00,而RegFifoTxBaseAddr初始化为0x80,以保证各一半的可用内存用在Rx和Tx。
如果想让整个FIFO仅在发送或接收模式下使用,就要把上述两个BaseAddr寄存器都设为0x00。
而SX1268的RxBaseAddr和TxBaseAddr初始化后默认都是0x00。
在睡眠模式下,FIFO会被清空,因此睡眠时无法访问FIFO。而在其他操作模式,FIFO数据则能够保存,因此也能实现数据重发机制。当一组新数据写入已被占用的FIFO空间时,只会覆盖这些数据,而不会清空其他数据。
RegFifoAddrPtr通过SPI读写FIFO的当前数据位置是由地址指针RegFifoAddrPtr定义。因此在进行读取或写入操作前,必须先将该指针初始化为对应的基地址。从FIFO缓存(FegFifo)读取或写入数据后,该地址指针RegFifoAddrPtr会自动递增。
RegRxNbBytes/RegPayloadLength接收到一组数据时,RegRxNbBytes寄存器会定义待写入数据的大小,RegPayloadLength则显示待发送数据大小(所占用的FIFO单元大小)。
在隐式Header模式下,RegRxNbBytes是无效的,因为此时Payload的长度是固定或已知的。。而在显式Header下,接受缓存区的初始空间要与所要接收的包头中携带的数据包长度一致。
RegFifoRxCurrentAddrr显示最后接收数据包在FIFO中的存储位置,因此通过将RegFifoAddrPtr指向RegFifoRxCurrentAddr就可以轻松读取出该数据包。
即使CRC无效,接收到的数据也会写入FIFO,这样可以让用户自定义损坏数据的后续操作。
接收数据包时,如果数据包大小超过分配给Rx的空间,它会往下覆盖掉FIFO存储的发送数据部分。
结论
核心思想就是256字节的地址,使用者可以随便用,随便定义,只要记住你发送时先把指针指向哪里之后再填写的FIFO,执行那条发送命令前就把指针再指向到那里。记住执行进入接收状态前把指针指向到了那里,收到数据包后就还从哪里开始读取数据。但是具体操作中又有很多要注意的地方,本文就是把过去使用者曾经咨询过的关于FIFO地址一些问题整体到了一起,希望能解除模块者对这部分的疑问。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|