您的位置 首页 嵌入式

STM32 SPI介绍

SPI特征3线全双工同步传输带货不带第三根双向数据线的双线单工同步传输8或16位传输帧格式选择主或从操作8个模式波特率分频系数从模式频率主…

SPI特征

3线全双工同步传输

带货不带第三根双向数据线的双线单工同步传输

8或16位传输帧格局挑选

主或从操作

8个形式波特率分频系数

从形式频率

主形式和从形式的快速通讯:最大SPI速度达到了18MHz

主形式和从形式均能够由软件或硬件进行NSS办理:主/从操作形式的动态改动

可编程的时钟极性和相位

可编程的数据次序

可触发中止的专用发送和承受标志

SPI总线忙状况标志

支撑牢靠通讯的硬件CRC

一般SPI经过4个管脚与外部器材相连

MISO:主设备输入/从设备输出管脚,该管脚在从形式下发送数据,在主形式下接纳数据

MOSI:主设备输出/从设置输入管脚,该管脚在主形式下发送数据,在从形式下承受数据

SCK:串口时钟,作为主设备的输出,从设置的输入

NSS:从设置挑选,这是一个可选的管脚,用来挑选主/从设置,他的功用是用来作为片选管脚,让主设备能够独自的与特定从设备通讯,防止数据线上的抵触,从设备的NSS管脚能够由主设备作为一个规范的IO来驱动,一旦被使能SSOE位,NSS管脚也能够作为输出管脚,并在SPI设置为主形式时拉低,此刻一切NSS管脚连接到主设备NSS管脚的SPI设备,会检测到低电平,假如他们被设置NSS硬件形式,就会主动进入从设备状况

时钟信号的相位和极性

SPI_CR存放器的CPOL和CPHA位,能够组合成四种或许的时序联系,CPOL(时钟极性)位控制在没有数据传输时时钟的闲暇状况电平,此位对主形式和从设备下的设备都有用,假如CPOL被清0,SCK引脚在闲暇状况坚持低电平;假如CPOL被置1,SCK引脚在闲暇状况坚持高电平

假如CPHA时钟相位位被置1,SCK时钟的第二个边缘(CPOL位为0时便是下降沿,CPOL位为1时便是上升沿),进行数据位的采样,数据在第二个时钟边缘被锁存

CPOL时钟极性和CPHA时钟相位的组合挑选数据捕捉的时钟边缘

SPI从形式

在从装备里,SCK引脚用于接纳到主设备来的串行时钟,SPI_CR1存放器的BR的设置不影响数据传输速率

装备进程

1、装备DFF位以界说数据帧格局为8位或16位

2、挑选CPOL和CPHA位来界说数据传输和串行时钟之间的相位联系,为确保正确的数据传输,从设备和主设备的CPOL和CPHA位有必要装备成相同的方法

3、帧格局(MSB在前仍是LSB在前取决于SPI_CR1存放器中的LSBFIRST位)有必要和主设备相同

4、硬件形式下,在完好的数据帧发送进程中,NSS引脚有必要为低电平,软件形式下,设这SPI_CR1存放器中的SSM位并铲除SSI位

5、铲除MSTR位,设置SPE位,使呼应引脚作业于SPI形式下

在这个装备里,MOSI引脚是数据输入,MISO引脚是数据输出

数据发送进程

数据字被并行地写入发送缓冲器

当从设备接纳到时钟信号,而且在MOSI引脚上呈现榜首个数据位时,发送进程开端,榜首个位被发送出去,余下的位(关于9位数据帧格局,还有7位;关于16位数据帧格局,还有15位)被装进移位存放器,当发送缓冲器中的数据传输到移位存放器时,SPI_SR存放器里的TXE标志被设置,假如设置了SPI_CR2存放器上的TXEIE位,将会发生中止

数据接纳进程

关于接纳方,当数据接纳完结时

移位存放器中的数据传送到承受缓冲器,SPI_SR存放器中的RXNE标志被设置

假如设置了SPI_CR2存放器的RXEIE位,则发生中止

