stm32----spi

一、SPI协议的介绍
SPI协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral
Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、 LCD等设备与MCU间,要求通讯速率较高的场合。
在这里插入图片描述SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

SDO – 主设备数据输出,从设备数据输入 对应MOSI master output slave input
SDI – 主设备数据输入,从设备数据输出 对应MISO master input slave output
SCLK – 时钟信号,由主设备产生
CS – 从设备使能信号,由主设备控制

CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。

在这里插入图片描述SPI全双工的特点:一边发送一边接收,硬件上只有一个SPI_DR寄存器和两个缓冲器(发送缓冲器和接收缓冲器),主模式:SPI_DR会先从发送缓冲器读出数据,然后通过MOSI引脚一位一位地将数据发出去,在发送的过程中,SPI_DR的数据会左移(如果是高位先发送),并且会从MISO引脚读入数据填补SPI_DR左移后的空缺。传输8比特数据后,SPI_DR再把数据并行写入接收缓冲寄存器。

2 SPI的通信接口
MISO :主设备数据输入,从设备数据输出。
MOSI :主设备数据输出,从设备数据输入。
SCLK : 时钟信号,由主设备产生。
CS : 从设备片选信号,由主设备控制。当从设备的片选被拉低的时候,才能从SPI总线上获取数据信息。
这里需要知道的地方是,根据SPI被配置成主或者从模式,MIMO和MOSI引脚的功能会自动改变,实现发送和接收的切换。

二、SPI物理层的特点
1、NSS:当有多个SPI从设备与SPI主机相连时,设备的其他信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,本信号线独占主机的一个引脚,I2C协议中通过设备地址来寻址、选中总线上的某个地址并与其进行通信;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设备为低电平,该从设备即被选中,即片选有效,主机便可开始与被选中的从
设备进行SPI通信。所以SPI通信以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。
2、SCK(Serial Clock):时钟信号线,用于通信数据同步。它由通信主机产生,决定了通信的速率。不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为f/2,通信速率受限于低速设备。
3、MOSI(Master Output , Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
4、MISO(Master Iutput , Slave Onput):主设备输入/从设备输出引脚。主机从从这条信号线读入数据,从机的数据由这条信号线输出到主机,即这条线上数据的方向为从机到到机。
5、这是一个主机的通信时序。NSS、SCK、MOSI信号都由主机控制产生,而MSIO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期,MOSI与MISO传输一位数据。

三、SPI的协议层
SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同
步等环节。

四、编程要点
①、初始化通信使用的目标引脚及端口时钟;
②、使能SPI外设的时钟;
③、配置SPI外设的模式、地址、速率等参数并使能SPI外设;
④、编写基本SPI按字节收发的函数;
⑤、编写对Flash擦除及读写操作的函数;
⑥、编写测试程序,对读写进行校验。

五、重要的函数
SPI初始化结构体详解
typedef struct
{
uint16_t SPI_Direction; //设置SPI的单双向模式

uint16_t SPI_Mode; //设置SPI的主/从机端模式

uint16_t SPI_DataSize; //设置SPI的数据帧长度,可选8位或16位

uint16_t SPI_CPOL; //设置时钟极性CPOL,可选高或低电平

uint16_t SPI_CPHA; //设置时钟相位,可选奇或偶数边沿采样

uint16_t SPI_NSS; //设置NSS引脚由SPI硬件控制还是软件控制

uint16_t SPI_BaudRatePrescaler; //设置时钟分频因子,fpclk/分频数 = fSCK

uint16_t SPI_FirstBit; //设置MSB/LSB先行

uint16_t SPI_CRCPolynomial; //设置CRC校验的表达式
}SPI_InitTypeDef;

SPI 初始化
void SPI_FLASH_Init(void);
读取ID号
uint32_t SPI_Read_ID(void);
FLASH写入使能
void SPI_Write_Enable(void)
擦除FLASH指定扇区
void SPI_Erase_Sector(uint32_t addr);
读取FLASH的内容
void SPI_Read_Data(uint32_t addr,uint8_t *readBuff,uint32_t numByteToRead);
向FLASH写入内容
void SPI_Write_Data(uint32_t addr,uint8_t *writeBuff,uint32_t numByteToWrite);
等待FLASH内部时序操作完成
void SPI_WaitForWriteEnd(void);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值