This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

SPI Slave is receiving Garbage values.

I have configured my STM32F407 Discovery Board as slave with a STM8S00 . The data sent by Master on MOSI is totally different from that which that my slave is receiving I have observed that data on the Digital Oscilloscope. Setting in the master is as follows: CPHA=1 CPOL=1 Master sends at Negative edge and samples at positive edge. SPI Clock is 4 MHz. It is also sending back different data that sent by a STM32F407 Master.
Example of Data:
Actual Data Sent By Master: (MSB First) Observed on Digital Oscilloscope
0000 0111 -> 1110 0000 (0xE0 Expected to be received)
0101 0000 -> 0000 1010 (0x0A)
0000 1000 -> 0001 0000 (0x10)
1010 0101 -> 1010 0101 (0xA5)

But Slave is providing following Data: (I don't know which Byte correspond to that sent by Master)
0100 1011 (0x4B)
0000 1111 (0xF)
1010 0000 (0xA0)
0001 0001 (0X11)

Here is the code of main file:

#include "stm32f4_discovery.h"
int i=0, IT_St=0;
int Rx_Buf[1000];

void SPI_TR(void);;

void SPI_TR(void)
{
        GPIO_InitTypeDef GPIO_SPI;
        SPI_InitTypeDef My_SPI;
        NVIC_InitTypeDef nvic;
        EXTI_InitTypeDef itr;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

        //PA4=NSS  PA5=SCK  PA6=MISO  PA7=MOSI
        GPIO_SPI.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5 |  GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_SPI.GPIO_Mode=GPIO_Mode_AF;
        GPIO_SPI.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_SPI.GPIO_OType=GPIO_OType_PP ;
        GPIO_SPI.GPIO_Speed=GPIO_Speed_100MHz;
        GPIO_Init(GPIOA, &GPIO_SPI);

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

        SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        nvic.NVIC_IRQChannel=SPI1_IRQn;
        nvic.NVIC_IRQChannelCmd = ENABLE;
        nvic.NVIC_IRQChannelPreemptionPriority= 0;
        NVIC_Init(&nvic);

        My_SPI.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        My_SPI.SPI_Mode = SPI_Mode_Slave;
        My_SPI.SPI_DataSize = SPI_DataSize_8b;
        My_SPI.SPI_CPOL = SPI_CPOL_High;
        My_SPI.SPI_CPHA = SPI_CPHA_2Edge;
        My_SPI.SPI_NSS = SPI_NSS_Hard; // Configure it make high to low transition
        //My_SPI.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
        My_SPI.SPI_FirstBit = SPI_FirstBit_MSB;

        SPI_Init(SPI1, &My_SPI);
        SPI_Cmd(SPI1, ENABLE);
}
void SPI1_IRQHandler()
{
        Rx_Buf[i]=SPI_I2S_ReceiveData(SPI1);
  //i=SPI_I2S_ReceiveData(SPI1);
        SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_RXNE);
        SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
        SPI_I2S_SendData(SPI1, FIFO_STATUS_RX_FULL);
        i++;
        if(i>=1000)
                i=0;

}

int main(void)
{
        SPI_TR();
        while(1)
        {

        }

}

0