概要
SPI,Serial Peripheral interface,串行外围设备接口。是一种串行,全双工,同步的通信总写。
常用的SPI接口外设有,EEPROM,FLASH,RTC,ADC ,数字信号处理器,数字信号解码器等。
SPI接口外设通信流程
SPI的4根管脚定义
MISO:主设备数据输入,从设备数据输出
MOSI:主设备数据输出,从设备数据输入
SCLK:时钟信号,主设备产生
CS:从设备片选信号由主设备控制
SPI主从设备数据的交换是同时进行的。例如,主设备一位寄存器中的数据位01010101,从设备移位寄存器中的数据位10101010,每经过一个脉冲,从设备把最低位【1】通过MISO移入主设备的移位寄存器最低位上,其他位右移,同时,主设备原移位寄存器中的最高位通过MOSI移入从设备的最高位,其他位左移。
因此,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节,同理,若主机要读取从机的一个字节,必须向从机发送一个空字节引发从机的传输。
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
while((SPI1->SR&1<<1)==0); //等待发送区空
SPI1->DR=TxData; //发送一个byte
while((SPI1->SR&1<<0)==0); //等待接收完一个byte
return SPI1->DR; //返回收到的数据
}
操作方法
- 使能芯片
- 发送命令
- 发送地址
- 读写数据
以读取指定地址数据为例
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
W25QXX_CS=0; //使能器件
SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令
SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址
SPI1_ReadWriteByte((u8)((ReadAddr)>>8));
SPI1_ReadWriteByte((u8)ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
pBuffer[i]=SPI1_ReadWriteByte(0XFF); //循环读数
}
W25QXX_CS=1;
}
W25X FLASH芯片的命令定义如下
参考
STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)