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
Can any one please address this issue?.
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