6.8.2 SPI****初始化配置
首先看一下SPI外设的初始化结构体成员及其描述。
1、SPI_Dirention 设置了SPI是单向通信还是双向的通信数据模式,设置参数如表6-3所示。
2、SPI_Mode设置了SPI 设备是工作在主机模式还是从机模式,设置参数如表6-4所示。
3、SPI_DataSize设置了SPI通信时数据帧是8位还是16位,没有特殊要求,通常配置为8位模式,设置参数如表6-5所示。
4、SPI_CPOL设置了SPI串行时钟SCK的时钟极性,选择该参数时需要确保SPI通信双方保持一致,一般根据SPI从设备支持的模式设定,设置参数如表6-6所示
5、SPI_CPHA设置了SPI采样时发生在SCK的哪个边沿,该参数同样需要确保通信双方保持一致,一般也是根据从设备支持的模式设定,设置参数如表6-7所示
6、SPI_NSS设置了NSS片选引脚是由选择硬件模式,还是由软件模式。采用硬件管理时,片选信号由SPI硬件自动产生,不需要手动设置,而软件模式需要手动设置片选引脚电平。实际开发中通常设置为软件模式,即使用普通IO口作为片选引脚。设置参数如表6-8所示
7、SPI_BaudRatePrescaler设置了SPI波特率预分频系数,分频后的时钟就是SCK信号线的时钟频率。注意SPI正在通信时不能更改波特率预分频系数,具体设置参数如表6-9所示
8、SPI_FirstBit设置了数据传输是高位在前(MSB先行)还是低位在前(LSB先行),没有特殊要求一般设置为高位在前(MSB先行)设置参数如表6-10所示。
9、SPI_CRCPolynomial设置是否使用CRC校验。使用时根据需求设置CRC多项式,不使用时设置其值为7(复位值为0x0007,默认不使用)。无特殊要求通常不设置CRC校验。
SPI配置流程:
1、使能SPI外设时钟及SPI接口引脚时钟
2、初始化SPI引脚——初始化NSS、SCK、MISO、MOSI引脚。
3、初始化SPI外设——根据需求设置SPI初始化结构体成员参数
4、使能SPI外设——SPI使能库函数为:SPI_Cmd(SPIx, ENABLE);其中SPIx,x为1、
2、3,用来选择SPI外设。
5、编写SPI数据发送和接收函数
6.8.3 SPI数据发送和接收
SPI数据发送和接收过程与USART类似,由数据缓冲区和一个8位的双向移位寄存器构成。SPI的数据缓冲区叫做数据寄存器(SPI_DR),虽然是一个寄存器,但是实质上包含两个缓冲区:发送缓冲和接收缓冲,分别用于进行写操作和读操作。与USART两个单独的移位寄存器不同,SPI只有一个移位寄存器且是双向的,同一时刻既向MOSI上移出要发送的数据,又将MISO上的数据向内移入,这个过程是同步的,SPI传输结构如图6-11所示。
图6-11 SPI数据传输结构图
SPI发送数据时只需要将数据写入到SPI_DR,SPI会自动将其分配到发送缓冲区,然后再将数据从发送缓冲区并行传送到移位寄存器中,同时设置一个发送缓冲区为空(TXE)的标志位,最后数据按照设定的数据格式(MSB或LSB)被串行的从MOSI引脚移出。与此同时MISO引脚也会接收到数据,接收到的数据同样按照相应的格式被串行的移入到移位寄存器,当接收完一帧数据后,移位寄存器将接收到的数据传送到接收缓冲区中,同时会设置一个接收缓冲区非空(RXNE)的标志位。使用SPI发送和接收数据时并不需要关心数据是怎么发送或者接收到的,只需要检测相应标志位后向数据寄存器(SPI_DR)写入要发送的数据或者读出接收到的数据即可。
TXE标志位被置位仅表示发送缓冲区为空,可以继续向SPI_DR写入数据,但并不代表数据发送完成,这一点一定要搞清楚。向发送缓冲区写入数据会清除TXE标志位,如果TXE=0即发生缓冲区非空时,向SPI_DR中写入数据会覆盖发送缓冲区中的数据,但不会影响移位寄存器中的数据。RXNE=1表示接收缓冲区非空,即已经接收到一帧数据。读SPI_DR寄存器硬件会自动清除RXNE标志位,并返回接收到的数据。当SPI接收到一帧数据时,意味着SPI肯定已经发送完一帧数据,因此判断一帧数据是否发送完成,可以通过检测RXNE标志位。如果设置了SPI_CR1寄存器中的TXEIE位或者SPI_CR2寄存器中的RXNEIE位,将产生对应的中断。本文主要是以查询方式介绍SPI如何收发数据。
使用查询方式检测TXE和RXNE标志位时需要用到SPI标志位检测函数,如下所示:
SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);其中SPIx中x为1、2、3,用来选择SPI外设;SPI_I2S_FLAG为被检测的标志位,如表6-11所示。
同时库函数中也有对应的SPI数据发送和接收函数,分别为:(固件库手册中所示的发送和接收函数有误,实际以本文为准)
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);//SPI发送函数
SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);//SPI接收函数
SPI使用查询方式发送和接收数据时,在发送和接收数据之前需要检测相应标志位,然后再调用库函数发送或者接收数据,这样操作虽然方便,但是由于函数相互调用会占用时间,当传输数据量较大时会降低SPI整体传输效率。为了提高SPI的整体传输效率,本文采用寄存器方式操作。另外SPI在接收从机数据时,由于从机自身不产生时钟信号(SCK),通信时需要主机提供SCK以启动数据传输,因此主机需要通过发送的数据来提供SCK并接收从机的数据,发送的数据并不生效。
以下是配置SPI2为主模式,8位数据格式,CPOL=1,CPHA=1,波特率2分频,MSB先行,不使用CRC校验,使用时可根据具体要求进行修改。由于SPI外设挂载了多个从机设备,为了方便移植,初始化SPI时并未设置片选引脚,而是选择将片选引脚与SPI从设备放在一起配置,具体代码如下:
96.9 SPI读写W25Q128
6.9.1 W25Q128****简介
Flash是一种掉电不丢数据的非易失存储设备,生活中常见的闪存存储设备包块固态硬盘、U盘、SD卡以及单片机内部的存储设备等。Flash具有存储空间更大,读取速率快、可靠性高等特点。本节所要介绍的W25Q128就是Flash的一种,只不过它是以芯片的形式存在。 W25Q128是华邦公司推出的一款SPI接口的NOR Flash芯片,其存储空间为128Mbit,相当于16M字节。W25Q128可以支持SPI的模式0和模式3,也就是CPOL=0/CPHA=0和CPOL=1/CPHA=1这两种模式。
往Flash写入数据时,需要注意以下两个重要问题:
1、Flash写入数据时和EEPROM类似,不能跨页写入,一次最多写入一页,W25Q128的一页是256字节。写入数据一旦跨页,必须在写满上一页的时候,等待Flash将数据从缓存搬移到非易失区,重新再次往里写。
2、Flash有一个特点,就是可以将1写成0,但是不能将0写成1,要想将0写成1,必须进行擦除操作。因此通常要改写某部分空间的数据,必须首先进行一定物理存储空间擦除,最小的擦除空间,通常称之为扇区,扇区擦除就是将这整个扇区每个字节全部变成0xFF。每款Flash的扇区大小不一定相同,W25Q128的一个扇区是4096字节。为了提高擦除效率,使用不同的擦除指令还可以一次性进行32K(8个扇区)、64K(16个扇区)以及整片擦除。
Kingst-32F1开发板中W25Q128对应的管脚连接关系如图6-10所示。
图6-12 W25Q128电路原理图及其引脚
6.9.2 W25Q128****读写操作
W25Q128内部有一个“SPI Command & Control Logic”,可以通过SPI接口向其发送指令,从而执行相应操作。指令的长度是不定的,有单字节的,也有多字节的,W25Qxx一共具有34个操作指令,在此只列举常用的12个,具体如表6-13所示。
-
单片机
+关注
关注
6032文章
44513浏览量
632736 -
SPI
+关注
关注
17文章
1700浏览量
91295 -
EEPROM
+关注
关注
9文章
1010浏览量
81395 -
IIC
+关注
关注
11文章
300浏览量
38269 -
uart通信
+关注
关注
0文章
19浏览量
6997
发布评论请先 登录
相关推荐
评论