STM32中的SPI
SPI协议简介:
SPI是摩托罗拉公司提出的一种通信协议,运用了全双工的通信方式。其通讯速率可以达到Mbps的数量级,是一种广泛使用,优秀的通信协议。在STM32的开发中,经常被用来进行Flash存储器的通信,也被用作向一些小的液晶屏幕发送数据。
物理层:
在SPI的通信中,信号线有两条,MOSI,MISO,对应的两个通信方向,即主机》从机。从机》主机,在一些情况下,我们只使用主到从的这条信号线(例如控制液晶屏的显示,液晶屏不返回信息),时钟信号线有一条,即SCK。然后便是若干条片选信号线(SS)。
片选信号线是SPI通信的特点之一,SPI通信总线上有几个设备,就存在几条片选信号线。当某一个片选信号线的电平被拉低,这个设备就被选中,即被选为通信对象。(图源网络)

协议层:
在协议层中,SPI通过SCK时钟信号线来统一时间基准。具体通信流程有三步:(图源网络)

开始:SS信号线拉低,通信开始。
传输数据:MOSI\MISO在每个时钟周期都会传输一位数据。
结束:SS信号拉高,传输结束。
需要注意的是,在SPI中,存在着几个不同的传输数据模式:首先,SCK在空闲时,有高电平和低电平两种状态(图中为空闲高电平)。其次,信号线会在时钟信号对的边缘进行采样(虚线位置),而采样的边缘选择有两种:奇数边缘和偶数边缘(图中为偶数边缘)。通常,我们使用SCK空闲高电平,偶数边缘采样。或者SCK空闲低电平,奇数边缘采样。
STM32中的SPI:
STM32中的SPI初始化:
void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //定义此设备为主机 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); //初始化外设SPI1寄存器 SPI_Cmd(SPI1, ENABLE); //使能SPI外设

浙公网安备 33010602011771号