2012-04-11 10:48 AM
Hi, I got two different devices with the microcontroler STM32F103RB which I'm trying to comunicate between them using the SPI protocol.
The element A, is the master : The element B, is the slave : When I send from A(master) to B(slave) it works fine like that, but it doens't work when I try to send form B to A. I know that B must use the time clock that gives A (SCKL) but I don't know how it should work ? I couldn't find the same example Here I attach the example code:-master (A): SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI2 RXNE interrupt */ SPI_ITConfig(SPI1, SPI_IT_RXNE, ENABLE); /* Enable SPI1 */ SPI_Cmd(SPI1, ENABLE); main{ ... while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); SPI_SendData(SPI1, '0'); ... }-slave(B): void init_spi(void){ SPI_InitTypeDef SPI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); /* Configure and enable SPI1 interrupt -------------------------------------*/ NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); /* Enable SPI1 RXNE interrupt */ SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); /* Enable SPI1 */ SPI_Cmd(SPI1, ENABLE); } void SPI1_IRQHandler(void) { /* Store SPI1 received data */ u8 temp,i; temp = SPI_I2S_ReceiveData(SPI1); if(temp==4){ if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, 'R'); }2012-04-11 11:17 AM
On the Master
while(1) { while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); SPI_SendData(SPI1, '0'); while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); SPI_SendData(SPI1, '0'); while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); SPI_SendData(SPI1, '0'); while(SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET); SPI_SendData(SPI1, 4); } Where you presumably have the RXNE interrupt code to pluck incoming data from the DR register.2012-04-11 03:34 PM
Thanks for the help, at the end I discovered that the main problem was that I had forget to set the MISO pin in the slave as output ^_^ '