bsp_spi.c程序如下:
#include "bsp_spi.h"
long spi2_lost;
- // 初始化SPI对应IO引脚
- void SPI_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- SPI_InitTypeDef SPI_InitStruct;
- RCC_AHBPeriphClockCmd(SPI_RCC, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
- // 初始化GPIO引脚
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStruct.GPIO_Pin = SPI_CLK_PIN | SPI_MOSI_PIN | SPI_MISO_PIN;
- GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
- GPIO_Init(SPI_GPIOx, &GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = SPI_NSS_PIN;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_Init(SPI_GPIOx, &GPIO_InitStruct);
- // 配置GPIO复用
- GPIO_PinAFConfig(SPI_GPIOx, GPIO_PinSource13, GPIO_AF_0); // PB13:CLK
- GPIO_PinAFConfig(SPI_GPIOx, GPIO_PinSource14, GPIO_AF_0); // PB14:MISO
- GPIO_PinAFConfig(SPI_GPIOx, GPIO_PinSource15, GPIO_AF_0); // PB15:MOSI
- SPI_Cmd(SPI2, DISABLE); // 失能SPI
- SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 选择SPI单向或双向数据模式
- SPI_InitStruct.SPI_Mode = SPI_Mode_Master; // 选择SPI主机/从机模式
- SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // 选择SPI数据宽度
- SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // 选择时钟极性
- SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // 选择时钟相位
- SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // 选择NSS信号管理方式
- SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 波特率选择
- SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; // 选择数据传输开始方向
- SPI_InitStruct.SPI_CRCPolynomial = 7; // CRC计算多项式
- SPI_Init(SPI2, &SPI_InitStruct);
- SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF); // 配置FIFO阈值
- SPI_Cmd(SPI2, ENABLE); // 使能SPI
- }
- // SPI2读写一个字节
- uint8_t SPI2_ReadWriteByte(uint8_t Data)
- {
- uint8_t retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) { if(retry++>200) { spi2_lost++; return 0xFF;} } // 发送缓存标志位为空
- SPI_SendData8(SPI2, Data); // 通过外设SPI2发送一个数据
- retry=0;
- while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) { if(retry++>200) { spi2_lost++; return 0xFF;} } //接收缓存标志位不为空
- return SPI_ReceiveData8(SPI2); // 通过SPI2返回接收数据
- }
复制代码
bsp_spi.h程序如下:
- #ifndef _BSP_SPI_H_
- #define _BSP_SPI_H_
- #include "stm32f0xx.h"
- #define SPI_RCC RCC_AHBPeriph_GPIOB
- #define SPI_GPIOx GPIOB
- #define SPI_NSS_PIN GPIO_Pin_12
- #define SPI_CLK_PIN GPIO_Pin_13
- #define SPI_MISO_PIN GPIO_Pin_14
- #define SPI_MOSI_PIN GPIO_Pin_15
- #define SPI2_CS_ENABLE GPIO_ResetBits(SPI_GPIOx, SPI_NSS_PIN)
- #define SPI2_CS_DISABLE GPIO_SetBits(SPI_GPIOx, SPI_NSS_PIN)
- void SPI_GPIO_Init(void);
- uint8_t SPI2_ReadWriteByte(uint8_t Data);
- #endif
复制代码
|