This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

How to make Multiple Transmission and Single Receiver Using NRFx_SPIM Example for NRF52840-DK Board?

Hi,

I am Using NRF52840-DK Board. We are trying to transmit multiple data using NRFx_SPIM Example. for single reg read it is working fine.

please check below code is it correct or not?.

void MAX30003_Reg_Read(uint8_t Reg_address)
{
  nrfx_err_t err_code = 0;	
  uint32_t data=0xFF;
	//Prepare the tx buffer
  memset(SPI_TX_Buff, 0x00, sizeof(SPI_TX_Buff)); // Erases the buffer
  memset(SPI_RX_Buff, 0x00, sizeof(SPI_TX_Buff)); // Erases the buffer
  SPI_TX_Buff[0] = (Reg_address<<1) | 0x1; // should be SPI_TXBuff[0], I assume RREG = 0x1;
//Create the transfer descriptor
  nrfx_spim_xfer_desc_t xfer_desc4 = NRFX_SPIM_XFER_TRX(SPI_TX_Buff, sizeof(SPI_TX_Buff), SPI_RX_Buff, sizeof(SPI_TX_Buff));
	nrfx_spim_xfer_desc_t xfer_desc5 = NRFX_SPIM_XFER_TRX((data << 16), sizeof(data), SPI_RX_Buff, sizeof(data));
	nrfx_spim_xfer_desc_t xfer_desc6 = NRFX_SPIM_XFER_TRX((data << 8), sizeof(data), SPI_RX_Buff, sizeof(data));
	nrfx_spim_xfer_desc_t xfer_desc7 = NRFX_SPIM_XFER_TRX(data, sizeof(data), SPI_RX_Buff, sizeof(data));
//Initiate the transfer
  err_code = nrfx_spim_xfer(&spi, &xfer_desc4, 0);
	err_code = nrfx_spim_xfer(&spi, &xfer_desc5, 0);
	err_code = nrfx_spim_xfer(&spi, &xfer_desc6, 0);
	err_code = nrfx_spim_xfer(&spi, &xfer_desc7, 0);
  APP_ERROR_CHECK(err_code);
//  while (spi_xfer_done == true);
}

I am refer below code :

uint32_t MAX30003::readRegister(const Registers_e reg)
{
    uint32_t data = 0;
    
    m_cs = 0;
    m_spiBus.write((reg << 1) | 1);
    data |= (m_spiBus.write(0xFF) << 16);
    data |= (m_spiBus.write(0xFF) << 8);
    data |= m_spiBus.write(0xFF);
    m_cs = 1;
    
    return data;
}   

please help me for that. 

Thanks 

rohit

Parents
  • Hi,

    You are over-complicating the transfer. Just create a large enough receive buffer and to the transfer and receive in a single operation.

    Something like this should work:

    uint8_t SPI_TX_Buff;
    uint8_t SPI_RX_Buff[4];
    
    uint32_t MAX30003_Reg_Read(uint8_t Reg_address)
    {
      nrfx_err_t err_code = 0;	
      uint32_t data = 0;
    
      //Prepare the tx buffer
      memset(SPI_RX_Buff, 0x00, sizeof(SPI_RX_Buff)); // Erases the buffer
      SPI_TX_Buff = ((Reg_address << 1) | 0x01); 
    
      //Create the transfer descriptor
      nrfx_spim_xfer_desc_t xfer_desc = NRFX_SPIM_XFER_TRX(&SPI_TX_Buff, sizeof(SPI_TX_Buff), SPI_RX_Buff, sizeof(SPI_TX_Buff));
    
      //Initiate the transfer
      spi_xfer_done == false;
      err_code = nrfx_spim_xfer(&spi, &xfer_desc, 0);
      APP_ERROR_CHECK(err_code);
      
      while (spi_xfer_done == false);
      
      data |= (SPI_RX_Buff[1] << 16);
      data |= (SPI_RX_Buff[2] << 8);
      data |= SPI_RX_Buff[3];
      
      return data;
    }

    Best regards,
    Jørgen

  • Hi,

    Thanks for the suggestion,

    This is work when I make below changes:

    1) change condition from  while (spi_xfer_done == false)    to     while (spi_xfer_done == true);

    2) SPI_TX_Buff = ((Reg_address << 1) | 0x01);  to   SPI_TX_Buff[0] = ((Reg_address << 1) | 0x01); 

    May I know is it correct?

    Thanks,

    rohit

    uint8_t MAX30003_Reg_Read(uint8_t Reg_address)
    {
      nrfx_err_t err_code = 0;	
      uint32_t data;
      //Prepare the tx buffer
      memset(SPI_RX_Buff, 0x00, sizeof(SPI_RX_Buff)); // Erases the buffer
      SPI_TX_Buff[0] = ((Reg_address << 1) | 0x01); 
      //Create the transfer descriptor
      nrfx_spim_xfer_desc_t xfer_desc = NRFX_SPIM_XFER_TRX(&SPI_TX_Buff, sizeof(SPI_TX_Buff), SPI_RX_Buff, sizeof(SPI_TX_Buff));
      //Initiate the transfer
      spi_xfer_done == false;
      err_code = nrfx_spim_xfer(&spi, &xfer_desc, 0);
      APP_ERROR_CHECK(err_code);
      while (spi_xfer_done == true);
      data |= (SPI_RX_Buff[1] << 16);
      data |= (SPI_RX_Buff[2] << 8);
      data |= SPI_RX_Buff[3];
      return data;
    }

Reply
  • Hi,

    Thanks for the suggestion,

    This is work when I make below changes:

    1) change condition from  while (spi_xfer_done == false)    to     while (spi_xfer_done == true);

    2) SPI_TX_Buff = ((Reg_address << 1) | 0x01);  to   SPI_TX_Buff[0] = ((Reg_address << 1) | 0x01); 

    May I know is it correct?

    Thanks,

    rohit

    uint8_t MAX30003_Reg_Read(uint8_t Reg_address)
    {
      nrfx_err_t err_code = 0;	
      uint32_t data;
      //Prepare the tx buffer
      memset(SPI_RX_Buff, 0x00, sizeof(SPI_RX_Buff)); // Erases the buffer
      SPI_TX_Buff[0] = ((Reg_address << 1) | 0x01); 
      //Create the transfer descriptor
      nrfx_spim_xfer_desc_t xfer_desc = NRFX_SPIM_XFER_TRX(&SPI_TX_Buff, sizeof(SPI_TX_Buff), SPI_RX_Buff, sizeof(SPI_TX_Buff));
      //Initiate the transfer
      spi_xfer_done == false;
      err_code = nrfx_spim_xfer(&spi, &xfer_desc, 0);
      APP_ERROR_CHECK(err_code);
      while (spi_xfer_done == true);
      data |= (SPI_RX_Buff[1] << 16);
      data |= (SPI_RX_Buff[2] << 8);
      data |= SPI_RX_Buff[3];
      return data;
    }

Children
No Data
Related