Hi All,
I am using nrf52840 in my project and working on sdk 17.0.2. I have an SPI based IC MAX3421E connected to my device. I am able to read and write single bytes through SPI code. But I am having issues with reading and writing multiple bytes. I am not getting proper response when I try to read or write multiple bytes. The sample code from the library and the converted ones are attached below:-
Sample code from MAX3421 library:-
//SAMPLE CODE FROM MAX3421 LIBRARY BYTE SPI_wr( BYTE data ) { SSPBUF = data; // write byte to SSP2BUF register while( !SSPSTATbits.BF ); // wait until bus cycle completes return ( SSPBUF ); // } /* Single host register write */ void MAXreg_wr(BYTE reg, BYTE val) { Select_MAX3421E; SPI_wr ( reg + 2 ); //set WR bit and send register number SPI_wr ( val ); Deselect_MAX3421E; } /* multiple-byte write */ /* returns a pointer to a memory position after last written */ char* MAXbytes_wr( BYTE reg, BYTE nbytes, char* data ) { Select_MAX3421E; //assert SS SPI_wr ( reg + 2 ); //set W/R bit and select register while( nbytes ) { SPI_wr( *data ); // send the next data byte data++; // advance the pointer nbytes--; } Deselect_MAX3421E; //deassert SS return( data ); } /* Single host register read */ BYTE MAXreg_rd( BYTE reg ) { BYTE tmp; Select_MAX3421E; SPI_wr ( reg ); //send register number tmp = SPI_wr ( 0x00 ); //send empty byte, read register contents Deselect_MAX3421E; return (tmp); } /* multiple-bytes register read */ /* returns a pointer to a memory position after last read */ char* MAXbytes_rd ( BYTE reg, BYTE nbytes, char* data ) { Select_MAX3421E; //assert SS SPI_wr ( reg ); //send register number while( nbytes ) { *data = SPI_wr ( 0x00 ); //send empty byte, read register contents data++; nbytes--; } Deselect_MAX3421E; //deassert SS return( data ); }
The above code has been converted to NRF library format.
void max3421eRegWr(uint8_t reg, uint8_t data) { SPIWriteLength = 2; SPIReadLength = 0; spi_tx_buf[0] = reg + 0x02 ; spi_tx_buf[1] = data; spi_xfer_done = false; nrf_gpio_pin_clear(SPI_SS_PIN); nrf_drv_spi_transfer(&m_spi, spi_tx_buf, SPIWriteLength, spi_rx_buf, SPIReadLength); while(spi_xfer_done == false){}; // this flag will be set to true in the spi interrupt handler function nrf_gpio_pin_set(SPI_SS_PIN); vTaskDelay(1000); } uint8_t max3421eRegRd(uint8_t reg) { spi_tx_buf[0] = reg; spi_tx_buf[1] = 0x00; spi_xfer_done = false; nrf_gpio_pin_clear(SPI_SS_PIN); nrf_drv_spi_transfer(&m_spi, spi_tx_buf, 2, spi_rx_buf, 2); while(spi_xfer_done == false){}; nrf_gpio_pin_set(SPI_SS_PIN); return spi_rx_buf[1]; } char* MAXbytes_rd ( uint8_t reg, uint8_t nbytes, char* data ) { spi_tx_buf[0] = reg; nrf_gpio_pin_clear(SPI_SS_PIN); nrf_drv_spi_transfer(&m_spi, spi_tx_buf, 1, spi_rx_buf, 0); spi_tx_buf[0] = 0x00; while( nbytes ) { *data = nrf_drv_spi_transfer(&m_spi, spi_tx_buf, 1, spi_rx_buf, 0); data++; nbytes--; } nrf_gpio_pin_set(SPI_SS_PIN); return( data ); } uint8_t dataOut[80]; void max3421e_writebytes(uint8_t reg, uint8_t nbytes, char* data) { nrf_gpio_pin_clear(SPI_SS_PIN); dataOut[0] = reg+0x02; nrf_drv_spi_transfer(&m_spi, dataOut, SPIWriteLength+1, spi_rx_buf, SPIReadLength); while( nbytes ) { //SPI_wr( *data ); // send the next data byte nrf_drv_spi_transfer(&m_spi, data, 1, spi_rx_buf, 0); data++; // advance the pointer nbytes--; } nrf_gpio_pin_set(SPI_SS_PIN); }
I feel something is wrong with my "max3421e_writebytes" and "MAXbytes_rd" function. Need some help on this.
Thanks & Regards,
Snehal