【总结】SPI

概要

SPI,Serial Peripheral interface,串行外围设备接口。是一种串行,全双工,同步的通信总写。
常用的SPI接口外设有,EEPROM,FLASH,RTC,ADC ,数字信号处理器,数字信号解码器等。

SPI接口外设通信流程

【总结】SPI_第1张图片

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;                //返回收到的数据                   
}

【总结】SPI_第2张图片

操作方法

  1. 使能芯片
  2. 发送命令
  3. 发送地址
  4. 读写数据

以读取指定地址数据为例

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;i0XFF);   //循环读数  
    }
    W25QXX_CS=1;                              
} 

W25X FLASH芯片的命令定义如下

【总结】SPI_第3张图片

参考

STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)

你可能感兴趣的:(STM32F4)