当前位置: 首页 > article >正文

STM32之硬件SPI

在这里插入图片描述
SPI1和SPI2挂载的总线不一样,SPI1的时钟频率的比SPI2的大一倍。在这里插入图片描述
核心部分是移位寄存器,数据一位一位的移到MOSI,同理,移位寄存器也一位一位的从MISO接收数据,LSBFIRST控制位控制高位先行还是低位先行。移位寄存器左边交叉箭头是STM32作为从机的电路,接收缓冲区RDR和发送缓冲区TDR,RDR读出,TDR写入。
具体流程就是:
如果我们需要连续发送一批数据,第一个数据写入TDR,当移位寄存器没有数据移位时,TDR的数据就会立刻转入移位寄存器,开始移位,转入时会置状态寄存器的TXE为1,表示发送寄存器空,当我们检查发送寄存器空的时候,下一个数据就可以提前写入TDR等待,一旦上一个数据发完,下一个数据就可以立刻跟进,实现不间断的连续传输,然后移位寄存器这里,一旦有数据过来了,他就会自动产生时钟,将数据移出去,在移出去的过程中,MISO的数据也会移入,一旦数据移出完成,数据移入也就完成,此时移入的数据就会整体的从移位寄存器转入到接收缓冲区RDR,这个时刻会置状态寄存器的RXNE为1,表示接收寄存器非空,当我们检查RXNE置1后,就要尽快的把数据从RDR读出来,在下一个数据到来之前,读出RDR,就可以实现连续接收,否则下一个数据已经收到了,上一个数据还没从RDR中读出,那RDR的数据就会被覆盖,就不能实现连续的数据流了。

波特率发生器主要用来产生SCK时钟的,他内部主要就是一个分频器,输入时钟时PCLK,72M或者36M,经过分频器后,输出到SCK引脚,此时他和移位寄存器同步,每产生一个周期的时钟,移入移出一个bit,然后右边CR1寄存器的三个位BR0,BR1,BR2,用来波特率发生器内部的分频系数。

SPE是SPI使能,MSTR配置主从模式,CPOL,CPHA用来选择SPI的4种模式,SPI_SR状态寄存器TXE发送寄存器空,RXNE接收寄存器非空,SPI_CR2寄存器就是一些使能位了,比如中断使能,DMA使能等。

NSS实现多主机切换,当配置为输出引脚时,输出电平告诉别的设备自己作为主机,配置成输入则作为从机,当SSOE=1时,NSS作为输出引脚,并在当前设备变为主设备时,给NSS输出低电平,当主机结束后,SSOE清零,NSS变为输入,此时输入信号到达数据选择器,由SSM位决定选择哪一路,选择0的时候是硬件NSS模式,如果NSS是低电平,那本设备就只能作为从机,选择下面的1时就是软件管理NSS输入,此时NSS是1还是0,由SSI决定。在这里插入图片描述
在这里插入图片描述
示例是SPI模式3,流程:
SS置低电平开始时序,TEX为1,表示TDR空,可以写入数据开始传输,此时软件写入0xf1,写入之后TDR变为0xf1,同时TXE变为0,表示TDR已经有数据了,此时TDR是等候区,移位寄存器才是真正的发送区,移位寄存器刚开始没有数据,所以在等候区TDR的F1,就会立刻转入移位寄存器,开始发送,转入瞬间,置TXE标志为1,表示发送寄存器空,然后移位寄存器有数据了,波形就自动生成,数据转入移位寄存器之后,数据F1的波形就开始产生了,在移位产生F1波形的同时,等候区TDR是空的,为了移位完成时,下一个数据能不间断的跟随,我们就要提早把下个数据写入TDR里等待,所以第二步的操作是,写入F1之后,软件等待TXE=1,一旦TDR空了我们就写入0xf2,之后的发送流程同理,发送数据完成后TXE一直是1,TXE=1一段时间以后F3的波形才能完整发送,数据发送完以后,BSY标志位由硬件清零。这才表示波形发送完。这就是发送的了流程。
接受的流程同步与发送的流程,不同的是置RXNE为1。
此模式的流程:发送数据1,发送数据2,接收数据1,发送数据3,接收数据2,发送数据4,接收数据3。

在这里插入图片描述
连续比较复杂,一般用非连续传输。非连续传输的缺点是传输速度相对慢一些。
此为SPI模式3:
SCK默认高电平,发送数据时,检测到TEX=1,TDR为空,就软件写入0xf1,此时TDR的值为F1,TXE变为0,目前移位寄存器也是空,所以F1会立刻转入移位寄存器开始发送,波形产生,并且TXE置回1,一直等待RXNE置1后即接受第一字节完成,先把第一个接收的数据读出来,再写入下个字节数据。之后数据2发送,同理等待数据2接收完成后,写入数据3。数据3时序结束后,最后再接收数据3置换的数据。
第一步:等待TXE为1
第二步:写入发送的数据到TDR
第三步:等待RXNE为1
第四步:读取RDR接收的数据
之后交换第二个字节,重复这四步。


http://www.kler.cn/a/582080.html

相关文章:

  • tomcat应用的作用以及安装,以及tomcat软件的开机自启动。
  • Redis Redis介绍、安装 - Redis客户端
  • windows环境DBGPT0.7.0安装部署说明
  • C# 实现软件开机自启动
  • 网络-如果第一次握手旧的序列号先到怎么办?
  • SQL 注入 (C++向)
  • 前端 - npm - - npm安装依赖时 -d -s -g的区别
  • ​【C++设计模式】第十七篇:中介者模式(Mediator)
  • Ubuntu下MySQL的安装与使用(一)
  • Tweak Power:全方位电脑系统优化的高效工具
  • 第85期 | GPTSecurity周报
  • 详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本
  • golang从入门到做牛马:第十二篇-Go语言数组:数据的“有序集合”
  • 数据类设计_图片类设计之3_半规则图类设计(前端架构基础)
  • 官宣 | Fluss 0.6 发布公告
  • 基于Python+Vue开发的电影订票管理系统源码+运行步骤
  • Android 蓝牙工具类封装:支持经典蓝牙与 BLE,兼容高版本权限
  • 【redis】数据类型之布隆过滤器
  • 存储过程和自定义函数在银行信贷业务中的应用(oracle)
  • Spark数据倾斜深度解析与实战解决方案