//SPI配置
MISO主设备数据输入,从设备数据输出
MOSI主设备数据输出,从设备数据输入
SCLK时钟信号,由主设备产生
CS从设备片选信号,由主设备控制
3.使能SPI
SPI_Cmd(SPIx,ENABLE);
MISO主设备数据输入,从设备数据输出
MOSI主设备数据输出,从设备数据输入
SCLK时钟信号,由主设备产生
CS从设备片选信号,由主设备控制
1.配置相关引脚的复用功能,使能SPI时钟(APB1)
2.初始化SPI,设置SPI工作模式
void SPI_Init(SPI_TypeDef*SPIx,SPI_InitTypeDef* SPI_InitStruct);
typedef struct
{
uint16_t SPI_Direction; //通讯方式,半双工,全双工,串行收和发
uint16_t SPI_Mode; //主从模式
uint16_t SPI_DataSize; //帧格式选项
uint16_t SPI_CPOL; //时钟极性
uint16_t SPI_CPHA; //时钟相位
uint16_t SPI_NSS; //nss信号控制,软件还是硬件
uint16_t SPI_BaudRatePrescaler; //波特率预分频值
uint16_t SPI_FirstBit; //MSB和LSB的前后
uint16_t SPI_CRCPolynomial; //CRC校验多项式
}SPI_InitTypeDef;
///
void SPI_Init(SPI_TypeDef*SPIx,SPI_InitTypeDef* SPI_InitStruct);
typedef struct
{
uint16_t SPI_Direction; //通讯方式,半双工,全双工,串行收和发
uint16_t SPI_Mode; //主从模式
uint16_t SPI_DataSize; //帧格式选项
uint16_t SPI_CPOL; //时钟极性
uint16_t SPI_CPHA; //时钟相位
uint16_t SPI_NSS; //nss信号控制,软件还是硬件
uint16_t SPI_BaudRatePrescaler; //波特率预分频值
uint16_t SPI_FirstBit; //MSB和LSB的前后
uint16_t SPI_CRCPolynomial; //CRC校验多项式
}SPI_InitTypeDef;
///
格式
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主机
SPI_InitStructure.SPI_DateSize=SPI_DataSize_8b; //8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge; //第二个跳变沿数据被采样
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //NSS信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescale=SPI_BaudRatePrescaler_256; //预分频256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial=7; //crc值计算的多项式
//片子复位后,该位的值默认为0x07,因此将其设为7。
SPI_Init(SPI,&SPI_InitStructure);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //主机
SPI_InitStructure.SPI_DateSize=SPI_DataSize_8b; //8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High; //串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge; //第二个跳变沿数据被采样
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //NSS信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescale=SPI_BaudRatePrescaler_256; //预分频256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial=7; //crc值计算的多项式
//片子复位后,该位的值默认为0x07,因此将其设为7。
SPI_Init(SPI,&SPI_InitStructure);
3.使能SPI
SPI_Cmd(SPIx,ENABLE);
4.SPI传输数据
void SPI_I2S_SendData(SPI_TypeDef* SPIx,uint16_t Data); //发送
UINT16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); //读出数据
void SPI_I2S_SendData(SPI_TypeDef* SPIx,uint16_t Data); //发送
UINT16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); //读出数据
5.查看SPI传输状态
SPI-I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE); //判断发送是否完成
SPI-I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE); //判断发送是否完成