SPI example code for loop back is not working for TRK-KE64 board

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SPI example code for loop back is not working for TRK-KE64 board

1,331 Views
punithb
Contributor I

void serial_flash_init(void)

{

  SIM->SCGC |= SIM_SCGC_SPI0_MASK;

    CONFIG_PIN_AS_GPIO(PTB,SPI0_CS,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTB,SPI0_MOSI,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTB,SPI0_SCK,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTB,SPI0_MISO,INPUT);

    ENABLE_INPUT(PTB,SPI0_MISO);

    CONFIG_PIN_AS_GPIO(PTB,SPI0_CS,OUTPUT);

    OUTPUT_SET(PTB,SPI0_CS);

    SPI0_C1 |= SPI_C1_MSTR_MASK; // SPI0 master mode

    SPI0_BR = 0x00;//0x43;  //SPPR = 4, SPR = 3, bps div = (SPPR+1)*2^(SPR+1) = 80, baudrate= 24Mhz/80=300khz

    SPI0_C1 |= SPI_C1_SSOE_MASK;

    SPI0_C1 &= (~SPI_C1_CPHA_MASK);  // clock polarity

    SPI0_C1 &= (~SPI_C1_CPOL_MASK);  //clock phase

    SPI0_C1 &= (~SPI_C1_LSBFE_MASK);  // LSB:most significant

    SPI0_C1 &= (~SPI_C1_SPIE_MASK);                  //Disable RX interrrupt

    SPI0_C1 &= (~SPI_C1_SPTIE_MASK);         //Disable the transmit interrupt

    SPI0_C2 |= SPI_C2_MODFEN_MASK;

    SPI0_C1 |= SPI_C1_SPE_MASK;  // enable SPI module

}

uint8_t hal_spi_transfer_one_byte(uint8_t v)

{

   int dummy =0;

   char buff=0;

   while ((SPI0_S & SPI_S_SPTEF_MASK) == 0)  // wait for transmit buffer empty

   {

                dummy++;

   }

   dummy = SPI0_S;

   SPI0_D = v;   // send one byte to transmit buffer

   while ((SPI0_S & SPI_S_SPRF_MASK) == 0); // wait ready buffer full

   buff = SPI0_D;  // read one received byte

   return buff;         // return the received byte

}

void hal_spi_transfer_start()

{

  OUTPUT_CLEAR(PTB,SPI0_CS);

}

void hal_spi_transfer_stop()

{

  OUTPUT_SET(PTB,SPI0_CS);

}

int main()

{

serial_flash_init();

for(;;)

{

hal_spi_transfer_start();

  buff=hal_spi_transfer_one_byte(0xAA);

  if(buff==0xAA || buff==0x55)

  {

  LED3_ON;

  }

  hal_spi_transfer_stop();

  LED2_ON;

}

}

But LED3 is not on, i probed clock pin and mosi and miso , all are ok .

Could any one tell what may be the issue?.

0 Kudos
Reply
3 Replies

953 Views
punithb
Contributor I

Could any one tell the sampling code for SPI, i want to test loop back method.

Here what i did.

#define SPI0_SCK  PTE0

#define SPI0_MOSI PTE1

#define SPI0_MISO PTE2

#define SPI0_CS  PTE3

void serial_flash_init(void)

{

   SIM->PINSEL|=SIM_SCGC_SPI0_MASK;

    SIM->SCGC |= SIM_SCGC_SPI0_MASK;

  

    CONFIG_PIN_AS_GPIO(PTE,SPI0_CS,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTE,SPI0_MOSI,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTE,SPI0_SCK,OUTPUT);

    CONFIG_PIN_AS_GPIO(PTE,SPI0_MISO,INPUT);

    ENABLE_INPUT(PTE,SPI0_MISO);

    //ENABLE_PULLUP(PTE,SPI0_MISO);

    CONFIG_PIN_AS_GPIO(PTE,SPI0_CS,OUTPUT);

    OUTPUT_SET(PTE,SPI0_CS);

    SPI0_C1 = 0x54;

    SPI0_C2 =0x80;

    SPI0_BR = 0x00;

}

uint8_t hal_spi_transfer_one_byte(uint8_t v)

{

   int dummy =0;

   char buff=0;

   while ((SPI0_S & SPI_S_SPTEF_MASK) == 0)  // wait for transmit buffer empty

   {

                dummy++;

   }

   dummy = SPI0_S;

   SPI0_D =v;   // send one byte to transmit buffer

   while ((SPI0_S & SPI_S_SPRF_MASK) == 0); // wait ready buffer full

   buff = SPI0_D;  // read one received byte

   return buff;         // return the received byte

}

void hal_spi_transfer_start()

{

  OUTPUT_CLEAR(PTE,SPI0_CS);

}

void hal_spi_transfer_stop()

{

  OUTPUT_SET(PTE,SPI0_CS);

}

int main()

{

  uint8_t buff;

  Clk_Init(); /* Configure clocks to run at 20 Mhz, TRK board does not include XTAL */

  GPIO_Init(); /* Configure button pins as inputs and LED pins as outputs */

serial_flash_init();

  while(1)

    {

                 hal_spi_transfer_start();

                 buff=hal_spi_transfer_one_byte(0xAA);

                 if(buff==0xAA || buff==0x55)

                 {

                           LED3_ON;

                 }

                 if(buff==0xFF)

                 {

                           LED2_ON;

                  }

                 if( buff==0x00)

                 {

                      LED1_ON;

                 }

                 hal_spi_transfer_stop();

     }

}

But i am not able to write 0xAA in to SPIO_D register , it is taking only 0xFF. i checked debug also , it is always updating with 0xFF instead of 0xAA.

Could any one tell me what is wrong in my code. I dont want to use PE generated code. i need to know what is problem in my code.

Kindly let me know the problem.

Regards

punith

0 Kudos
Reply

953 Views
punithb
Contributor I

Can any one please address this issue?.

0 Kudos
Reply

953 Views
david_diaz
NXP Employee
NXP Employee

Hello,

You can find attached to this response a simple SPI application (SPI.c/h).

The project is intended for the KEA128.

Please refer to chapter 29 from the Reference manual at:

http://www.freescale.com/files/microcontrollers/doc/ref_manual/KEA64RM.pdf

Please let me know if this material is useful for you.

Have an excellent day.

David

0 Kudos
Reply