sdk52 nrf52832上一直SI446x驱动

 

由于SI446X是用SPI通信的,所以我们先使用SDK上的SPI驱动,我采用的是SPI1,这部分可以参考E:\nRF5_SDK\nRF5_SDK_15.2.0_9412b96\examples\peripheral\spi这个例程

我给它增加了三种命令形式,如下:

这个函数专门写命令的
void Rf_Spi_WriteCmd(uint8_t *tx_data,uint8_t t_length)
{
    spi_xfer_done=false;

    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_data, t_length, 0, 0));
        /* waiting for rx compelet*/
  while(!spi_xfer_done);

    spi_xfer_done=false;
}

这个函数专门写一个Byte命令并返回一个Byte

uint8_t Rf_Spi_ReadWriteByte(uint8_t byte)
{
    uint8_t   SPI_Tx_Buf[2];  
    uint8_t   SPI_Rx_Buf[2]; 
    
    SPI_Tx_Buf[0] = byte;
    spi_xfer_done=false;

    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, SPI_Tx_Buf,1,SPI_Rx_Buf,1));
    /* waiting for rx compelet*/
  while (!spi_xfer_done);

    spi_xfer_done=false;
    return SPI_Rx_Buf[0];
}

这个函数专门写多个Byte命令并返回多个Byte

uint8_t Rf_Spi_ReadWriteData(uint8_t *tx_data,uint8_t t_length,uint8_t *rx_data,uint8_t r_length)
{   
    spi_xfer_done=false;

    APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, tx_data,t_length,rx_data,r_length));
    /* waiting for rx compelet*/
  while (!spi_xfer_done);

    spi_xfer_done=false;
    return 1;
}

SPI驱动写好以后,就是对SI446x进行配置了,记得以上函数在while (!spi_xfer_done);后面不要再加delay了,不然SPI的配置会变慢,使用SPI也会变慢,我先前加了一个nrf_delay_ms(10);慢的不像话啊,配置一条指令要2-3秒,让我郁闷了好一阵。

配置好SI446X之后,还有一个问题需要注意,读数据的时候我发现buff[0]位置总读不到想要的数据,后来我也就没要buff[0]这一位了,后面再优化了,再然后就是发送和接收了

发送的时候主要的还是函数SI446X_SEND_PACKET()这个函数,命令和数据一定要一起发,不能分开发,不然即使能发出去另外一边都收不到,因为接收的时序不对了。

再者就是接收的时候,也就是上面提到的buff[0]位置出错问题,在这里命令的发送和读数据要分开命令执行,不然也是不行的,我试过用一条指令(即上面提到的一个函数发),会发现读到的数据buff[0],buff[1]都不是想要的数据,从buff[2]开始才是想要的数据,这个问题后再优化了,暂时还没找出是啥问题。读 si446x 遇到了这样的问题,读其它的芯片暂时没发现这样的问题。

反正也是坑死了,整了我好久。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值