- Hi,
- Not sure if this is the correct place to ask...
- My code is crashing after a spi write function.
- It is probally obvious to someone here, i think i fell into that tree in the forest routine.
- Anyway, using sdk11, softdevice2,0,1.
- I am trying to write data to a register via 3-wire spi.
- I believe the register to be 'write only' , still waiting for response, and 'write only' is acceptable in my case.
- I included a snip, it crashes on the last line, in debug simulator, (still have one part on b/o for the pcb).
- 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); }