您的位置 首页 芯闻

踏踏实实搞清 stm32 SPI总线 根底和编程

SPI应用是相当的广了,同步串行总线,同步同步当然需要时钟信号来统一了,这样通讯双方通讯时就比较默契没那么延迟(呆呆)了。应用于中低

SPI应用是适当的广了,同步串行总线,同步同步当然需求时钟信号来一致了,这样通讯两边通讯时就比较默契没那么推迟(呆呆)了。应用于中低速场合。

学起来从哪些地方下手呢?如下:

SPI概念与特色 要害的时序承受 编程时要点 STM32内部的SPI运用(介绍、功用、中止)

SPI概念与特色:不多说,串行,需求同步信号 主从结构的 CS(片选) SCK SDI SDO

全双工 一主控多从 8或16位数据通信

其它特色:8个主形式波特率预分频系数 fpcll/2

主形式和从形式下快速通行 并支撑切换

编程MSB 或LSB在前

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

有SPI忙标志位

支撑硬件CRC校验,发送形式下crc值作为最终一个字节被发送,承受形式下最终一字节主动CRC校验

支撑过错中止标志,支撑DMA功用的1字节发送和承受缓冲器:发生发送和承受恳求。

SPI总线时序介绍:

看下下图应该就会了


运用stm32 spi需求以下的进程

1.管脚由于复用的,故先装备好管脚、并翻开spi时钟

2.设置spi的作业形式

经过 SPI1_CR1 来设置,设置SPI1主机形式,设置数据格局8位,然后经过 CPOL 和 CPHA 位来设置 SCK时钟极性及采样方法。并设置 SPI1 的时钟频率(最大18Mhz),以及数据的格局(MSB 在前仍是 LSB在前)。
3.使能SPI.

SPI固件库函数

下面是初始化,有必要得结构体原型

typedef struct
{
uint16_t SPI_Direction;//设置方向 (2线全双工、2线只承受、一线发送、一线承受)

uint16_t SPI_Mode; //形式 (从或主设备)

uint16_t SPI_DataSize; //宽度 (8或16位)

uint16_t SPI_CPOL; //时钟极性 (低或高)

uint16_t SPI_CPHA; //时钟相位 (第一个或第二个跳变沿)

uint16_t SPI_NSS; //片选方法 (硬件或软件方法)

uint16_t SPI_BaudRatePrescaler; //波特率预分频 (从2—256分频)

uint16_t SPI_FirstBit; //最早发送的位 (最低位,仍是最高位在先)

uint16_t SPI_CRCPolynomial; //设置crc多项式 (数字)如7

}SPI_InitTypeDef;

下面是实例,对SPI2进行的初始化

void SPI2_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

//装备SPI2管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);

//SPI2装备选项
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

//使能SPI2
SPI_Cmd(SPI2, ENABLE);
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

以上是,初始化的一些函数,发现固件库还有许多函数没用上,下面就要谈到应用了

STM32的SPI串行外围总线接口,本程序,是将STM32的SPI装备为全双工形式,且NSS运用的软件形式。在运用SPI前,下面的这个进程咱们有必要了解,即STM32作为主机发送一个字节数据时,必定能接收到一个数据,至于数据是否处理,由程序操作。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部