news 2026/10/27 3:06:57

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/10/26 11:39:09

中小企业必看!5款低代码工具帮你快速搭上业务系统

概述这段时间在帮公司和朋友找低代码平台&#xff0c;陆续试了好几款&#xff0c;发现现在免费低代码工具真的已经很好用了&#xff0c;不懂代码也能自己搭系统、做表单、建流程&#xff0c;效率提升特别明显。整理了一份我亲测觉得不错的平台清单&#xff0c;适合新手、团队、…

作者头像 李华
网站建设 2026/10/25 13:12:57

PGVector 详解:PostgreSQL 世界里的向量能力插件

PGVector 详解&#xff1a;PostgreSQL 世界里的向量能力插件一篇从原理、能力边界到工程实践的 PGVector 全面解析一、PGVector 是什么 PGVector 是 PostgreSQL 的一个扩展&#xff08;Extension&#xff09;&#xff0c;用于在 PostgreSQL 中引入 向量&#xff08;Vector&…

作者头像 李华
网站建设 2026/10/26 22:31:16

Java集合接口深度剖析:List、Map、Set的特点及应用

文章目录 Java集合接口深度剖析&#xff1a;List、Map、Set的特点及应用一、引言&#xff1a;为什么要学习集合框架&#xff1f;二、List接口&#xff1a;有序的“购物车”1. List的特点2. 常用实现类&#xff08;1&#xff09;ArrayList&#xff08;2&#xff09;LinkedList&a…

作者头像 李华
网站建设 2026/10/23 0:29:18

React 项目的启动方式

一、启动前先确认 3 件事&#xff08;很重要&#xff09; 在项目根目录&#xff08;有 package.json 的地方&#xff09;&#xff1a; 1. 确认 Node 版本 node -v npm -v一般建议 Node ≥ 18&#xff08;Vite / 现代 React 很稳&#xff09; 如果报错&#xff0c;大概率是…

作者头像 李华