0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探秘 SPI 总线

KiCad 来源:KiCad 作者:KiCad 2025-03-25 11:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

详解串行外设接口及其与存储器、显示屏、Wi-Fi模块和SD卡的通信应用。

wKgZO2fiH7aATIdwAAG5L5i7K3I122.png

在先前文章中,我探讨了现代 OLED 显示屏与裸机微控制器对接的惊人便捷性。我的观点很简单:多数嵌入式应用中,采用完整 Linux SoC 平台(如树莓派)不仅冗余,反而会引发更多待解难题。

可能会有人反驳:OLED 模块或许是个特例。比如为 MCU 添加无线连接或外部闪存模块,工程复杂度必定陡增。

虽无普适答案,但我认为 OLED 相关的练习比大多数练习都要更难。在无需千兆级传输速率的场景中,嵌入式外设多采用串行外设接口(SPI):这种极其简单的全双工总线轻松实现超 50 Mbps 传输速率,且通常规避了 OLED 内存排序逻辑等异常设计。

SPI 的基本原理和操作方式很容易理解:由 MCU 主导通信流程。当需传输数据时,MCU 将对应外设的「片选」(CS-)引脚拉低,并向总线 SCK(串行时钟)线输出时钟信号。MCU 通过 MOSI(主出从入)逐位发送数据(通常在时钟上升沿触发),外设则通过 MISO(主入从出)并行回应。

wKgZO2fiH7aAfD3tAAB8Hwr_jBg107.jpg 常用(“模式 0”)的 SPI 协议要点

时钟信号在传输单个字节或其整数倍后自动停止。当 MCU 需单向接收数据时,可通过 MOSI 发送虚拟字节以激活总线时钟,同时读取 MISO 数据;同理,外设亦可借此机制保持通信同步。

尽管从某种角度来说,为 SPI 总线提供硬件驱动可能并不是绝对必要的,但很多微控制器还是会提供一个针对 SPI 总线的硬件驱动。以 ATmega328P 为例,其 SPI 数据寄存器(SPDR)具备自动收发功能:当向该寄存器写入字节时,系统自动执行 SPI 总线传输,发送数据的同时,该寄存器还会被来自 MISO(Master In Slave Out)的数据替换。传输完成时,微控制器就会在 SPI 状态寄存器(SPSR)中设置“SPI 完成”(SPIF)标志位。

假设我需要将 ATmega328P 与一款 128kB SRAM模块(型号23LC1024)对接。该模块仅有 8 个引脚:2 个电源引脚(支持 2.5-5.5V 输入),4 个基础 SPI 接口引脚,以及 2 个无需连接的冗余引脚。具体连接时,需将模块的"串行输入"(SI)引脚接至 MCU 的 MOSI 线路,"串行输出"(SO)引脚接至 MISO 线路,SCK(时钟)线需互联。最后的"片选"(CS-)引脚可接至 MCU任意输出线,本例将采用端口B的第 0 位。

完成硬件连接后,需返回微控制器进行配置:通过 DDRB 寄存器的位映射设置 MOSI 和 SCK 引脚为输出模式,MISO 为输入模式(如先前所述)。接着在 SPI 配置寄存器(SPCR)中激活两个标志位:"SPI 使能"(SPE)与"主控模式"(MSTR):

DDRB=0b11101111;SPCR= (1<< SPE) | (1 << MSTR);
除基本配置外,SPCR 寄存器还支持总线速率分频设置(如SPI2X、SPR1/SPR0位),但实验阶段默认速率(通常为系统时钟的1/4)已能满足需求。完成寄存器初始化后,可通过以下函数实现与存储控制器的单字节双向通信:

uint8_tspi_rxtx_byte(uint8_tval){ SPDR = val;while(!(SPSR & (1<< SPIF)));  return SPDR;}
应用层协议也很简单,写入流程如下:

发送写指令码 0x02

发送 3 个字节的写入地址

连续发送待写入数据流

拉高 CS- 引脚结束操作

wKgZO2fiH7aAFEk3AAK4pY1Ro4k108.png

虽然图表看似复杂,但实现这一功能的代码却简单而贴心:

voidwrite_ext_ram_bytes(uint32_taddr,constuint8_t* ptr,uint16_tlen){ PORTB &= ~1;/* CS- down */spi_rxtx_byte(0x02);spi_rxtx_byte(addr >>16);spi_rxtx_byte(addr >>8);spi_rxtx_byte(ext_addr);while(len--)spi_rxtx_byte(*(ptr++)); PORTB |=1;/* CS- up */}
读取存储器的工作原理大致相同,MCU 会发送一条 “读取 ”命令 (0x03),然后不断发送虚字节,同时保存从存储器芯片收到的响应:

voidread_ext_ram_bytes(uint32_taddr,uint8_t* ptr,uint16_tlen){ PORTB &= ~1;/* -CS down */spi_rxtx_byte(0x03);spi_rxtx_byte(addr >>16);spi_rxtx_byte(addr >>8);spi_rxtx_byte(addr);while(len--) *(ptr++) =spi_rxtx_byte(0); PORTB |=1;/* -CS up */}
无论是与SRAM芯片通信、对接非易失性闪存控制器、驱动SD存储卡,还是操作乐鑫(Espressif)等厂商推出的低成本WiFi+TCP/IP模组,SPI总线协议栈的核心交互逻辑均高度统一。
值得关注的是,当前主流WiFi模组的应用层协议竟沿用了1980年代Hayes调制解调器的指令体系(经适度现代化改造)。例如,开发者仍可通过经典"AT"指令集发起HTTP请求——这种将复古命令行与现代物联网技术深度融合的设计,堪称嵌入式领域的"复古科技彩蛋"。

