STM32中的SPI

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外设
相关文章
相关标签/搜索