基于STM32详解SPI-下

举报
樊心昊 发表于 2020/07/27 17:15:39 2020/07/27
【摘要】 一、HAL库有关SPI操作的函数讲解初始化流程,这一部分是通过STM32CubeMX自动生成的代码进行初始化:① GPIO初始化 __HAL_RCC_GPIOA_CLK_ENABLE(); //打开时钟 /**SPI1 GPIO Configuration PA5 ------> SPI1_SCK PA7 ------> SPI1_...

一、HAL库有关SPI操作的函数讲解

初始化流程,这一部分是通过STM32CubeMX自动生成的代码进行初始化:

    GPIO初始化

    __HAL_RCC_GPIOA_CLK_ENABLE();     //打开时钟

    /**SPI1 GPIO Configuration   

    PA5     ------> SPI1_SCK

    PA7     ------> SPI1_MOSI

    */

    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;    //复用推挽

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  //高速率

            HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);        //初始化

    SPI初始化

__HAL_RCC_SPI1_CLK_ENABLE(); //打开时钟

  hspi1.Instance = SPI1;   //配置SPI1

  hspi1.Init.Mode = SPI_MODE_MASTER;      //主机模式

  hspi1.Init.Direction = SPI_DIRECTION_1LINE;     //半工

  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;          //8位数据

  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;    //极性位高

  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;         //第2个时钟沿采样

  hspi1.Init.NSS = SPI_NSS_SOFT;                        //软件NSS

  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; //2分频

  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;       //高位在前

  hspi1.Init.TIMode = SPI_TIMODE_DISABLE; //禁用TIMMode

  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; //禁用校验

  hspi1.Init.CRCPolynomial = 10;    //无意义

  if (HAL_SPI_Init(&hspi1) != HAL_OK)   //开始初始化

  {

    Error_Handler();

 }

 

HAL常用库函数:

阻塞发送,调用该函数可以通过SPI发送一一帧数据:

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

 

阻塞接收,调用该函数可以阻塞接收一帧数据:

HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

 

阻塞发送并接收,调用该函数可以先发送一帧数据,然后再接收一帧数据:

HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout);

 

下面我们就以上面的三个函数为例,配合逻辑分析仪,看看单片机发出的数据是什么样子的。

二、SPI时序分析实验

这里通过使用逻辑分析仪读取STM32按照上一节的配置发出的数据来给大家分析。

    PA5     ------> SPI1_SCK      CH0

PA7     ------> SPI1_MOSI     CH1

主要代码如下:

image.png

第一个参数时使用spi1发送数据的意思,第二个参数为数据的地址,第三个参数为数据大小,单位是字节,第四个参数为超时时间。

 

使用阻塞发送,发送0x12:

image.png

大家可以仔细观察图中的电平变化,上面的时钟,空闲时保持高电平,在第二个边缘采样,也就是上升沿,每个上升沿对应到下方的数据通道的电平就是数据。

二进制0001_0010 à16进制0x12

 

三、SPI协议的优缺点

优点:

    支持全双工通信

    不一定需要用特定的SPI外设实现,也可通过软件实现

    比I²C或SMBus更高的吞吐量

    消息大小(一帧数据不一定需要保证是1字节),内容和目的的任意选择

    从机不需要唯一的地址

    信号是单向的,允许简单的电偶分离

缺点:

    即使是三线式SPI,也需要比I²C更多的IC封装引脚

    没有带内寻址; 共享总线上需要带外片选信号(假设一条SPI总线上有多个SPI从机,需要单片机的其他引脚通过高低电平去控制需要被选中的外设的片选管脚)

    从机没有硬件流量控制 (但主机可以延迟下一个时钟边沿以降低传输速率)

    通常只支持一个主设备

    不支持动态添加节点


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。