在最终一个采样时钟边缘后,RXNE位被置1,移位存放器中接纳到的数据字节被传送到承受缓冲器,当读SPI_DR存放器时,SPI设备回来这个值。读SPI_DR存放器是,RXNE位被铲除。

SPI主形式

在主装备时,串行时钟在SCK脚发生

装备进程

1、经过SPI_CR1存放器的BR位界说串行时钟波特率

2、挑选CPOL和CPHA位,界说数据传输和串行时钟的相位联系

3、设置DRR位来界说8位或16位数据帧格局

4、装备SPI_CR1存放器的LSBFIRST位界说帧格局

5、假如NSS引脚需求作业在输入形式,硬件形式中在整个数据帧传输器材应把NSS脚连接到高电平;在软件形式中,需设置SPI_CR1存放器的SSM和SSI位,假如NSS引脚作业在输出形式,则只需设置SSOE位

6、有必要设置MSTR和SPE位

在这个装备中,MOSI脚是数据输出,而MISO脚是数据输入。

数据发送进程

当一字节写进发送缓冲器时,发送进程开端。

在发送榜首个数据位时,数据字被并行地(经过内部总线)传入认为存放器,然后串行地溢出到MOSI脚上;MSB在线仍是LSB在线,取决于SPI_CR1存放器中的LSBFIRST位,数据从发送缓冲器传输到移位存放器时TXE标志将被置位,假如设置SPI_CR1存放器中的TXEIE位,将发生中止

数据接纳进程

关于接纳器来说,当数据传输完结时

移位存放器里的数据传送到接纳缓冲器,而且RXNE标志被置位

假如SPI_CR2存放器中的RXEIE位被置位,则发生中止。

在最终采样时钟沿,RXNE位被设置,在移位存放器中接纳到的数据字被传送到承受缓冲器,读SPI_DR存放器时,SPIU设备回来承受到的数据字,读SPI_DR存放器将铲除RXNE位。

一旦传输开端,假如下一个将发送的数据被放进了发送缓冲器,就可认为之一个接连的传输流,在企图写发送缓冲器之前,需承认TXE标志应该是1

SPI_InitTypeDef SPI_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

SPI_Cmd(SPI2, DISABLE);//有必要先禁能,才干改动MODE
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;//两线全双工
SPI_InitStructure.SPI_Mode =SPI_Mode_Master;//主
SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;//8位
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;//CPOL=1时钟悬空高
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;//CPHA=1 数据捕获第2个
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;//软件NSS
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_2;//2分频
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;//高位在前
SPI_InitStructure.SPI_CRCPolynomial =7;//CRC7

SPI_Init(SPI2,&SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);

//spi的装备完毕了能够使用了。

也可用 函数SPI_StructInit 把SPI_InitStruct中的每一个参数按缺省值填入

_____________________________________________________________________________________

发送缓冲器闲暇标志(TXE)【3.0SPI_I2S_FLAG_TXE】
此标志为’1’时标明发送缓冲器为空,能够写下一个待发送的数据进入缓冲器中。当写入SPI_DR时,TXE标志被铲除。
接纳缓冲器非空(RXNE)【3.0SPI_I2S_FLAG_RXNE】
此标志为’1’时标明在接纳缓冲器中包括有用的接纳数据。读SPI数据存放器能够铲除此标志。

注意在2.0的库中函数

SPI_SendData SPI_ReceiveData SPI_GetFlagStatus 等在3.0的库中 变为

SPI_I2S_SendDataSPI_I2S_ReceiveData SPI_I2S_GetFlagStatus

写一个发送/承受函数

static u8 SPIByte(u8 byte)

{

while((SPI2->SR &SPI_I2S_FLAG_TXE)==RESET);
//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE))==RESET);

SPI2->DR = byte;
//SPI_I2S_SendData(SPI2,byte);

while((SPI2->SR &SPI_I2S_FLAG_RXNE)==RESET);

//while((SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE))==RESET);
return(SPI2->DR);

//returnSPI_I2S_ReceiveData(SPI2);读存放器用硬件铲除标志位。
//SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;直接软件铲除标志位。
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/275043.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部