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?.
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
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