以前用的也是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芯片就明白。

nrf52驱动lis2dh12问题

问题二:定时中断问题

      我没采用芯片的INT脚产生中断,而是采用定时中断去读取数据,这里要说明一点的是,不要在中断里面加死循环,不然会出错,即使加了,循环的次数也不能太多,不然也会卡死的,因为驱动里有while(!spi_lis_done);所以就不能放中断里去读取发送了,但是不要while(!spi_lis_done);很多时候,它又会提示busy;所以最好把读数据都放在main的while循环里,中断只给出一个中断标记就可以了。

以上是再次调试lis2dh12的一点经验,分享给大家,希望对大家有帮助。

 

相关文章: