软件控制SPI片选
void MySPI_W_SS(uint8_t bitValue)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)bitValue);
}
一、硬件SPI初始化
1、开对应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
2、配置GPIO
//初始化GPIO口:其中SCK和MOSI 是由硬件外设控制的输出信号,配置为复用推挽
//MISO是硬件外设的输入信号,配置为上拉输入,SS是软件控制的输出信号,配置为通用推挽输出
GPIO_InitTypeDef GPIO_InitStructure1;
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure1);
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure1);
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure1);
3、配置SPI外设
SPI_InitTypeDef SPI_InitSturcture;
//设置SPI时钟分频:这里的时钟是SPI所挂载的总线时钟
SPI_InitSturcture.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
//配置SPI模式
//时钟相位:SPI_CPHA_1Edge:(CPHA == 0)第一个边沿开始采样;SPI_CPHA_2Edge:(CPHA == 1)第二个边沿开始采样
SPI_InitSturcture.SPI_CPHA = SPI_CPHA_1Edge;
//时钟极性:High:CPOL = 1; Low:CPOL = 0;
SPI_InitSturcture.SPI_CPOL = SPI_CPOL_Low;
SPI_InitSturcture.SPI_CRCPolynomial = 7;
//8位数据帧
SPI_InitSturcture.SPI_DataSize = SPI_DataSize_8b;
//SPI_Direction_2Lines_FullDuplex 双线全双工
//SPI_Direction_2Lines_RxOnly 双线只接收模式
//SPI_Direction_1Line_Rx 单线半双工接收模式
//SPI_Direction_1Line_Tx 单线半双工发送模式
//全双工
SPI_InitSturcture.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
//高位先行
SPI_InitSturcture.SPI_FirstBit = SPI_FirstBit_MSB;
//主模式
SPI_InitSturcture.SPI_Mode = SPI_Mode_Master;
//软件设置NSS引脚
SPI_InitSturcture.SPI_NSS = SPI_NSS_Soft;
SPI_Init(SPI1, &SPI_InitSturcture);
4、开关控制
SPI_Cmd(SPI1, ENABLE);
//默认SS输出高电平,不选择从机
MySPI_W_SS(1);
二、起始信号
void MySPI_Start(void)
{
MySPI_W_SS(0);
}
三、停止信号
void MySPI_Stop(void)
{
MySPI_W_SS(1);
}
四、交换字节
//SPI交换一个字节:W25Q64芯片支持模式0,和模式3,这里使用模式0
//这里的 RXNE 和 TXE 不需要 自己清除
uint8_t MySPI_SwapByte(uint8_t byteSend)
{
//检测发送寄存器是否为空
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);
//软件写入数据寄存器 至 SPI_DR,之后byteSend 自动转入 移位寄存器,一旦移位寄存器有数据,时序波形就会自动产生
SPI_I2S_SendData(SPI1, byteSend);
//等待RXNE出现,当RXNE 为1, 表示接收到一个字节,同时表示发送时序产生完成
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);
//读取DR
return SPI_I2S_ReceiveData(SPI1);
}
其他部分同上一章