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) { } }