AnsweredAssumed Answered

SPI with FRDM K22F

Question asked by Christian Caicedo on Jan 27, 2015
Latest reply on Feb 21, 2015 by Joseph Chamdani

Hello everyone,

 

I am trying to get 2 EV boards to communicate with each other via SPI. The problem I am having is that there is really no communication happening between the boards. The signals come out fine between the Slave and Master, but when I check the receive buffer, and it is always the same value (0xff).

 

I looked at the signals in a scope, and I did notice something weird. In the slave, I am sending 0x55, which should look like 0..001010101, however In the scope I see 0...001010000. The image is attached. The Yellow line is the Master Clock, and the blue line is the Slave SDOUT.

 

If anyone could help me out sort my problem I would greatly appreciate it. Been battling to get this SPI ready for 2 days now.

 

Here is the code for the Slave:

void slave(){ uint8_t SPI_instance = 1;     // uint8_t spi_baseAddr = g_spiBaseAddr[SPI_instance];      dspi_slave_state_t mstate;      uint32_t  calculatedBaudRate;      dspi_status_t statRet;      uint8_t sendBuff[8] = {0xFF};       // save data sent to i2c slave      uint8_t receiveBuff[8] = {0xFF};    // save data received from i2c slave      uint8_t numBytes = 8;      uint32_t  instance  =  1;      uint32_t  bitCount  =  16;      int timeOut = 1000; //in uS (total 100mS)      //local variables-----------       //  declare  which  module  instance  you  want  to  use      dspi_slave_state_t  dspiSlaveState;      //  update  configs      dspi_slave_user_config_t  slaveUserConfig;          slaveUserConfig.dataConfig.clkPhase  = kDspiClockPhase_FirstEdge;          slaveUserConfig.dataConfig.clkPolarity  = kDspiClockPolarity_ActiveHigh;          slaveUserConfig.dataConfig.bitsPerFrame  =  bitCount;          slaveUserConfig.dummyPattern  =  DSPI_DEFAULT_DUMMY_PATTERN;       //initialize the operating system     OSA_Init();      printf("\r\nStarting the SPI Test...");              //PTD4 -> spi1-CS0              //PTD5 -> spi1-SCK              //PTD6 -> spi1-SOUT              //PTD7 -> SPI1-SIN              configure_spi_pins(1);      //  init  the  slave  (interrupt  driven)     DSPI_DRV_SlaveInit(instance,  &dspiSlaveState,  &slaveUserConfig);      //  Perform  the  transfer     sendBuff[0] = 0x55;     //  Blocking  call  example     statRet  =  DSPI_DRV_SlaveTransfer(instance,  //  number  of  SPI  peripheral                                         sendBuff,      //  pointer  to  transmit  buffer,  can  be  NULL                                         receiveBuff,  //  pointer  to  receive  buffer,  can  be  NULL                                         numBytes      //  size  of  receive  and  receive  data                                         ); }

 

And here is the code for the master:

void startSPITest(){      //local variables-----------      uint8_t SPI_instance = 1;     // uint8_t spi_baseAddr = g_spiBaseAddr[SPI_instance];      dspi_master_state_t mstate;      uint32_t  calculatedBaudRate;      dspi_status_t statRet;      uint8_t sendBuff[8] = {0xFF};       // save data sent to i2c slave      uint8_t receiveBuff[8] = {0xFF};    // save data received from i2c slave      uint8_t numBytes = 8;      uint32_t framesComplete = 0;      int timeOut = 100; //in uS (total 100mS)       //initialize the operating system     OSA_Init();      //  configure  the  members  of  the  user  config  //     dspi_master_user_config_t  userConfig;         userConfig.isChipSelectContinuous = false;         userConfig.isSckContinuous = false;         userConfig.pcsPolarity = kDspiPcs_ActiveLow;         userConfig.whichCtar = kDspiCtar0;         userConfig.whichPcs = kDspiPcs0;       //configure the type of device the spi will be communicating with      dspi_device_t spiDevice;          spiDevice.dataBusConfig.bitsPerFrame = 16;          spiDevice.dataBusConfig.clkPhase = kDspiClockPhase_FirstEdge;          spiDevice.dataBusConfig.clkPolarity = kDspiClockPolarity_ActiveHigh;          spiDevice.dataBusConfig.direction = kDspiMsbFirst;          spiDevice.bitsPerSec = 50000;            printf("\r\nStarting the SPI Test...");          //PTD4 -> spi1-CS0          //PTD5 -> spi1-SCK          //PTD6 -> spi1-SOUT          //PTD7 -> SPI1-SIN          configure_spi_pins(1);      #if  FSL_FEATURE_SPI_16BIT_TRANSFERS     userConfig.bitCount=  kSpi8BitMode;    //  set  only  if  SPI  module  supports  bit  count  feature     #endif     //init the spi module     DSPI_DRV_MasterInit(SPI_instance,  &mstate,  &userConfig);     //SPI_DRV_MasterInit(SPI_instance,&mstate);     DSPI_DRV_MasterConfigureBus(SPI_instance,  &spiDevice,  &calculatedBaudRate);     //SPI_DRV_MasterConfigureBus(SPI_instance,  &userConfig,  &calculatedBaudRate);      //  Perform  the  transfer     sendBuff[0] = 10;       //make a transfer using the SPI module. Only transfers 1 data word of up to 16 bits.     statRet = DSPI_DRV_MasterTransfer(SPI_instance,NULL,                             sendBuff,receiveBuff,                             numBytes); //    statRet = DSPI_DRV_MasterTransferBlocking(SPI_instance,NULL, //                                sendBuff,receiveBuff, //                                numBytes,1000);      statRet = DSPI_DRV_MasterGetTransferStatus(SPI_instance, &framesComplete);     int transfStart = 0;     while(statRet!= kStatus_DSPI_Success ){         if (transfStart == 0){printf("\r\nTransfer started...");}         transfStart = 1;         statRet = DSPI_DRV_MasterGetTransferStatus(SPI_instance, &framesComplete);      }      //de- initialize the SPI module     DSPI_DRV_MasterDeinit(SPI_instance);       if (statRet != kStatus_DSPI_Success)      {          printf("\r\nSPI communication failed, error code: %d", statRet);      }      printf("\r\n... SPI Test Concluded.");   }

Outcomes