原文转载自:https://lcamtuf.substack.com/p/mcu-land-part-2-mysteries-of-the,经过翻译及校验

注意:如果想第一时间收到 KiCad 内容推送,请点击下方的名片,按关注,再设为星标。

常用合集汇总:

和 Dr Peter 一起学 KiCad

KiCad 8 探秘合集

KiCad 使用经验分享

KiCad 设计项目(Made with KiCad)

常见问题与解决方法

KiCad 开发笔记

插件应用

发布记录

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    39

    文章

    7715

    浏览量

    170868
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1866

    浏览量

    99841
  • 总线
    +关注

    关注

    10

    文章

    3014

    浏览量

    91309
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SPI的多机通信

    SPI支持多机通信模式。在该模式下,主机的从机选择 CS 引脚应配置为输入,与其他主机的总线申请信号相连,用于检测 SPI 总线是否发生冲突。如果某一主机的从机选择 CS 引脚被拉为低
    发表于 12-08 06:47

    搞不定示波器SPI解码?这几步就行!

    SPI总线是为芯片间的数据通信而设计的,因此,在大多数情况下,由于传输数据的不同使得信号并非周期性信号。这就要求在对该总线进行测试时,要能准确地触发到数据帧的“头”,并将其“稳定”显示在仪器上,便于
    的头像 发表于 11-19 17:32 515次阅读
    搞不定示波器<b class='flag-5'>SPI</b>解码?这几步就行!

    探秘安全生产预警预测系统的五大顶尖平台

    探秘安全生产预警预测系统的五大顶尖平台
    的头像 发表于 10-16 09:56 980次阅读
    <b class='flag-5'>探秘</b>安全生产预警预测系统的五大顶尖平台

    深入剖析SPI协议

    SPI,全称(Serial Peripheral interface)是由摩托罗拉公司首先定义的协议,中文名为串型外围设备接口。SPI是一种高速全双工的总线协议。
    的头像 发表于 08-21 15:04 3567次阅读
    深入剖析<b class='flag-5'>SPI</b>协议

    第十七章 SPI——读写串行FLASH

    本章介绍SPI协议,其为高速全双工通信总线,含物理层、协议层内容,还讲解W55MH32的SPI特性、初始化及DMA相关配置。
    的头像 发表于 06-19 17:06 1051次阅读
    第十七章 <b class='flag-5'>SPI</b>——读写串行FLASH

    基于RK3576开发板的SPI使用说明

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线在用户空间的应用程序中
    的头像 发表于 05-07 10:31 1387次阅读
    基于RK3576开发板的<b class='flag-5'>SPI</b>使用说明

    探秘EtherCAT总线协议转换网关

    EtherCAT总线协议转换网关介绍 捷米特EtherCAT总线协议网关介绍 EtherCAT协议概述   EtherCAT协议 是一种基于以太网的工业实时通信协议,于2003年正式推出。作为工业
    的头像 发表于 04-09 10:05 2997次阅读
    <b class='flag-5'>探秘</b>EtherCAT<b class='flag-5'>总线</b>协议转换网关

    探秘Profibus现场总线协议转换网关模块

    关于Profibus协议介绍 Profibus(ProcessFieldbus)是一种用于工业自动化领域的现场总线标准,在工厂自动化和过程自动化中发挥着重要作用,以下是关于Profibus协议的详细
    的头像 发表于 03-31 10:11 697次阅读
    <b class='flag-5'>探秘</b>Profibus现场<b class='flag-5'>总线</b>协议转换网关模块

    看完这篇,SPI其实也很简单嘛(可下载)

    首先我们来简单介绍一下SPISPI是串行外设接口(SerialPeripheralInterface)简单来讲就是它一种高速的,全双工,同步的通信总线被各种总线搞的晕头转向的人来说就
    发表于 03-26 14:29 2次下载

    探秘新能源行业利器:多串保护板测试仪的革新应用

    探秘新能源行业利器:多串保护板测试仪的革新应用
    的头像 发表于 03-05 15:09 785次阅读

    对于一款新的BSP如何添加SPI驱动

    介绍SPI总线由开发,是一种,由四个IO口组成:CS、SCLK、MISO、MOSI;通常用于CPU和外设之间进行通信,常见的SPI总线设备有:TFTLCD、QSPIFLASH、时钟模块
    的头像 发表于 02-26 19:00 887次阅读
    对于一款新的BSP如何添加<b class='flag-5'>SPI</b>驱动

    探秘 5KP28A二极管:独特构造如何实现高效电压抑制?

    探秘 5KP28A二极管:独特构造如何实现高效电压抑制?
    的头像 发表于 02-08 13:41 726次阅读
    <b class='flag-5'>探秘</b> 5KP28A二极管:独特构造如何实现高效电压抑制?

    SPI通信总线概述和Verilog实现

    SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线
    的头像 发表于 02-07 14:28 1997次阅读
    <b class='flag-5'>SPI</b>通信<b class='flag-5'>总线</b>概述和Verilog实现

    I2C总线SPI总线的比较

    在现代电子系统中,微控制器与各种外设之间的通信是必不可少的。I2C和SPI是两种流行的串行通信协议,它们各自具有独特的特点和应用场景。 I2C总线 I2C是一种多主机、多从机的同步通信协议,广泛应用
    的头像 发表于 01-17 15:08 1740次阅读

    LMP91200评估板上的两组spi可以挂在同一spi总线上吗?

    评估板上的两组spi可以挂在同一spi总线上吗?ADC部分没有mosi,怎么搞?我把两个挂在了同一spi上,进行片选,adc只接了miso,在采集ADC数据时,
    发表于 12-31 06:20