0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文讲透SPI总线和IIC总线通信3

jf_78858299 来源:金沙滩工作室 作者:宋雪松 2023-02-13 10:41 次阅读

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
    SPI
    +关注

    关注

    17

    文章

    1700

    浏览量

    91295
  • EEPROM
    +关注

    关注

    9

    文章

    1010

    浏览量

    81395
  • IIC
    IIC
    +关注

    关注

    11

    文章

    300

    浏览量

    38269
  • uart通信
    +关注

    关注

    0

    文章

    19

    浏览量

    6997
收藏 人收藏

    评论

    相关推荐

    详解IIC总线

    IIC(Inter-Integrated Circuit)集成电路总线,它是种两线式串行通信总线,又叫I2C,使用多主从架构,由飞利浦公司
    发表于 06-07 15:38 9640次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>详解<b class='flag-5'>IIC</b><b class='flag-5'>总线</b>

    详解IIC总线

    IIC(Inter-Integrated Circuit)是个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线,属于半双工同步传输类型
    发表于 09-12 11:15 2068次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>详解<b class='flag-5'>IIC</b><b class='flag-5'>总线</b>

    SPI总线学习笔记

    SPI种全双工的串行通信总线,最早由Motorola提出,虽然应用广泛,但没有个统
    发表于 09-20 15:17 991次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>学习笔记

    IIC总线SPI总线的比较

    现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种
    发表于 09-26 09:30 2379次阅读
    <b class='flag-5'>IIC</b><b class='flag-5'>总线</b>和<b class='flag-5'>SPI</b><b class='flag-5'>总线</b>的比较

    IIC总线SPI总线通信详解

    IIC总线SPI总线通信介绍
    发表于 12-23 07:02

    串行通信中的IIC总线工作原理是什么

    串行通信中的IIC总线工作原理51本身不带IIC总线 ,使用程序模拟IIC
    发表于 12-08 07:52

    IIC总线接口学习

    在多主设备IIC 总线模式下,多个S3C2440A 微处理器可以从从属设备接收或发送串行数据。主设备S3C2440A 可以初始化和终止个基
    发表于 04-27 15:31 61次下载
    <b class='flag-5'>IIC</b><b class='flag-5'>总线</b>接口学习

    iic总线通信程序

    iic总线通信,要的人速度下载看看哦。
    发表于 03-21 13:50 30次下载

    深度解析IICSPI总线协议的区别与应用场景

    IIC vs SPI: 哪位是赢家?我们来对比IICSPI些关键点: 第
    的头像 发表于 12-22 16:48 1.9w次阅读
    深度解析<b class='flag-5'>IIC</b>和<b class='flag-5'>SPI</b><b class='flag-5'>总线</b>协议的区别与应用场景

    解读IIC总线的FPGA实现原理及过程

    本文首先介绍了IIC总线概念和IIC总线硬件结构,其次介绍了IIC总线典型应用,最后详细介绍了
    发表于 05-31 10:56 6687次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>解读<b class='flag-5'>IIC</b><b class='flag-5'>总线</b>的FPGA实现原理及过程

    IIC通信总线寻址

    IIC的使用IIC总线简介IIC通信时序IIC总线
    发表于 12-04 16:06 14次下载
    <b class='flag-5'>IIC</b><b class='flag-5'>通信</b><b class='flag-5'>总线</b>寻址

    SPI总线IIC总线通信1

    从应用上来讲,UART通信多用于板间通信,比如单片机和计算机,这个设备和另外个设备之间的通信。而IIC
    的头像 发表于 02-13 10:39 2547次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讲</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>总线</b>和<b class='flag-5'>IIC</b><b class='flag-5'>总线</b><b class='flag-5'>通信</b>1

    SPI总线IIC总线通信2

    从应用上来讲,UART通信多用于板间通信,比如单片机和计算机,这个设备和另外个设备之间的通信。而IIC
    的头像 发表于 02-13 10:40 1868次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讲</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>总线</b>和<b class='flag-5'>IIC</b><b class='flag-5'>总线</b><b class='flag-5'>通信</b>2

    SPI总线IIC总线通信4

    从应用上来讲,UART通信多用于板间通信,比如单片机和计算机,这个设备和另外个设备之间的通信。而IIC
    的头像 发表于 02-13 10:41 1715次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讲</b><b class='flag-5'>透</b><b class='flag-5'>SPI</b><b class='flag-5'>总线</b>和<b class='flag-5'>IIC</b><b class='flag-5'>总线</b><b class='flag-5'>通信</b>4

    浅谈SPI总线通信接口及其协议

    上篇内容我们介绍了IIC总线通信接口及其协议,这篇文章我们介绍另种项目开发中非常常见的通信
    的头像 发表于 03-22 16:11 1731次阅读
    浅谈<b class='flag-5'>SPI</b><b class='flag-5'>总线</b><b class='flag-5'>通信</b>接口及其协议