This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2530: cc2530 SPI Read and Write Support

Part Number: CC2530

Hello,

This is my first SPI connection and I have a trouble with my code. I can send and read data from the accelerometer adxl345, when a try to read the register 0x00, i expected 0xE5 but i receive 0xF2, i am using spi 4 wire connection, the SCLK work fine but i can't read correctly. I am using the below code: 

#include "spi.h"

/**************************************************************************************************
 *                                           MACROS
 **************************************************************************************************/

#define XNV_SPI_BEGIN() st(P1_3 = 0;)
#define XNV_SPI_TX(x) st(U1CSR &= ~0x02; U1DBUF = (x);)
#define XNV_SPI_RX() U1DBUF
#define XNV_SPI_WAIT_RXRDY() st(while (!(U1CSR & 0x02));)
#define XNV_SPI_END() st(P1_3 = 1;)


// The TI reference design uses UART1 Alt. 2 in SPI mode.
#define XNV_SPI_INIT() \
st( \
  /* Mode select UART1 SPI Mode as master. */\
  U1CSR = 0; \
  \
  /* Setup for 115200 baud. */\
  U1GCR = 11; \
  U1BAUD = 216; \
  \
  /* Set bit order to MSB */\
  U1GCR |= BV(5); \
  \
  /* Set UART1 I/O to alternate 2 location on P1 pins. */\
  PERCFG |= 0x02;  /* U1CFG */\
  \
  /* Select peripheral function on I/O pins but SS is left as GPIO for separate control. */\
  P1SEL |= 0xE0;  /* SELP1_[7:4] */\
  /* P1.1,2,3: reset, LCD CS, XNV CS. */\
  P1SEL &= ~0x0E; \
  P1 |= 0x0E; \
  P1_1 = 0; \
  P1DIR |= 0x0E; \
  \
  /* Give UART1 priority over Timer3. */\
  P2SEL &= ~0x20;  /* PRI2P1 */\
  \
  /* When SPI config is complete, enable it. */\
  U1CSR |= 0x40; \
  /* Release XNV reset. */\
  P1_1 = 1; \
)

void halMasterSpiInit(void)
{
  XNV_SPI_INIT();
}// halMasterSpiInit


uint8 higherbyte;
uint8 lowerbyte;
uint8 spiRead(uint8 addr)
{
    uint8 data = 0;

    XNV_SPI_BEGIN(); // begin transmission

    XNV_SPI_TX(addr); // send addr 
    for(uint8 i = 0; i < 4 ; i++) {
      XNV_SPI_WAIT_RXRDY(); //wait till received byte is ready

      higherbyte = XNV_SPI_RX(); // copy received byte

      XNV_SPI_WAIT_RXRDY(); //wait till received byte is ready

      lowerbyte = XNV_SPI_RX(); // copy received byte
    }
    XNV_SPI_END(); // End transmission
    
    data = higherbyte; 
    return (data);
}


// Transmit code

void spiWrite(uint8 addr,uint8 higherbyte/*![0], uint8 lowerbyte*/)
{
    XNV_SPI_BEGIN(); // begin transmission

    XNV_SPI_TX(addr); // send addr 

    XNV_SPI_TX(higherbyte); //send higher byte

    //![0]XNV_SPI_TX(lowerbyte); //send lower byte 

    XNV_SPI_END(); // End transmission
}

The yellow signal is the SCLK and the blue signal is the MISO 


Please any help and thanks a lot,

Best Regards

  • Hello Arturo,

    This most likely has to do with the SPI clock polarity (default negative) and phase (default first edge). With this configuration the given screenshot would definitely be read as 0xF2. However the ADXL345 is most likely expecting the inverse setting of both, you can try altering UxGCR to see if this solves the issue.

    Regards,
    Ryan
  • Thank a lot Ryan,

    I knew nothing about this detail!

    Best Regards