STM32标准库SPI通信协议与W25Q64-1

简介: STM32标准库SPI通信协议与W25Q64

一、SPI通信

1.SPI通信简介

2.硬件电路


3.移位示意图

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入


  • 首先SCL时钟线,时钟线完全由主机掌控,所以对于主机来说,时钟线为输出,对于所有从机来说,时钟线都为输入,这样主机的同步时钟就能送到各个从机了。
  • MOSI主机输出从机输入,这边左边是主机,所以就对应MO主机输出,下面三个都是从机,所以就对应SI从机输入,数据传输方向是主机通过MOSI输出,所有从机通过MOSI输入。
  • MISO主机输入从机输出,左边是主机对应MI,下面三个是从机对应SO,数据传输方向是三个从机通过MISO输出,主机通过MISO输入。
  • 从机选择,为了确定通信的目标,主机就要另外引出多条SS控制线,分别接到各从机的SS引脚下面。下面这里有三个从机,需要主机另外引出三根SS选择线,主机的SS线都是输出,从机的SS线都是输入,SS线是低电平有效,主机想指定谁,就把对应的SS输出线置低电平就行了,比如主机初始化之后,所有的SS都输出高电平,这样就是谁也不指定,当主机需要和比如从机1进行通信了,主机就把SS1线输出低电平,不需要像I2C一样进行寻址。
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入,对输出我们配置推挽输出,高低电平均有很强的驱动能力,这将使得SPI引脚信号的下降沿非常迅速,上升沿也非常迅速,不像I2C那样下降沿非常迅速,但是上升沿就比较缓慢了,那得益于推挽输出的驱动能力,SPI信号变化的快,那自然它就能达到更高的传输速度,一般SPI信号都能轻松达到兆赫兹的速度级别,I2C并不是不想使用更快的推挽输出,而是I2C要实现半双工,经常要切换输入输出,而且I2C又要实现多主机的时钟同步和总线仲裁,这些功能都不允许I2C使用推挽输出,要不然你不小心就电源短路了,所以I2C选择了更多的功能,自然就要放弃更强的性能了,对SPI来说,首先SPI不支持多主机,然后SPI就是全双工,SPI的输出引脚始终是输出,输入引脚始终是输入,基本不会出现冲突,所以SPI可以大胆的使用推挽输出,不过SPI还是有一个冲突点的,就是图上的MISO引脚,主机一个是输入但是三个从机全都是输出,如果三个引脚都始终是推挽输出,势必会导致冲突,所以在SPI协议里有一条规定,就是当从机的SS引脚为高电平,也就是从机未被选中时,他的MISO引脚必须切换为高阻态,高阻态就相当于引脚断开,不输出任何电平,这样就可以防止一条线有多个输出,而导致的电平冲突的问题了,在SS为低电平时,MISO才允许变为推挽输出,这是SPI对这个可能的冲突做出的规定,当然这个切换过程都是在从机里,我们一般都写主机的程序,所以我们主机的程序中并不需要关注这个问题。


4.SPI基本时序图

(1)起始和终止

(2)交换一个字节

模式0:


模式0和模式1的区别,就是模式0的CPHA等于0,模式1的CPHA等于1。


