SX126x-如何使用Data Buffer

目录

1 前言

2 FIFO设置

2.1 访问权限

2.2 TxFIFO设置

1)TxBaseAdress

2)TxDataPointer

2.3 RxFIFO设置

1)RxBaseAdress

2)RxPayloadLength

3)RxStartBufferPointer

4)RxDataPointer

3 长度设置

3.1 发送长度

3.2 最大接收长度

4 FIFO循环

5 FIFO溢出


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开始。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Semtech公司sx126x芯片驱动库中的sx126x-cad驱动函数代码示例,用于执行CAD操作并检测信道是否可用: ``` #include "sx126x.h" // 初始化sx126x芯片 sx126x_init(&sx1268); // 设置CAD参数 sx126x_set_cad_params(&sx1268, 0, SX126X_CAD_ON_BOTH_EDGES, SX126X_CAD_SYMBOL_DURATION_8); // 执行CAD操作 int cad_result = sx126x_cad(&sx1268); // 检查CAD结果 if (cad_result == SX126X_CAD_OK) { // 信道空闲,可以发送数据 send_data(); } else if (cad_result == SX126X_CAD_DETECTED) { // 信道有信号干扰,等待一段时间后重试 delay(1000); sx126x_cad(&sx1268); } else { // CAD操作失败,检查硬件或者软件配置 handle_error(); } ``` 在这个示例中,我们首先使用sx126x_init()函数初始化了sx126x芯片,并将其指针传递给sx126x-cad驱动函数。然后,我们使用sx126x_set_cad_params()函数设置CAD参数,比如CAD检测模式和检测时长。接着,我们使用sx126x_cad()函数执行CAD操作,并检查返回结果。如果返回结果是SX126X_CAD_OK,则说明信道空闲,可以发送数据。如果返回结果是SX126X_CAD_DETECTED,则说明信道有信号干扰,我们等待一段时间后重新执行CAD操作。如果返回结果是其他值,则说明CAD操作失败,需要检查硬件或者软件配置。需要注意的是,在使用sx126x-cad驱动函数之前,需要包含sx126x.h头文件,并在应用程序中实现sx126x_init()和sx126x_set_cad_params()函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值