由于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 遇到了这样的问题,读其它的芯片暂时没发现这样的问题。
反正也是坑死了,整了我好久。