在时序上的区别对比一下,模式0的数据移出移入的时机会提前半个时钟,也就是相位提前了,我们看一下模式0的CPHA等于0,表示SCK第一个边沿移入数据,第二个边沿移出数据,模式0在SCK第一个边缘就要移入数据,但数据总得先移出才能移入对吧,所以在模式0的配置下,SCK第一个边沿之前就要提前开始移出数据了,或者把它称作是在第零个边沿移出在第一个边缘移入,看一下时序,首先SS下降沿开始通信,现在SCK还没有变化,但是SCK一旦开始变化,就要移入数据了,所以此时趁SCK还没有变化,SS下降沿时就要立刻触发移位输出,所以这里MOSI和MISO的输出,是对齐到SS的下降沿的,或者说这里把SS的下降沿也当作时钟的一部分了,那SS下降沿触发的输出,SCK上升沿就可以采样输入数据了,这样b7 就传输完毕,之后SCK下降沿移出b6 ,SCK上升沿移入b6 ,然后继续,下降沿移出数据,上升沿移入数据,最终在第八个上升沿时,b0位移入完成整个字节交换完成,之后SCK还有一个下降沿,如果主机只需要交换一个字节就结束,那在这个下降沿时MOSI可以置回默认电平或者不去管它,MISO也会变化一次,这一位实际上是下一个字节的b7,因为这个相位提前了,所以下一个字节的b7会露个头,如果不需要的话,SS上升沿之后从机MISO置回高阻态,这是交换一个字节就结束。


模式1:


CPOL等于零,表示空闲状态时SCK为低电平,可以看到在SS未被选中时,SCK默认是低电平的,然后CPHA等于1,表示SCK第一个边沿移出数据,第二个边缘移入数据,但这句话也有不同的描述方式,有的地方写的是CPHA等于1表示SCK的第二个边沿进行数据采样,或者是SCK的偶数边缘进行数据采样,这些不同的描述意思都是一样,我这里为了照应刚才的移位模型,我就写的是SCK第一个边缘移出数据,第二个边沿移入数据,来看一下时序图,第一个SS从机选择,在通信开始前,SS为高电平,在通信过程中SS始终保持低电平,通信结束SS恢复高电平,然后最下面一个MISO,这是主机输入从机输出,刚才说了这里因为有多个从机输出连在了一起,如果同时开启输出会造成冲突,所以我们的解决方法是在SS未被选中的状态,从机的MISO引脚必须关断输出,即配置输出为高阻状态,那在这里SS高电平时MISO用一条中间的线表示高阻态,SS下降沿之后,从机的MISO被允许开启输出,SS上升沿之后,从机的MISO必须置回高阻态,这是这一块的设计啊,然后我们看一下移位传输的操作,因为CPHA等于1,SCK第一个边沿移出数据,所以这里可以看出来,SCK第一个边缘就是上升沿,主机和从机同时移出数据,主机通过MOSI移出最高位,此时MOSI的电平就表示了主机要发送数据的b7 ,重新通过MISO移出最高位,此时MISO表示从机要发送数据的b7 ,然后时钟运行产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样,这里主机移出的b7进入从机移位寄存器的最低位,从机移出的b7进入主机移位寄存器的最低位,这样一个时钟脉冲产生完毕,一个数据位传输完毕,接下来就是同样的过程,上升沿主机和从机同时输出当前移位寄存器的最高位,第二次的最高位就是原始数据的b6,然后下降沿主机和从机移入数据,b6 传输完成之后时钟继续运行,数据依次移出移入移出移入,,最后一个下降沿数据b0传输完成,至此主机和从机就完成了一个字节的数据交换,如果主机只想交换一个字节,那这时候就可以置SS为高电平结束通信了,在SS的上升沿MOSI还可以再变化一次,将MOSI制造一个默认的高电平或低电平,当然也可以不去管它,因为spi没有硬性规定MOSI的默认电平,然后MISO从机必须得置回高组态,此时如果主机的MISO为上拉输入的话,那MISO引脚的电平就是默认的高电平,如果主机MISO为浮空输入,那MISO引脚的电平不确定,这是交换一个字节就结束了流程,那如果主机还想继续交换,在此时主机就不必把SS置回高电平(继续是低电平),直接重复一下从这里到这里交换一个字节的时序,这样就可以交换多个字节了,就是SPI传输数据的流程。


模式2:

模式3:


