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外设

 

posted @ 2020-08-10 15:34  阿韬  阅读(811)  评论(0)    收藏  举报