SPI(Serial Peripheral Interface)是主从式同步串列通讯,可分为单工/半双工/全双工。
主要应用在EEPROM、快闪记忆体、AD转换、部分LCD上都会使用,SPI属於高速、全双工且具同步的通讯网路,连结外部设备时只需要四条线就可以完成通讯,同时节省了空间。
SPI可以分为Master与Slave两种模式,但需注意的是一个SPI通讯系统中只可以有一个Master设备,所以的操作都会由Master主动发起,若连接多个设备时则可以透过CS来选择要通讯的Slave。
优点: 仅需4条线有效减少空间、全双工通讯、资料传送快
缺点: 没有ACK机制,在资料可靠度较差,需要由使用者自行确定资料正确
STM32中的SPI:
SPI Pin脚
具有4条线(3线也行但仅限单向传输EX:主设备传送至从设备),四条线分别为MISO、MOSI、SCLK、CS
MISO (Master In Slave Out) | 主设备接收 从设备传送 |
---|---|
MOSI (Master Out Slave In) | 主设备传送 从设备接收 |
SCLK | 系统时钟讯号 (由主设备产生) |
CS | 选择从设备 (由主设备控制),一般预设为低电位选中。 |
下方是一对一接法,分别将两设备对应的Pin脚对接即可,箭头为传输方向。
下方是一对多接法,分别将两设备的MISO、MOSI、SCLK相连後,利用不同脚位连接Slave之CS脚位,箭头为传输方向。当需要选择任一Slave时将对应CS脚位拉低即可选择。
SPI通讯有4种不同的模式,可以查找设备的DataSheet看看支援那些模式~
模式 | CPOL | CPHA |
---|---|---|
Mode 0 | 0 | 0 |
Mode 1 | 0 | 1 |
Mode 2 | 1 | 0 |
Mode 3 | 1 | 1 |
CPOL : 用来设定SCLK的电位,什麽时候是忙碌什麽时候是空闲
CPHA : 决定资料采样点是在第几个边缘
//hspi SPI编号
//pData 要发送的资料
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
//hspi SPI编号
//pData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)
(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一样,除了轮询方式以外同样有中断的传送方式~
//hspi SPI编号
//pData 要发送的资料
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
//hspi SPI编号
//pData 资料接收buf
//Size 资料大小 (byte)
//TimeOut 逾时
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
//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)
__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
*/
}
__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 登入系统 忘记密码 一个好的登入系统,当然少不了忘记密码的功能...
【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...
讲完前面几张比较偏向原理与不常使用到的章节後,从这章节开始会介绍比较实际运用的东西。 就像在 Day...
tags: swfLAB ⚠️ Of course this is only my personal...
今天要介绍的是Render Functions 先来看一段官网对render function的介绍...