您的位置 首页 新能源

STM32-SPI运用(ZT)

SPI知识:1)高速同步串行口。3~4线接口(CS,CLK,MOSI,MISO),收发独立、可同步进行。2)SPI分为主从模式,主模式提供时钟和片选选

SPI常识:
1)

高速同步串行口。3~4线接口(CS ,CLK ,MOSI,MISO),收发独立、可同步进行。

2)SPI分为主从形式,主形式供给时钟和片选挑选信号.

3) 形式操控:CPOL用来操控时钟信号(clk)在闲暇时分的状况;CPHA用来操控采样时间时CLK的边际动作。

CPOLCPHA形式

00CLK闲暇时为低电平,CLK上升沿采样数据。

01CLK闲暇为低电平,CLK下降沿采样数据。

10CLK闲暇时为高电平,CLK上升沿采样数据。

11CLK闲暇时为高电平,CLK下降沿采样数据。

1)SPI装备(3.01库):

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双工形式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPI主形式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8bit数据
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//CLK闲暇时为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//CLK上升沿采样,由于上升沿是第二个边缘动作,所以也能够理解为第二个边缘采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//片选用软件操控
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//SPI频率
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7;//crc7,stm32spi带硬件ecc
SPI_Init(SPI1, &SPI_InitStructure);

2)CS信号:

主形式下要为从设备供给片选信号,值得注意的是STM32的主频适当较高,要防范数据没有彻底发送前拉高CS信号。

3)SPI读写:(非中止形式)

a)写一个字节:

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//保证产生前Buffer为空,也便是说上一次现已产生完结
SPI_I2S_SendData(SPI1, Data);//往寄存器中写入一个字节

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
//等候承受到一个字节数据,为什么要这么做?加这一句的原因是为了保证这个字节现已发送出去,由于产生和承受是并行同步进行,那便是说你产生出去一个字节意味着你收到一个字节。所以这样判别彻底没有问题,再说必要性,假如你不加这句你就会简单犯过早拉高CS信号的过错,你想想假如在SPI_I2S_SendData(SPI1, Data)后边当即拉高CS是什么结果。
SPI_I2S_ReceiveData(SPI1);//都会接纳到的数据,看起来没什么必要,但以用stm32的经历引荐这样做,或许会有意想不到的收成。

SPI_Writebyte(u8 data)

{

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Data);

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

SPI_I2S_ReceiveData(SPI1);

}

b)读一个字节:

读的时分要注意一个问题,由于从形式是无法供给时钟的,所以主形式下有必要要在接纳的一起供给时钟。方法便是发送一个字节来完成,由于仍是上面说的,发送一个字节就意味着收到一个字节,代码和写彻底相同,只要把读出来的字节保存即可。

u8SPI_Readbyte(u8 data)

{

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Data);

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

return SPI_I2S_ReceiveData(SPI1);

}

总结:上面的程序是最求安稳而设定的,假如你对速度有要求,你能够做相应的精简,比方读写直接对寄存器进行操作,别的装备SPI前要对从形式的形式了解清楚,包含从设备支撑的时钟规模和形式(CPOL,CPHA状况)。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部