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."); }