这个CPHA表示的是时钟相位,决定是第一个时钟采样移入,还是第二个时钟采样移入,并不是规定上升沿采样还是下降沿采样的,当然在CPOL确定的情况下,CPHA确实会改变采样时刻的上升沿和下降沿,比如模式0的时候是SCK上升沿采样移入,模式1的时候是SCK下降沿采样移入,CPHA决定的是第几个边沿采样,并不能单独决定是上升沿还是下降沿,在这四种模式里,模式零和模式三都是SCK上升沿采样,模式一和模式二都是SCK下降沿采样。

5.SPI时序

(1)发送指令


在W25Q64里,这个0x06 代表的是写使能,我们看一下这个模型,在这里我们使用的是spi模式0,在空闲状态是ss为高电平,sck为低电平,mosi和miso的默认电平没有严格规定,然后ss产生下降沿时序开始,在这个下降沿时刻,mosi和miso就要开始变换数据了,mosi由于指令码最高位仍然是0(0000 0110),所以这里保持低电平不变,miso从机现在没有数据发给主机,引脚电平没有变化,实际上W25Q64不需要回弹数据时,手册里规定的是miso仍然是高阻态,从机并没有开启输出,不过这也没问题,反正这个数据我们也不要看,那这里因为STM32的miso是上拉输入,所以这里miso呈现高电平,之后sck第一个上升沿进行数据采样,我这里画了一条绿线,从机采样输入得到零,主机采样输入得到一,之后继续第二个时钟,主机数据仍然是零,所以波形仍然没有变化,然后这样一位一位的发送接收发送接收,到这一位数据才开始变化,主机要发送数据一,下降沿数据移出,主机将一移出到mosi,mosi变为高电平,这里因为是软件模拟的时序,所以mosi的数据变化有些延迟,没有紧贴sck的下降沿,不过这也没关系,时钟是主机控制的,我们只要在下一个sck上升沿之前完成变化就行了,然后sck上升沿数据采样输入,在最后一位呢下降沿数据变化mosi变为零,上升沿数据采样,从机接收数据0,sck低电平是变化的时期,高电平是读取的时期,这一块是不是和I2C差不多,那时序sck最后一个上升沿结束,一个字节就交换完毕了,因为写使能是单独的指令,不需要跟随数据,spi只需要交换一个字节就完事了,所以最后在sck下降沿之后,ss置回高电平结束通信,那这个交换我们统计一下,mosi和miso的电平,总结一下就是,主机用0x06换来了从机的0xff,但实际上从机并没有输出,这个0xff是默认的高电平,不过这个0xff没有意义,我们不用管,那整个时序的功能就是发送指令,指令码是0x06 ,从机一比对事先定义好的指令集,发现0x06是写使能的指令,那从机就会控制硬件进行写使能,这样一个指令从发送到执行就完成了,就是发送单字节指令的时序 。


(2)指定地址写


W25Q64芯片有8M字节的存储空间,一个字节的八位地址肯定不够,所以这里地址是24位的分三个字节传输,我们看一下时序,首先ss下降沿开始时序,mosi空闲时是高电平,所以在下降沿之后,sck第一个时钟之前可以看到mosi变换数据由高电平变为低电平,然后sck上升沿数据采样输入,后面还是一样下降沿变换数据上升沿采样数据,八个时钟之后一个字节交换完成,我们用0x02换来了0xff,其中发送的0x02是一条指令,代表这是一个写数据的时序,接收到0xff不需要看,那既然是写数据的时序,后面必然还要跟着写的地址和数据,所以在最后一个下降沿时刻,因为我们后续还需要继续交换字节,所以在这个下降沿,我们要把下一个字节的最高位放到mosi上,当然下一个字节的最高位仍然是零,所以这里数据没有变化,最后还是同样的流程交换一个字节,第二个字节我们用0x12 换来了0xff,根据W25Q64芯片的规定,写指令之后的字节定义为地址高位,所以这个0x12 就表示发送地址的23~16位,继续看一下交换一个字节,发送的是0x34 这个就表示发送地址的15~8位,最后还是交换一个字节发送的是0x56 ,这个表示发送地址的7~0位,通过三个字节的交换,24位的地址就发送完毕了,从机收到的24位地址是0x123456 ,那三位地址结束后,就要发送写入指定地址的内容了,我们继续调用交换一个字节,发送数据这里的波形是0x55 ,这个表示我要在0x123456 地址下,写入0x55 这个数据,最后如果只想写出一个数据的话,就可以ss置高电平结束通信了,当然这里也可以继续发送数据,spi里也会有和I2C一样的地址指针,每读写一个字节地址指针自动加一,如果发送一个字节之后不终止继续发送的字节就会依次写入到后续的存储空间里,这样就可以实现从指定地址开始写入多个字节了,这就是spi写入的时序,由于spi没有应答机制,所以交换一个字节后,就立刻交换下一个字节就行。


