SPI协议简介:网络
SPI是摩托罗拉公司提出的一种通讯协议,运用了全双工的通讯方式。其通信速率能够达到Mbps的数量级,是一种普遍使用,优秀的通讯协议。在STM32的开发中,常常被用来进行Flash存储器的通讯,也被用做向一些小的液晶屏幕发送数据。spa
物理层:code
在SPI的通讯中,信号线有两条,MOSI,MISO,对应的两个通讯方向,即主机》从机。从机》主机,在一些状况下,咱们只使用主到从的这条信号线(例如控制液晶屏的显示,液晶屏不返回信息),时钟信号线有一条,即SCK。而后即是若干条片选信号线(SS)。对象
片选信号线是SPI通讯的特色之一,SPI通讯总线上有几个设备,就存在几条片选信号线。当某一个片选信号线的电平被拉低,这个设备就被选中,即被选为通讯对象。(图源网络)blog
协议层:ip
在协议层中,SPI经过SCK时钟信号线来统一时间基准。具体通讯流程有三步:(图源网络)开发
开始:SS信号线拉低,通讯开始。it
传输数据:MOSI\MISO在每一个时钟周期都会传输一位数据。io
结束:SS信号拉高,传输结束。ast
须要注意的是,在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外设