STM32 SPI通信

SPI通信

优点:SPI传输更快,SPI并没有像I2C那样规定最大的传输速度,最大传输速度取决于芯片厂商的设计需求,比如本节的W25Q64存储器芯片最高可达80MHz

缺点:SPI实现的功能没有I2C那么多,SPI的硬件开销大,通信线有四根,通信过程中经常会有资源浪费的情况,并且SPI通信只支持一主多从的通信,不支持多主机。

通信线:SCK(SCLK/CLK/CK)串行时钟用于提供时钟信号,数据位的输出和输入都是在SCK的上升沿或下降沿进行的,同步时序的好处就是通信可慢,可快;MOSI(DO/DOUT)主机输出从机输入;MISO(DI/DIN)是主机输入从机输出;SS(NSS/CS)从机选择,SS线可能不止一条,一个从机一条SS线。SPI没有应答机制

图中芯片从左到右依次为:W25Q64是一个Flash存储器、OLED屏幕、2.4G无线通信模块,芯片型号是NRF24L01、SD卡支持SDIO协议和SPI协议

SPI硬件电路

SPI主机:主机一般都是控制器来做,之所以图中的主机引出了6根线,是因为它接了3个从机所以SS线需要三根。SPI所有的通信线都是单端信号,即高低电平都是相较于GND的电压差,所以在主机上还是有一根GND线的。如果从机没有供电的话,主机还应该额外的引出VCC给从机供电。

通信线:

First:SCK时钟线,由主机掌控,对主机来说时钟线为输出,对应着对于所有的从机来说时钟线是输入。

Second:MISO和MISO相连,MOSI和MOSI相连。

Third:主机的SS线都是输出,从机的SS线都是输入,SS线是低电平有效的,同一时间主机只能置一个SS为低电平,只能选中一个从机。

SPI中输出为推挽输出(从机当中只有当SS引脚为低电平的时候才允许使用推挽输出,SS引脚为高电平时输出MISO只能为高阻态防止主机的MISO有多个输入导致电平冲突),输入为浮空或者上拉输入。

移位示意图

        通信过程:SPI主机和从机当中都有一个8位的移位寄存器,主机的移位寄存器有一个时钟输入端,SPI是高位先行的,所以每来一个时钟移位寄存器都会向左进行移位,从机中的移位寄存器也是同理,时钟由主机提供(主机的波特率发生器产生时钟)。数据会在移位的过程当中会放到通信线上,即输出数据寄存器,然后经过不断地移位从而实现了主机和从机地数据交换,SPI的通信基础就是交换一个字节,对于接收和发送单独操作,我们可以只取接收或者发送的字节,在交换数据的时候我们使用的是0x00或0xFF来交换我们需要的有用数据。这样我们就可以完成发送一个有用字节,接受一个有用字节,发送并接受一个有用字节这三个功能。

SPI时序基本单元

起始条件只看SS

SPI可以让我们控制上升沿移位还是下降沿移位,对此,SPI给了可以配置的四种模式,这样的话SPI就可以兼容更多的芯片。

SPI有两个可以配置的位:CPOL:时钟极性,可以配置位1或0        CPHA:时钟相位,可以配置为1或0,决定是第一个时钟采样(第一个边沿)移入还是第二个时钟采样(第二个边沿)移入不是规定上升沿采样还是下降沿采样的,当然在CPOL确定的情况下CPHA确实会改变采样时刻的上升沿和下降沿。这两个配合有了模式0、1、2、3,这些模式的功能都是一样的。

模式1

MISO时序图当中的一条线代表了高阻态。

模式0(使用最多的模式) 

可以简化为第0个边沿移出数据,第1个边沿移入数据,SS下降沿时就会立刻触发移位输出

模式2:模式2与模式0的区别就是SCK的极性取反,其他的完全一致

模式3:模式3与模式1的区别也是SCK的极性取反,其他的完全一致

SPI时序(W25Q64的时序)

I2C时序规定:有效数据流第一个字节是寄存器地址,之后依次是读写的数据,使用的是读写寄存器的模型

SPI时序规定:采用指令码加读写数据的模型,过程为:第一个要交换的数据位指令码,从机当中会对应一个指令集,指令码是从机当中指令集所对应的指令,不同的指令可以有不同的数据个数。

指定地址写

因为我们的W25Q64有8M字节的存储空间,一个字节的8位不足以表示全部的地址,所以,我们的地址有24位,需要三个字节。

        在上图的时序当中第一个字0x02表示的是写数据的时序,根据W25Q64后面分别跟着四个字节,前三个字节分别是地址为的23~16位,15~8位,7~0位,最后一个字节位要写入的数据。当然在最后一个字节的后面还可以加上多个要写的字节数据,因为,SPI也有一个和I2C一样的的地址指针,每读写一个字节,地址指针都会自动加1,我们后加的数据会依次的写入后续的存储空间当中。由于我们是一直在写数据,并没有接收数据是,所以我们的MISO线一直处于挂机的状态。

指定地址读

        指定地址读与指定地址写不同的地方就在于,我们要读取数据,所以我们在指定完三字节的地址之后,要开始接收数据,即在上图的第四个字节MISO就解除了挂机的状态,然后主机使用0xFF换取了从机的数据,然后我们继续交换,那么从机内部的地址指针自动加1,从机会继续将下一个地址位置的数据发送给主机,这样一次进行就可以实现指定地址接收多个字节的目的了。

细节:Num1. 由于我们的MISO是硬件控制的,所以我们的数据变化可以紧贴SCL的下降沿,Num2.我们MISO的最高位实际上是再上一个字节最后一个SCL下降沿提前发生的,因为是SPI模式0,所以数据变化都要提前半个周期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
stm32spi通信是指在STM32微控制器中使用SPI(串行外设接口)进行通信的一种方式。SPI是一种全双工、同步的串行通信协议,适用于芯片间的高速数据传输。在STM32中,可以通过引脚配置和SPI相关的寄存器设置来实现SPI通信。 在SPI通信中,通常有一个主设备和一个或多个从设备。主设备负责发起通信并控制数据传输的时序,而从设备则根据主设备的指令进行响应。 在STM32中,可以使用相关的库函数和头文件来实现SPI通信。例如,可以使用W25Q64.h和MySPI.h这两个头文件来初始化SPI接口和定义相关的函数。其中,W25Q64.h中定义了一些函数,如W25Q64_Init()用于初始化W25Q64芯片,W25Q64_ReadID()用于读取芯片的ID,W25Q64_PageProgram()用于向芯片写入数据,W25Q64_SectorErase()用于擦除扇区,W25Q64_ReadData()用于读取数据。而MySPI.h中定义了MySPI_Init()用于初始化SPI接口,MySPI_Start()用于启动SPI传输,MySPI_Stop()用于停止SPI传输,MySPI_SwapByte()用于交换数据字节。 通过调用这些函数和使用SPI的相关寄存器,我们可以实现STM32与其他设备之间的SPI通信。例如,可以使用W25Q64芯片进行数据存储和读取,通过SPI接口与STM32进行通信。 总结起来,stm32spi通信是一种使用SPI接口进行通信的方法,通过在STM32中使用相应的库函数和头文件,我们可以初始化SPI接口并实现与其他设备之间的数据传输。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32——SPI通信](https://blog.csdn.net/NRWHF/article/details/129482253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值