Using the SPI component

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
DaHu_285096
Level 5
Level 5
10 likes received 250 replies posted 100 replies posted

 Till now I bitbashed the SPI. I would like to use the component but cannot see how you can read back bytes at same time as sending (in my bit-bashed code I return the received character). Here is my code. Would somone mind advising me how to set this up better. 

   

 

   

#include <project.h>

   

 

   

#define CONFIG_REG 0x01

   

 

   

uint8    RX_Buf[20];

   

uint8    RX_Bytes;

   

uint8    TX_Buf[20];

   

 

   

void SPI_Write(uint8 * buf, uint8 n){

   

    uint8 i;

   

    

   

    for(i=0;i<n;i++){

   

      SPIM_WriteTxData(buf);

   

      while(!(SPIM_ReadStatus() & SPIM_STS_TX_FIFO_EMPTY));

   

    }

   

}

   

 

   

uint8 SPI_Read(uint8 adr,uint8 n, uint8 * buf){

   

    uint8 i;

   

    

   

  SPIM_WriteTxData(adr); //Register address

   

while(!(SPIM_ReadStatus() & SPIM_STS_TX_FIFO_EMPTY)){};

   

    for(i=0;i<n;i++){

   

        SPIM_WriteTxData(0xff); //write dummy byte

   

while(!(SPIM_ReadStatus() & SPIM_STS_RX_FIFO_NOT_EMPTY)){};

   

      CyDelay(1);

   

 buf= SPIM_ReadRxData();

   

    }

   

return i;

   

}

   

 

   

int main()

   

{

   

    CyGlobalIntEnable; 

   

    SPIM_Start();

   

    

   

    for(;;)

   

    {

   

      RX_Bytes = SPI_Read(CONFIG_REG,1,RX_Buf);  //read 1 byte from Config Register and place in RX Buffer

   

    

   

      TX_Buf[0] = 'A';

   

      TX_Buf[1] = 'B';

   

      TX_Buf[2] = 'C';

   

      SPI_Write(TX_Buf,3);  //Write 3 bytes of TX buffer to SPI

   

      CyDelay(100);

   

    }

   

}

0 Likes
4 Replies
HeLi_263931
Level 8
Level 8
100 solutions authored 50 solutions authored 25 solutions authored

Each write to the SPI bus also does a read with the data on MISO. You can retrieve it after the write has finished from the RX buffer.

   

Whats important: each write also fill the RX buffer, even if the data is not meaningful. So either read the buffer data, or clear the buffer before the actual read starts.

0 Likes
DaHu_285096
Level 5
Level 5
10 likes received 250 replies posted 100 replies posted

 Do you have an example ? I understand the SPI concept but having trouble using the SPI component API in context of a real-wrld program.

   

My Bit-Bashed code was simple to use blocking code like this...

   

uint8 Write_SPI(uint8 ch){

   

// do the write and read slave bits as master bits shifted out

   

//return value

   

}

   

Then to read I would do this

   

Write_SPI(REGADR);  //register to start read

   

for(i=0;i<numbytes;i++){

   

  buf = Write_SPI(DUMMY);  //get data from each register

   

}

   

 

   

Thanks

0 Likes
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

The new F-Ram Kit comes with an SPI interface and a component that controls the SPI. Download the kit example-files and study the implementation of the example

   

 

   

Bob

0 Likes
HeLi_263931
Level 8
Level 8
100 solutions authored 50 solutions authored 25 solutions authored

There are also example programs available for all components. Right-click on the SPI Master in the components tree, "example programs".

   

In your code, you should check for the "SPI IDLE" status- the TX FIFO is empty as soon as the last byte is placed into the SPI TX register - but then it takes a while to be send. Doing that you can easily create your own, blocking, SPI_Write() and SPI_Read() functions.

0 Likes