10. STM32-SPI介绍

SPI介绍

SPI(Serial Peripheral Interface)是主从式同步串列通讯,可分为单工/半双工/全双工。

主要应用在EEPROM、快闪记忆体、AD转换、部分LCD上都会使用,SPI属於高速、全双工且具同步的通讯网路,连结外部设备时只需要四条线就可以完成通讯,同时节省了空间。

SPI可以分为Master与Slave两种模式,但需注意的是一个SPI通讯系统中只可以有一个Master设备,所以的操作都会由Master主动发起,若连接多个设备时则可以透过CS来选择要通讯的Slave。

优点: 仅需4条线有效减少空间、全双工通讯、资料传送快
缺点: 没有ACK机制,在资料可靠度较差,需要由使用者自行确定资料正确

STM32中的SPI:

  1. 3线全双工同步传输(SPI1,SPI2,SPI3)
  2. 8 bit or 16 bit 传输选择
  3. 可由软件or硬体选择CS
  4. 可以触发中断发送与接收旗标

SPI Pin脚说明

SPI Pin脚
具有4条线(3线也行但仅限单向传输EX:主设备传送至从设备),四条线分别为MISO、MOSI、SCLK、CS

MISO (Master In Slave Out) 主设备接收 从设备传送
MOSI (Master Out Slave In) 主设备传送 从设备接收
SCLK 系统时钟讯号 (由主设备产生)
CS 选择从设备 (由主设备控制),一般预设为低电位选中。

下方是一对一接法,分别将两设备对应的Pin脚对接即可,箭头为传输方向。
https://ithelp.ithome.com.tw/upload/images/20220315/20146325ENgSYesYvA.png
下方是一对多接法,分别将两设备的MISO、MOSI、SCLK相连後,利用不同脚位连接Slave之CS脚位,箭头为传输方向。当需要选择任一Slave时将对应CS脚位拉低即可选择。https://ithelp.ithome.com.tw/upload/images/20220315/20146325TFuDDyfXnN.png


SPI Protocol

SPI通讯有4种不同的模式,可以查找设备的DataSheet看看支援那些模式~

模式 CPOL CPHA
Mode 0 0 0
Mode 1 0 1
Mode 2 1 0
Mode 3 1 1

CPOL : 用来设定SCLK的电位,什麽时候是忙碌什麽时候是空闲
CPHA : 决定资料采样点是在第几个边缘

  • CPOL=0,当SCLK=0时属於空闲状态,所以有效状态是SCLK在高电位时
  • CPOL=1,当SCLK=1时属於空闲状态,所以有效状态是SCLK在低电位时
  • CPHA=0,代表的是资料采样是在第1个边缘,资料发送在第2个边缘
  • CPHA=1,代表的是资料采样是在第2个边缘,资料发送在第1个边缘
    https://ithelp.ithome.com.tw/upload/images/20220315/20146325NfzyKkiGke.jpg
    总结一下四种模式的特性:
    CPOL= 0 CPHA = 0 : 代表SCLK电位时为空闲状态,由低电位转为高电位时进行采样,也就是上升沿。(第一个边缘)
    CPOL= 0 CPHA = 1 : 代表SCLK电位时为空闲状态,由高电位转为低电位时进行采样,也就是下降沿(第二个边缘)
    CPOL= 1 CPHA = 0 : 代表SCLK电位时为空闲状态,由高电位转为低电位时进行采样,也就是下升沿。(第一个边缘)
    CPOL= 1 CPHA = 1 : 代表SCLK电位时为空闲状态,由低电位转为高电位时进行采样,也就是上升沿。(第二个边缘)

比较UART与SPI

  1. UART 与 SPI 接线方式,下图为UART接线方法可以看到两设备为TX与RX分别对接,同时仅能进行一对一传输,无法像SPI设备可以达到一对多的传输。
  2. UART为全双工、异步通讯且没有SCLK线,所以事先要先设定好baud rate,速度较慢,而SPI是全双工且因具有SCLK线可以执行同步通讯,传输速率较高。

UART通讯架构

https://ithelp.ithome.com.tw/upload/images/20220315/20146325dv6A8UvTgj.png

SPI通讯架构

https://ithelp.ithome.com.tw/upload/images/20220315/20146325ByVDOP5r3J.png


函数介绍

  1. SPI传送 : 轮询方式
//hspi SPI编号
//pData 要发送的资料
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  1. SPI接收 : 轮询方式
//hspi SPI编号
//pData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  1. SPI接收与传送 : 轮询方式,传送与接收同步进行。

(SPI工作方式是每发送1个bit就会同步接收一个bit),在使用是要注意所设的缓冲器大小

//hspi SPI编号
//pTxData
//pRxData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

同样的与前面所提到USART一样,除了轮询方式以外同样有中断的传送方式~

  1. SPI 传送 : 透过中断方式
//hspi SPI编号
//pData 要发送的资料
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
  1. SPI接收 : 透过中断方式
//hspi SPI编号
//pData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
  1. SPI接收与传送 : 透过中断方式,传送与接收同步进行。
//hspi SPI编号
//pTxData
//pRxData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
  1. SPI 接收回调函数
__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hspi);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_SPI_RxCpltCallback should be implemented in the user file
   */
}
  1. SPI 传送回调函数
__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(hspi);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_SPI_TxRxCpltCallback should be implemented in the user file
   */
}

<<:  计算机概论 - 程序语言 Programming Languages

>>:  免费小学堂 | 每日1小时 UiPath 大中华区线上讲堂

Day26 laravel mail 登入系统 忘记密码

Day26 laravel mail 登入系统 忘记密码 一个好的登入系统,当然少不了忘记密码的功能...

【JavaScript】变数

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...

[Angular] Day4. Component

讲完前面几张比较偏向原理与不常使用到的章节後,从这章节开始会介绍比较实际运用的东西。 就像在 Day...

【额外分享】How To Test The Smart Contract Of iParking NFT With Foundry

tags: swfLAB ⚠️ Of course this is only my personal...

Render Functions

今天要介绍的是Render Functions 先来看一段官网对render function的介绍...