目录
1 前言
SX126x内部有一个256字节的缓冲区,该FIFO是Tx和Rx共同使用的。发射时需要先将payload写到FIFO中再启动发送;另外接收时芯片会将收到的数据放到FIFO指定的空间,产生RxDone中断后,用户就可以从FIFO中获取到数据。
由于FIFIO大小限制,最大发送接收数据长度为256字节。
2 FIFO设置
2.1 访问权限
除了Sleep模式下,其余模式都可以通过命令直接访问,修改或者获取数据。进入Sleep模式后,FIFO中的数据会被清除。
2.2 TxFIFO设置
1)TxBaseAdress
指向RF将要发送的数据地址,通过setBufferBaseAddress()命令设置。
PS:实际发送长度,由SetPacketParams(...)命令单独设置
2)TxDataPointer
指向用户写数据buffer的起始地址,初始值为TxBaseAddr,一旦写入数据,该指针就会自动增长。
通过WriteBuffer()命令写入需要发射的数据。
- offset - 写入数据流的首地址,即TxDataPointer
- data[n] - 依次写入数据,TxDataPointer会自动递增,由于FIFO特性当TxDataPointer递增到255时会从0开始
2.3 RxFIFO设置
1)RxBaseAdress
指向RF接受到数据后写入缓存的起始地址,通过setBufferBaseAddress命令设置。
2)RxPayloadLength
用于保存RF接收到数据包的长度,可以通过GetRxBufferStatus命令获取。
3)RxStartBufferPointer
指向最后一包接受的数据包的起始位置。可以通过GetRxBufferStatus命令获取。
4)RxDataPointer
用户读取FIFO的起始地址,每次读取指针自加
通过ReadBuffer()命令读取接收到的数据。
- offset - 指向读取数据缓存的首地址,该值一般是先通过命令GetRxBufferStatus获取到芯片接收到数据保存到FIFIO的地址,再使用该地址作为这里的offset
uint8_t SX126xGetPayload( uint8_t *buffer, uint8_t *size, uint8_t maxSize )
{
uint8_t offset = 0;
//先通过命令GetRxBufferStatus获取RF模块接收到的数据的首地址0ffset和长度size
SX126xGetRxBufferStatus( size, &offset );
if( *size > maxSize )
{
return 1;
}
//再使用ReadBuffer()命令,依据offset和size读取数据
SX126xReadBuffer( offset, buffer, *size );
return 0;
}
3 长度设置
- 设置每包的发送长度和最大接收长度
3.1 发送长度
- 发送长度很好理解,硬件直接从TxBaseAdd起始,按设置长度发送
3.2 最大接收长度
- 无论是单次还是连续接收模式,每包接收最大长度限制。如果空中数据包长度是大于该值,当接收到最大长度时就停止接收,产生RxDone中断。同时会将这些数据当作一个packet进行数据校验,由于数据不完整所以也会产生CRCERR中断。
4 FIFO循环
经测试,在连续接收模式下,如果设置起始地址为0,每次接收10字节。如果不切换模式或者重新设置RxStartBufferPointer会一直累加(10,20...250,4,14),到255会自动循环到0.
5 FIFO溢出
如果Tx和Rx分别使用FIFO的一部分,Rx区域在低地址空间,注意设定好最大接收长度,否则Rx接收数据可能覆盖Tx的区域。整个FIFO只有使用到255地址时,才自动循环从0开始。