1、初始化spi时钟
1 void spiRccinit(void) 2 { 3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 4 5 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 6 7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 8 }
2、配置spi的GPIO引脚
1 void spiGPIOInit(void) 2 { 3 GPIO_InitTypeDef gpio_init; 4 gpio_init.GPIO_Pin = GPIO_Pin_4; //片选 5 gpio_init.GPIO_Speed = GPIO_Speed_50MHz; 6 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP; 7 GPIO_Init(GPIOA, &gpio_init); 8 9 gpio_init.GPIO_Pin = GPIO_Pin_5; //时钟 10 gpio_init.GPIO_Mode = GPIO_Mode_AF_PP; 11 GPIO_Init(GPIOA, &gpio_init); 12 13 gpio_init.GPIO_Pin = GPIO_Pin_7; //MOSI 14 GPIO_Init(GPIOA, &gpio_init); 15 16 gpio_init.GPIO_Pin = GPIO_Pin_6; //MISO 17 GPIO_Init(GPIOA, &gpio_init); 18 }
3、配置并使能spi
1 void spiConfigure(void) 2 { 3 SPI_InitTypeDef spi_Init; 4 spi_Init.SPI_CPHA = SPI_CPHA_2Edge; 5 spi_Init.SPI_CPOL = SPI_CPOL_Low; 6 spi_Init.SPI_DataSize = SPI_DataSize_8b; 7 spi_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 8 spi_Init.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 9 spi_Init.SPI_FirstBit = SPI_FirstBit_MSB; 10 spi_Init.SPI_Mode = SPI_Mode_Master; 11 spi_Init.SPI_NSS = SPI_NSS_Soft; 12 spi_Init.SPI_CRCPolynomial = 7; 13 14 SPI_Init(SPI1, &spi_Init); 15 SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE); 16 SPI_Cmd(SPI1,ENABLE); 17 }
4、配置spi中断
1 void spiNivcConfiguration(void) 2 { 3 NVIC_InitTypeDef nvic_init; 4 5 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 6 nvic_init.NVIC_IRQChannel = SPI1_IRQn; 7 nvic_init.NVIC_IRQChannelPreemptionPriority = 2; 8 nvic_init.NVIC_IRQChannelSubPriority = 1; 9 nvic_init.NVIC_IRQChannelCmd = ENABLE; 10 11 NVIC_Init(&nvic_init); 12 }
5、实现中断处理函数
1 void SPI1_IRQHandler(void) 2 { 3 if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != RESET) 4 { 5 if(send[++sendCount] != '