stm32外设简介
1.stm32内部集成了硬件spi的收发电路,可以由硬件自动执行时钟生成数据手法等功能,减轻cpu的负担
2.可配置8位/16位数据帧,高位先行/低位先行
3.时钟频率:Fpclk/(2,4,8,16,32,64,128,256)
4.支持多主机模型,主或从操作
5.可精简为半双工/单工通信
6.支持DMA
7.兼容I2S协议(飞利浦公司开发的一套音频通讯协议)
STM32f103支持硬件spi有SPI1,SPI2。
复用引脚(spi1,spi2)
SPI框图
下面将此图分为各个部分进行介绍
1.数据传输部分(移位寄存器会自动产生时钟并且与波特率发生器输入到SCK上的时钟相同)
1.图中的控制位LSBFIRST是控制低位先行还是高位先行,图中数据传输的方式是低位先行。
高电平低位先行,低电平高位先行。
2.里面发生了交叉,意味着stm32既可以作为主机又可以作为从机,当STM32作为主机时没有其中的交叉,当STM32作为从机的时候框内的交叉存在(此时MOSI的数据输出到移位寄存器中,移位寄存器的数据到MISO上)。
3.缓冲区(接受缓冲区RDR,发送缓冲区TDR)
接受缓冲区是接受数据寄存器RDR
发送缓冲区是发送数据寄存器TDR
其中TDR与RDR占用同一个地址,统一叫做DR
4.总结:数据传输方向(实现连续的数据流)
数据沿着地址总线写入到TDR上,若移位寄存器中的数据为空,
{则数据从TDR移入移位寄存器(此时转入时刻置内部状态寄存器的TXE为1,表示发送寄存器为空,当我们检测到发送寄存器TDR为空时,总线上的数据自动转入到TDR上等候)}
{移位寄存器上如果检测到数据到达,会自动产生时钟,与从机进行数据交换}
{移位寄存器在与从机进行数据交换,交换完成的数据通过移位寄存器整体移入到RDR(此时状态寄存器的RXNE为1表示接受寄存器非空)中再传输到地址总线上。此时我们要及时将数据从RDR上读出来当下一个数据被接收到了,RDR上的数据就会被覆盖}
2.控制逻辑部分
1.波特率发生器用来产生SCK时钟频率与移位寄存器的时钟相同,其内部主要是一个分频器,
输入时钟是PCLK(72MHZ,36MHZ)经过分频器之后数据被传输到SCK引脚上。所以每产生一个时钟移入移出一个bit。
2.其中SPI_CR1寄存器内部BR2,BR1,BR0三个位控制分频系数。所以最高分频为256分频。
3.寄存器每个位介绍
第一位控制高位先行1 还是低位先行0
第二位是控制SPI使能为意为SPI_Cmd(SPI1,ENABLE);
第三四五位请参考那个第二个小点
第MSTR位是决定stm32是做主机还是从机,在I2S模式下不启用。
第CPOL位和CPHA位结合来控制SPI的通信模式。
CPOL位时钟极性,决定SCK在空闲状态下的电平。0低电平,1高电平。
CPHA位决定数据采样从第几个时钟边沿开始。0第一个,1第二个。
4.多主机模式的实现
啥意思呢?NSS引脚就是将各个设备主从设备控制引脚,怎么说呢!当某个设备的NSS输出低电平时该设备作为主机。
SSM:当SSM被置为高电平时允许SSI控制NSS上的电平(低电平为主机,高电平为从机),STM32内部从设备选择是将STM32作为从机。
SPI简化框图(主干部分)
这里寄存器讲解就到这,主要还是手册上的