以前用的也是nrf52调试的lis2dh12的驱动,不过是nrf SDK9.0,现在用SDK15.2重新再调试,发现不行了,又得重新调过。
问题一:SPI驱动问题
问题二:定时中断问题
问题一:SPI驱动问题,以前的驱动驱动不了了。
void gspi_event_handler(nrf_drv_spi_evt_t const * p_event,void *p_context)
{
spi_lis_done = true;
// NRF_LOG_INFO("gspi event done!");
}
void SPI1_Init(void)
{
uint32_t err_code;
nrf_drv_spi_config_t spiconfig = NRF_DRV_SPI_DEFAULT_CONFIG;
spiconfig.sck_pin = SPIM1_SCK_PIN;
spiconfig.mosi_pin = SPIM1_MOSI_PIN;
spiconfig.miso_pin = SPIM1_MISO_PIN;
spiconfig.ss_pin = SPIM1_CS_PIN;
spiconfig.frequency = NRF_DRV_SPI_FREQ_8M;
// spiconfig.mode = NRF_DRV_SPI_MODE_0;
spiconfig.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST;
err_code = nrf_drv_spi_init(&gSpi, &spiconfig,gspi_event_handler, NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_INFO("nrf_drv_spi_init:%d\r\n", err_code);
nrf_gpio_cfg_output(SPIM1_CS_PIN);
gSPI_CS_HIGH;
}
以前LIS2DH12_ReadReg读寄存器是分开两个nrf_drv_spi_transfer()发送来执行的,现在只能合并成一个发送来完成。而且读数据的buf以前是一个字节,现在要用两个字节,不然读取一个字节nrf_drv_spi_transfer(&gSpi, data, 1, p_data,1);总是得不到正确的数值,看程序你就会明白,你正在想读取的字节已经跑到rx_data[1]位置了,这是因为在发送data的时候,同时也返回了一个字节 rx_data[0],坑啊!
u8_t LIS2DH12_ReadReg(u8_t Reg, u8_t* p_data) {
//To be completed with either I2c or SPI reading function
// uint32_t err_code = NRF_SUCCESS;
uint8_t data[2];
uint8_t rx_data[2];
data[0] = Reg | LIS2DH12_READBIT;
gSPI_CS_LOW;
spi_lis_done = false;
nrf_drv_spi_transfer(&gSpi, data, 1, rx_data,2);
// APP_ERROR_CHECK(err_code);
// NRF_LOG_INFO("LIS2DH12_ReadReg:%x,%x\r\n", rx_data[0],rx_data[1]);
while(!spi_lis_done);
p_data[0] = rx_data[1];
gSPI_CS_HIGH;
return 1;
}
/*******************************************************************************
* Function Name : LIS2DH12_WriteReg
* Description : Generic Writing function. It must be fullfilled with either
* : I2C or SPI writing function
* Input : Register Address, Data to be written
* Output : None
* Return : None
*******************************************************************************/
u8_t LIS2DH12_WriteReg(u8_t WriteAddr, u8_t Data) {
//To be completed with either I2c or SPI writing function
// uint32_t err_code = NRF_SUCCESS;
// uint8_t send_size = 2;
uint8_t data[2];
data[0] = WriteAddr&0x7F;
data[1] = Data;
gSPI_CS_LOW;
spi_lis_done = false;
nrf_drv_spi_transfer(&gSpi, data,2, NULL, 0);
// APP_ERROR_CHECK(err_code);
while(!spi_lis_done);
gSPI_CS_HIGH;
return 1;
}
发送端没啥好说的,但是如果要发送的是寄存器或地址+data的话,一定要写在一个buf里去,不然会有问题,原因这就得看SPI的协议了,一般芯片datasheet都带SPI 协议说明的 。如果你分两次发送,发送一次寄存器或地址,数据部分另外再同一函数发送,就会有问题,数据发送出去了,得不到回应或写入不成功。SPI驱动外部flash芯片就明白。
问题二:定时中断问题
我没采用芯片的INT脚产生中断,而是采用定时中断去读取数据,这里要说明一点的是,不要在中断里面加死循环,不然会出错,即使加了,循环的次数也不能太多,不然也会卡死的,因为驱动里有while(!spi_lis_done);所以就不能放中断里去读取发送了,但是不要while(!spi_lis_done);很多时候,它又会提示busy;所以最好把读数据都放在main的while循环里,中断只给出一个中断标记就可以了。
以上是再次调试lis2dh12的一点经验,分享给大家,希望对大家有帮助。