news 2026/5/12 4:00:07

SPI通信协议详解:从基础概念到硬件配置与编程实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SPI通信协议详解:从基础概念到硬件配置与编程实现

一、SPI概念

SPI(Serial Peripheral Interface,串行外设接口)是一种同步、全双工、高速的串行通信总线协议,广泛用于微控制器(MCU)与各种外围设备(如传感器、存储器、显示屏、ADC/DAC 等)之间的短距离通信。

二、SPI 的四根基本信号线

信号线全称方向功能
SCLKSerial Clock主 → 从时钟信号,由主设备生成
MOSIMaster Out Slave In主 → 从主设备发送数据给从设备
MISOMaster In Slave Out从 → 主从设备发送数据给主设备
CS / SSChip Select / Slave Select主 → 从片选信号,低电平有效,用于选中某个从设备

三、SPI 的工作模式:CPOL 与 CPHA

SPI ,由两个参数决定:

  1. CPOL(Clock Polarity,时钟极性)
    • CPOL = 0:SCLK 空闲时为低电平
    • CPOL = 1:SCLK 空闲时为高电平
  2. CPHA(Clock Phase,时钟相位)
    • CPHA = 0:在第1个时钟边沿采样数据
    • CPHA = 1:在第2个时钟边沿采样数据
四种模式时序图

三、硬件连接

ECSPI3 信号复用源(ALT5)对应 GPIO
MISOUART2_RTS_BGPIO1_IO14
MOSIUART2_CTS_BGPIO1_IO15
SCLKUART2_RX_DATAGPIO1_IO16
SS0 (CS)——(未使用硬件 SS0)GPIO1_IO20(软件控制)

四、驱动代码

1. 引脚复用与电气特性配置

//复用功能 IOMUXC_SetPinMux(IOMUXC_UART2_RTS_B_ECSPI3_MISO, 0); IOMUXC_SetPinMux(IOMUXC_UART2_CTS_B_ECSPI3_MOSI, 0); IOMUXC_SetPinMux(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK, 0); IOMUXC_SetPinMux(IOMUXC_UART2_TX_DATA_GPIO1_IO20, 0); 、 //电气特性 IOMUXC_SetPinConfig(IOMUXC_UART2_RTS_B_ECSPI3_MISO, 0x10B1); IOMUXC_SetPinConfig(IOMUXC_UART2_CTS_B_ECSPI3_MOSI, 0x10B1); IOMUXC_SetPinConfig(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK, 0x10B1); IOMUXC_SetPinConfig(IOMUXC_UART2_TX_DATA_GPIO1_IO20, 0x10B1);
  • 将 UART2 相关引脚复用为 ECSPI3 的 MISO、MOSI、SCLK 功能,CS 保留为 GPIO。
  • 0x10B1配置引脚为高速、100K 上拉、施密特触发,适用于稳定高速 SPI 通信。

2.片选(CS)GPIO 初始化

//片选信号线闲时为高 GPIO1->GDIR |= (1 << 20); GPIO1->DR |= (1 << 20);
  • GPIO1_IO20 配置为输出,默认高电平,符合 SPI 器件“低电平有效”的片选逻辑。
  • 实际通信时需软件手动拉低/拉高 CS 控制传输起止。

3.ECSPI3 核心寄存器配置

(1)CONREG(控制寄存器)

ECSPI3->CONREG = 0; ECSPI3->CONREG |= (7 << 20) | (0x0E << 12) | (2 << 8) | (1 << 4) | (1 << 3) | (1 << 0);
  • 设置数据宽度为 8 位,SCLK 分频为 15(约 4.4 MHz),工作在 SPI Mode 0。
  • 启用 TX/RX FIFO 并激活 ECSPI 模块。

(2)CONFIGREG(配置寄存器)

ECSPI3->CONFIGREG = 0; ECSPI3->CONFIGREG |= (1 << 20) | (1 << 4) | (1 << 0);

4.全双工数据收发函数

unsigned int spi3_ch0_write_and_read(unsigned int data) { unsigned int ret = 0; ECSPI3->CONREG &= ~(3 << 18); while((ECSPI3 ->STATREG & (1 << 0)) == 0); ECSPI3->TXDATA = data; while((ECSPI3 ->STATREG & (1 << 3)) == 0); ret = ECSPI3->RXDATA; return ret; }
  • 采用轮询方式等待 FIFO 状态,实现同步发送与接收。
  • 调用者需自行管理 CS 信号,函数本身仅处理数据收发。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 3:58:44

Python pymodbus模块详解

好的&#xff0c;我们来详细讲解一下 Python 的 pymodbus 模块。概述pymodbus 是一个用纯 Python 实现的 Modbus 协议栈。Modbus 是一种广泛应用于工业自动化领域的串行通信协议&#xff0c;常用于连接 PLC&#xff08;可编程逻辑控制器&#xff09;、传感器、仪表等设备。pymo…

作者头像 李华
网站建设 2026/5/5 7:20:40

day70(1.29)——leetcode面试经典150

210. 课程表 II 210. 课程表Ⅱ 这题跟之前那题一样&#xff01;&#xff01;&#xff01; 题目&#xff1a; 题解&#xff1a; class Solution {public int[] findOrder(int numCourses, int[][] prerequisites) {//创建记录先修课程int[] pres new int[numCourses];//创建…

作者头像 李华
网站建设 2026/5/10 8:38:47

部署Z-Image-Turbo踩坑记录,这些问题你可能也会遇到

部署Z-Image-Turbo踩坑记录&#xff0c;这些问题你可能也会遇到 1. 为什么选Z-Image-Turbo&#xff1f;不是所有“快”都一样 第一次看到“Z-Image-Turbo”这个名字时&#xff0c;我下意识以为又是个营销噱头——毕竟现在叫“Turbo”“Ultra”“Pro Max”的模型太多了。直到我…

作者头像 李华
网站建设 2026/5/5 9:03:35

当企业面对智能化转型,如何借助AI销冠系统提升数字员工的工作表现?

数字员工在当前智能化转型的过程中扮演着越来越重要的角色。他们通过AI销冠系统得以优化业务流程&#xff0c;使企业能够在竞争激烈的市场环境中保持高效和灵活。数字员工利用这一系统的智能功能&#xff0c;能够在客户沟通、数据处理和市场分析方面实现显著提升。他们能够快速…

作者头像 李华
网站建设 2026/5/11 13:37:33

黑芝麻智能与萝卜快跑达成战略合作,共同打造无人驾驶生态圈

1月29日&#xff0c;黑芝麻智能与百度旗下萝卜快跑正式签署战略合作协议。黑芝麻智能作为萝卜快跑合作范围内产品研发的算力芯片技术支撑单位&#xff0c;全力配合萝卜快跑产品的相关技术研究及成果转化&#xff1b;萝卜快跑在方案验证等方面为黑芝麻智能提供指导、支持。双方将…

作者头像 李华