(3)指定地址读


功能是向ss指定的设备先发送读指令,这里芯片定义0x03为读指令,随后在指定地址下读取从机数据,我们看一下时序,起始之后第一个字节主机发送指令0x03 ,表示我要读取数据了,最后还是一样,主机在依次交换三个字节,分别是0x12 0x34 0x56 ,组合到一起就是0x123456代表24位地址,最后这个地方就是关键点,因为我们是读取数据,指定地址之后,显然我们就要开始接收数据,所以这里三个字节的地址交换完之后,我们要把从机的数据搞过来,怎么搞过来呢,我们还是交换一个数据来个抛砖引玉,我们随便给从机一个数据,一般给ff就行了,从机就会把0x123456地址下的数据通过miso发给主机,可以看到这样的波形就表示指定地址下的数据是0x55 ,这样主机就实现了指定地址读一个字节的目的,然后如果我们继续抛砖引玉,那么从机内部的地址指针自动加一,从机就会继续把指定地址下一个位置的数据发过来,这样依次进行,就可以实现指定地址接收多个字节的目的了,最后数据传输完毕,ss置回高电平,时序结束,当然时序这里也会有些细节,比如由于miso是硬件控制的波形,所以它的数据变化都可以紧贴时钟的下降沿,另外我们可以看到miso数据的最高位实际上是在上一个字节,最后一个下降沿提前发生的,因为这是spi模式零,所以数据变化都要提前半个周期。


二、SPI外设

1.SPI外设简介


时钟频率就是sck波形的频率,一个sck时钟交换一个bit,所以时钟频率一般体现的是传输速度,单位是Hz或者bit/s,那这里的时钟频率是fPCLK除以一个分频系数,分频系数可以配置为2、4、8、16、32、64、128、256,所以可以看出来,spi的时钟其实就是由pclk分频得来的,pclk就是外设时钟,APB2的pclk就是72MHz,APB1的pclk是36MHz,比如我们的spi1是APB2的外设,pclk等于72MHz,那它的spi时钟频率最大就是只进行二分频=36MHz,像我们之前I2C的频率最大就只有400KHz,所以这里spi的最大频率比I2C快了90倍,然后这里频率有些注意事项,一是这个频率数值并不是任意指定的,它只能是pclk执行分频后的数值就只有这八个选项,最低频率是pclk的256分频,二是spi1和spi2 挂载的总线是不一样的,spi1挂载在APB2,pclk是72MHz,spi1挂载在APB1,pclk是36MHz,所以同样的配置,spi1的时钟频率要比spi2的大一倍。


2.SPI框图

3.SPI基本结构


4.主模式传输

