AnsweredAssumed Answered

Not getting correct values from SPI_ReadData()

Question asked by Gavin Smith on Jan 5, 2017
Latest reply on Jan 9, 2017 by Kerry Zhou

Hi, trying to use the SPI for single byte read / write operations using Kinetis MKL16Z128VFM4 and sdk2.0

When using SPI_ReadData, the values seem to be one byte behind what I expect.

 

Here is my config, send and receive functions.

 

//Setup SPI for radio
spi_master_config_t config;
SPI_MasterGetDefaultConfig(&config);
config.pinMode = kSPI_SlaveSelectAsGpio;
config.baudRate_Bps = 50000;
SPI_MasterInit(SPI0, &config, CLOCK_GetFreq(kCLOCK_PllFllSelClk));
SPI_Enable (SPI0, true);

 

void SPIPut(unsigned char v)
{
volatile DWORD StatusFlags;
DWORD ulDummy;
DWORD Byte;
//ulDummy = SPI_ReadData(SPI0);
Delay10us(1);
SPI_WriteData(SPI0,v);
while (0 == (SPI_GetStatusFlags (SPI0) & kSPI_TxBufferEmptyFlag)); // wait for data to be sent.
Delay10us(1000);
ulDummy = SPI_ReadData(SPI0);
}


BYTE SPIGet(void)
{
WORD RxData;
Delay10us(100);
SPI_WriteData(SPI0,SPI_DUMMYDATA);
while (0 == (SPI_GetStatusFlags (SPI0) & kSPI_TxBufferEmptyFlag)); // wait for data to be sent.
while (0 == (SPI_GetStatusFlags (SPI0) & kSPI_RxBufferFullFlag)); // wait for data to be received.
Delay10us(1000);
RxData = SPI_ReadData(SPI0);
Delay10us(1000);
return (BYTE)(RxData);
}

 

To read a register from my slave device, i send it the register address using SPIPut, then do an SPIGet to read the register value.

when reading the registers say 0 - 5, I expect to get

0x28

0x88

0x03

0x07

0x0C

and my scope confirms that this is what is being sent.

 

but what I actually get from the SPI_ReadData function is

0x28

0x28

0x88

0x03

0x07

0x0C

So the 1st byte reads correctly, then all subsequent bytes are out by one. Its almost like there is a buffer somewhere. Any ideas what I am doing wrong?

Outcomes