STM32--SPI通信外设(上)

声明:我是跟着B站江科大的视频的学习过程中记录下来作者的文案,记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以一起学习。

我把其中一些白话进行了修改,并且添加了自己的一些理解。我只有一些pyhon基础,所以可能有错误,学起来也比较吃力,就把自己的一些理解加上去了,方便大家有和我一样没有基础的人进行学习,如果有不对的地方欢迎指正

本小节是硬件SPI。

软件SPI就是用代码手动翻转电平,来实现时序。

硬件SPI就是使用STM32内部的SPI外设,来实现时序。

软件比较方便灵活,硬件性能比较高,节省软件资源。

STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU负担;

可配置8位/16位数据帧、高位先行\低位先行(SPI一般是8位,高位先行);SPI和I2C都是高位先行,串口是低位先行,比如串口发送0x55,对应二进制就是01010101,左边是高位,右边是低位,在产生波形时,数据由高位到低位依次出现,所以波形从前到后是10101010,看数据是从右往左看,01010101,对应0x55.

时钟频率:fPCLK/(2, 4, 8, 16, 32, 64, 128, 256),PCLK是外设时钟,即SCK波形的频率,一个SCK时钟,交换一个比特Bit。SPI1SPI2挂载的总线是不一样的,SPI1挂载在APB2上,PCLK72MHzSPI2挂载在APB1上,PCLK36MHz

支持多主机模型、主或从操作;

可精简为半双工/单工通信

支持DMA

兼容I2S协议(用来传输数字音频信号);

左上角是移位寄存器和数据寄存器进行配合的过程;右下角是控制逻辑的一部分,寄存器的哪些位,控制哪个部分,会产生什么效果,可以通过手册来查。

目前上面这个图画的是低位先行,是通过LSBFIRST控制位进行控制的。MSB表示高位先行,LSB表示低位先行。上图画的是LSB等于1的,如果是高位先行的话,需要把图在改一下。

如果是高位先行,需要改成下面这个样子。

两个缓冲区实际就是数据寄存器DR,上面是接收数据寄存器RDR,下面是发送数据寄存器TDR,和串口一样,TDR和RDR占用同一个地址,统一叫做DR。

当我们要连续发送一批数据时,第一个数据,写入到TDR,当移位寄存器内没有数据进行移位时,TDR的数据会立刻转移到移位寄存器,开始移位,这个转入时刻,会置状态寄存器的TXE1表示发送寄存器为空。当我们检查TXE置1,紧跟着下一个数据就可以提前写入到TDR里等待了。一旦上一个数据发完,下一个数据就立刻跟进,实现连续传输。移位寄存器一旦有数据过来了,他就会自动产生时钟,将数据移出去。在移出的过程中,MISO的数据也会移入,一旦数据移出,数据移入也就完成了,这时移入的数据就会从移位寄存器整体转移到接收缓存区RDR这个时刻会置状态寄存器的RXNE1表示接收寄存器非空。当检查RXNE置1,要尽快把数据从RDR读出来,在下一个数据到来之前,读出RDR,就可以实现连续接收,否则如果还没读出,下一个数据已经到了,那下一个数据就会将RDR的数据进行覆盖,就不能实现连续接收了。

简而言之,就是发送数据先写入TDR,再转到移位寄存器进行发送,在发送的同时,接收数据,接收到的数据转到RDR,再从RDR读取数据,数据寄存器和移位寄存器的配合,可以实现数据的无延迟传输。

SPI的移位寄存器发送和接收可以共用,发送数据寄存器和接收数据寄存器是分离的;而I2C是半双工,发送和接收数据是分开的,所以对于数据寄存器和移位寄存器发送和接收都可以共用。

串口是全双工,异步的时序,所以就要求他的数据寄存器,发送和接收都是分离的;移位寄存器发送和接收也是分离的。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值