(1)连续传输



  1. 第一行是sck时钟线,这里cpol等于1,cpha等于1,示例使用的是spi模式三,所以sck默认是高电平,然后在第一个下降沿mosi和miso移出数据,之后上升沿引入数据,依次这样来进行,那下面第二行是mosi和miso输出的波形,跟随sck时钟变化,数据位依次出现,这里从前到后依次出现的是b0b1一直到b7 ,所以这里示例演示的是低位先行的模式,实际spi高位先行用的多一些,最后第三行是TXE发送寄存器空标志位,下面发送缓冲器括号写入SPI_DR,实际上就是这里的TDR然后BSY(busy)是由硬件自动设置和清除的,当有数据传输时,busy置1那上面演示的就是输出的流程和现象,然后下面是输入的流程和现象,第一个是miso/mosi的输入数据,之后是RXNE接收数据寄存器非空标志位最后是接收,缓冲器读出SPI_DR,显然这里就是RDR。
  2. 首先ss置低电平开始时序,这个没画但是必须得有的,在刚开始时TXE为1,表示TDR空可以写入数据开始传输,然后下面指示的第一步就是软件写入0xf1至SPI_DR,0xf1就是要发送的第一个数据,之后可以看到写入之后TDR变为0xf1 ,同时txe变为0,表示tdr已经有数据了,那此时dr是等候区,移位寄存器才是真正的发送区,移位寄存器刚开始肯定没有数据,所以在等候区TDR里的f1 ,就会立刻转入移位寄存器开始发送转入瞬间置txe标志位为1,表示发送寄存器空,然后移位寄存器有数据了,波形就自动开始生成,当然我感觉这里画的数据波形时机可能有点早,应该是在这个时刻b0的波形才开始产生,在这之前数据还没有转入移位进器,所以感觉b0出现的可能过早了,不过这个也不影响我们理解,大家知道这意思就行好了,这样数据转入移位寄存器之后,数据F1的波形就开始产生了,在移位产生f1波形的同时,等候区tdr是空的,为了移位完成时,下一个数据能不间断的跟随,这里我们就要提早把下一个数据写入到TDR里等着了,所以下面只是第二步的操作,是写入F1之后,软件等待TXE等于1,在这个位置,一旦tdr空了,我们就写入F2至SPI_DR,写入之后可以看到tdr的内容就变成F2了,也就是把下一个数据放到tdr里,后者之后的发送流程也是同理,最后在这里如果我们只想发送三个数据,F3转入移位寄存器之后,TXE等于1,我们就不需要继续写入了,txe之后一直是1,注意在最后一个TXE等于1之后,还需要继续等待一段时间,f3的波形才能完整发送完,等波形全部完整发送之后,busy的标志由硬件清除,这才表示波形发送完成了,那这些就是发送的流程,然后继续看一下下面接收的流程,SPI是全双工,发送的同时还有接收,所以可以看到在第一个字节发送完成后,第一个字节的接收也完成了,接收到的数据1是A1 ,这时移位寄存器的数据整体转入RDR,RDR随后存储的就是A1 ,转入的同时按RXNE标志位也置1,表示收到数据了,我们的操作是下面这里写的,软件等待RXNE等于1,=1表示收到数据了,然后从SPI_DR也是RDR读出数据A1 ,这是第一个接收到的数据,接收之后软件清除RXNE标志位,然后当下一个数据2收到之后,RXNE重新置1,我们监测到RXNE等于1时就继续读出RDR,这是第二个数据A2 ,最后在最后一个字节时序完全产生之后,数据三才能收到,所以数据3,直到这里才能读出来,然后注意,一个字节波形收到后,移位寄存器的数据自动转入RDR,会覆盖原有的数据,所以我们读出rdr要及时,比如A1这个数据收到之后,最迟你也要在这里把它读走,否则下一个数据A2覆盖A1,就不能实现连续数据流的接收了。


(2)非连续传输


