声明:我是跟着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。SPI1和SPI2挂载的总线是不一样的,SPI1挂载在APB2上,PCLK是72MHz;SPI2挂载在APB1上,PCLK是36MHz;
支持多主机模型、主或从操作;
可精简为半双工/单工通信;
支持DMA
兼容I2S协议(用来传输数字音频信号);
左上角是移位寄存器和数据寄存器进行配合的过程;右下角是控制逻辑的一部分,寄存器的哪些位,控制哪个部分,会产生什么效果,可以通过手册来查。
目前上面这个图画的是低位先行,是通过LSBFIRST控制位进行控制的。MSB表示高位先行,LSB表示低位先行。上图画的是LSB等于1的,如果是高位先行的话,需要把图在改一下。
如果是高位先行,需要改成下面这个样子。
两个缓冲区实际就是数据寄存器DR,上面是接收数据寄存器RDR,下面是发送数据寄存器TDR,和串口一样,TDR和RDR占用同一个地址,统一叫做DR。
当我们要连续发送一批数据时,第一个数据,写入到TDR,当移位寄存器内没有数据进行移位时,TDR的数据会立刻转移到移位寄存器,开始移位,这个转入时刻,会置状态寄存器的TXE为1,表示发送寄存器为空。当我们检查TXE置1,紧跟着下一个数据就可以提前写入到TDR里等待了。一旦上一个数据发完,下一个数据就立刻跟进,实现连续传输。移位寄存器一旦有数据过来了,他就会自动产生时钟,将数据移出去。在移出的过程中,MISO的数据也会移入,一旦数据移出,数据移入也就完成了,这时移入的数据就会从移位寄存器整体转移到接收缓存区RDR,这个时刻会置状态寄存器的RXNE为1,表示接收寄存器非空。当检查RXNE置1,要尽快把数据从RDR读出来,在下一个数据到来之前,读出RDR,就可以实现连续接收,否则如果还没读出,下一个数据已经到了,那下一个数据就会将RDR的数据进行覆盖,就不能实现连续接收了。
简而言之,就是发送数据先写入TDR,再转到移位寄存器进行发送,在发送的同时,接收数据,接收到的数据转到RDR,再从RDR读取数据,数据寄存器和移位寄存器的配合,可以实现数据的无延迟传输。
SPI的移位寄存器发送和接收可以共用,发送数据寄存器和接收数据寄存器是分离的;而I2C是半双工,发送和接收数据是分开的,所以对于数据寄存器和移位寄存器发送和接收都可以共用。
串口是全双工,异步的时序,所以就要求他的数据寄存器,发送和接收都是分离的;移位寄存器发送和接收也是分离的。