Question
SPI 9bit FOR STM32F0
Posted on March 14, 2014 at 07:25
Hello everyone.
I'm working with STM32F0.I'm want to make 9 bits of data to be transferred via SPI. I've done the initial configuration for the SPI but it seems like the main program that I made wrong because when I check on the oscilloscope, MISO or MOSI do not have data pulse. please help me find where the mistake. thanks for your help#include ''stm32f0xx.h''
#include ''stm32f0xx_gpio.h''
#include ''stm32f0xx_rcc.h''
#include ''stm32f0xx_tim.h''
#include ''stm32f0xx_spi.h''
void mx_pinout_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIOB->BSRR |= (0x01<<
6
);
}
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction
=
SPI_Direction_2Lines_FullDuplex
;
SPI_InitStruct.SPI_Mode
=
SPI_Mode_Master
;
SPI_InitStruct.SPI_DataSize
=
SPI_DataSize_9b
;
SPI_InitStruct.SPI_CPOL
=
SPI_CPOL_Low
;
SPI_InitStruct.SPI_CPHA
=
SPI_CPHA_1Edge
;
SPI_InitStruct.SPI_NSS
=
SPI_NSS_Soft
;
SPI_InitStruct.SPI_BaudRatePrescaler
=
SPI_BaudRatePrescaler_128
; // 42000kHz/
128
=
328kHz
< 400kHz
SPI_InitStruct.SPI_FirstBit
=
SPI_FirstBit_MSB
;
SPI_InitStruct.SPI_CRCPolynomial
=
7
;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE); // enable SPI1
}
uint8_t SPI1_send(uint8_t data){
SPI1->DR = data; // write data to be transmitted to the SPI data register
while( !(SPI1->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
while( SPI1->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
return SPI1->DR; // return received data from SPI data register
}
int main(void)
{
uint8_t received_val = 0;
mx_pinout_config();
SPI_config();
while(1)
{
SPI1_send(0xAA); // transmit data
}
}