配置还是spi模式三,sck默认高电平,我们想发送数据时如果检测到TXE等于1了,TDR为空,就软件写入0xF1至SPI_DR,这时TDR的值变为F1,TXE变为0,目前移位寄存器也是空,所以这个F1会立刻转入移位寄存器,开始发送,波形产生并且,TXE置回1,表示你可以把下一个数据放在tdr里侯着了,但是现在区别就来了,在连续传输这里一旦,TXE等于1了,我们就会把下个数据写到tdr里侯着这样是为了连续传输数据衔接更紧密,但是刚才说了,这样的话,流程就比较混乱,程序写起来比较复杂,所以在非连续传输这里,TXE等于1了,我们不着急把下一个数据写进去,而是一直等待,等第一个字节时序结束,在这个位置时序结束了,意味着接收第一个字节也完成了,这时接收的RXNE会置一,我们等待RXNE置1后,先把第一个接收到的数据读出来,之后再写入下一个字节数据,也就是这里的软件等待TXE等于1,但是较晚写入0xf2SPI_DR,较晚写入TDR后,数据二开始发送,我们还是不着急写数据三,等到了这里,先把接收的数据二收着,再继续写入数据3,数据3时序结束后,最后再接收数据三置换回来的数据,你看按照这个流程的话,我们的整个步骤就是第一步等待TXE为一,第二步写入发送的数据至TDR,第三步等待RXNE为一,第四步读取RDR接收的数据,之后交换第二个字节,重复这四步,那这样我们就可以把这四部分装到一个函数,调用一次交换一个字节,这样程序逻辑是不是就非常简单了,和之前软件spi的流程基本上是一样的,我们只需要稍作修改,就可以把软件spi改成硬件spi,那非连续传输的缺点就是在这个位置没有及时把下一个数据写入TDR侯着,所以等到第一个字节时序完成后,第二个字节还没有送过来,那这个数据传输就会在这里等着,所以这里时钟和数据的时序,在字节与字节之间会产生间隙,拖慢了整体数据传输的速度这个间隙在sck频率低的时候影响不大,但是在sck频率非常高时隙拖后腿的现象就比较严重了。


三、W25Q64

1.简介


时钟频率,我们这个芯片使用的是spi通信,其中spi的sck线就是时钟线,这个时钟线的最大频率是80MHz,这个频率相比较STM32是非常快的,所以我们在写程序的时候翻转引脚就不用再加延时了,即使不延时这个GPIO的翻转频率也不可能达到80MHz,所以可以放心使用,然后后面这还有两个频率,分别是160MHz这个是双重spi模式等效的频率,320MHz这个是四重spi模式等效的频率,这个双重spi和四重spi大家了解一下即可,我们本课程不会用到,那他们是什么意思呢,就是我们之前说的mosi用于发送,miso用于接收,是全双工通信,在只发或只收时有资源浪费,但是这个w25q芯片的厂商不忍心浪费,所以就对spi做出了一些改进,就是我在发的时候,可以同时用mosi和miso发送,在收的时候也可以同时用mosi和miso接收,mosi和miso同时兼具发送和接收的功能,一个sck时钟我同时发送或接收两位数据,就是双重spi模式,那你一个时钟收发两位相比较一位一位的普通spi数据传输率就是二倍了,所以这里写的是在双重spi模式下,等效的时钟频率就是80MHz的二倍就是16MHz,但实际上这个频率最大还是80MHz,只是我一个时钟发两位而已,然后四重spi模式,很显然就是一个时钟发送或接收四位,等效的频率就是80x4=320MHz,在我们这个芯片里啊,除了spi通信引脚,还有两个引脚,一个是wp写保护,另一个是hold,这两个引脚如果不需要的话,也可以拉过来充当数据传输引脚,加上mosi和miso就可以四个数据位同时收发了,就是四重spi,其实这就有点并行传输的意思了,串行是根据时钟一位一位的发,并行是一个时钟八位同时发送,所以这个四重spi模式,其实就是四位并行的模式,这个大概了解一下就行。


STM32标准库SPI通信协议与W25Q64-2

https://developer.aliyun.com/article/1508407

相关文章
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
476 2
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
799 0
|
6月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
539 4
|
6月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
802 2
|
6月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
271 1
|
6月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
649 1
|
5月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
208 0
|
7月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
7月前
|
传感器 存储 缓存