nRF52832 crashing in debug (simulator) after spi write

  1. Hi, 
  2. Not sure  if this  is the correct place to ask...
  3. My code is crashing  after a spi write function.
  4. It is probally obvious to someone here, i think i fell into that tree in the forest routine.
  5. Anyway, using sdk11, softdevice2,0,1.
  6. I am trying to write data to a register via 3-wire spi.
  7. I believe the register to be 'write only' , still waiting for response, and 'write only' is acceptable in my case.
  8. I included a snip, it crashes on the last line, in debug simulator, (still have one part on b/o for the pcb).
  9. I don't see a buffer compare in the spi handler, can someone point out the obvious?
     static uint32_t wm8711lgefl_register_read(uint8_t reg_addr, uint16_t * p_reg_data, bool blocking) 
     { 
     nrf_drv_spi_xfer_desc_t spi_xfer; 
     uint32_t spi_flags; 
     uint32_t err_code; 
     uint8_t reg_addr_buf[1]; 
     uint8_t reg_data_buf[2]; 
      
     reg_addr_buf[0] = (reg_addr >> 1) & 0x7F; 
     spi_flags = NRF_DRV_SPI_FLAG_REPEATED_XFER; 
      
     spi_xfer.tx_length = sizeof(reg_addr_buf); 
     spi_xfer.p_tx_buffer = reg_addr_buf; 
     spi_xfer.rx_length = sizeof(reg_data_buf); 
     spi_xfer.p_rx_buffer = reg_data_buf; 
      
     memset(reg_data_buf, 0, sizeof(reg_data_buf)); 
      
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
      
     err_code = nrf_drv_spi_xfer(&m_spi_instance, &spi_xfer, spi_flags); 
      
     if (err_code != NRF_SUCCESS) 
     { 
     wm8711lgefl_mclk_disable(); 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
     return err_code; 
     } 
      
     while (blocking && (m_spi_transfer_state == WM8711LGEFL_SPI_TRANSFER_PENDING)) 
     { 
     __WFE(); 
     } 
      
     // wm8711lgefl_mclk_disable(); 
      
     if (err_code != NRF_SUCCESS || m_spi_transfer_state != WM8711LGEFL_SPI_TRANSFER_SUCCESS) 
     { 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
     return err_code; 
     } 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
      
     *p_reg_data = (reg_data_buf[0] << 8 | reg_data_buf[1]); 
      
     return NRF_SUCCESS; 
     } 
        
     static uint32_t wm8711lgefl_register_write(uint8_t reg_addr, uint16_t reg_data, bool blocking) 
     { 
     nrf_drv_spi_xfer_desc_t spi_xfer; 
     uint32_t spi_flags; 
     uint32_t err_code; 
     uint8_t write_buf[3]; 
      
     write_buf[0] = (reg_addr >> 1) & 0x7F; 
     write_buf[1] = (reg_data >> 0) & 0xFF; 
     write_buf[2] = (reg_data) & 0x01; 
     spi_flags = 0; 
    	
     spi_xfer.tx_length = sizeof(write_buf); 
     spi_xfer.p_tx_buffer = write_buf; 
      
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
      
     err_code = nrf_drv_spi_xfer(&m_spi_instance, &spi_xfer, spi_flags); 
      
     if (err_code != NRF_SUCCESS) 
     { 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
     return err_code; 
     } 
      
     while (blocking && (m_spi_transfer_state == WM8711LGEFL_SPI_TRANSFER_PENDING)) 
     { 
     __WFE(); 
     } 
      
     if (err_code != NRF_SUCCESS || m_spi_transfer_state != WM8711LGEFL_SPI_TRANSFER_SUCCESS) 
     { 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
     return err_code; 
     } 
     m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
      
     return NRF_SUCCESS; 
     } 
    
    static void wm8711lgefl_register_write_verify(uint8_t reg_addr, uint16_t reg_data, uint16_t ro_mask) 
     { 
     uint16_t read_value; 
      
     NRF_LOG_PRINTF("Writing 0x%04x to register 0x%04x\r\n", reg_data, reg_addr); 
      
     do 
     { 
     nrf_delay_us(50); 
     wm8711lgefl_register_write(reg_addr, reg_data, true); 
     nrf_delay_us(50); 
     wm8711lgefl_register_read(reg_addr, &read_value, true); 
     } while ((read_value & ro_mask) != reg_data); 
     } 
  • This is correct place to ask, not sure if this helps but few things that might help

    1. Try to use latest sdk (17 in this case and not 11) for nRF52 based development. There are many bugs that are fixed in the later versions of SDK11.
    2. It always helps to be more specific in terms of the error your see. Crashes is not the correct word, if it is a hardfault or system reset would help us readers to gain more context than saying "crashes".

    I would strongluy suggest you to try the same code using sdk 17 (some porting might be required) before attempting to debug your issue on SDK11. 

Related