新塘单片机快速入门:I2C/SPI总线与外部设备扩展
一句话定调简单说I2C和SPI就是单片机用来和外部设备“打电话”的两种不同方式——一个像打群架时轮流发言I2C一个像领导单独找每个人谈话SPI。推荐一个学习网站http://easelearningai.com 输入学习主题会根据你的知识背景帮你把学习内容讲得通俗易懂。为什么会有这两种“电话线”想象一下你只有一个单片机大脑但你想连接温度传感器、显示屏、存储卡、加速度计……一大堆外设。每个外设都需要和单片机交换数据。如果每个设备都单独拉一根线到单片机那单片机上的引脚就像人的手指头根本不够用——新塘单片机一般只有几十个引脚而你需要接十几个甚至几十个设备。于是工程师们发明了“总线”这个概念。总线就是一条共享的通信线路所有设备都挂在这条线上通过约定好的规则轮流说话互不干扰。但问题来了不同的外设“性格”不同。有的需要高速传输比如摄像头有的只需要偶尔传几个数字比如温度传感器有的需要同时和多个设备对话……所以出现了两种主流的“电话系统”I2C和SPI。I2C像班级里的“举手发言”生活类比想象一个班级老师单片机要问全班同学问题。每个同学都有一个学号地址。老师喊“学号5的同学请回答”只有学号5的同学站起来说话其他同学安静听着。说完后老师再叫下一个。这就是I2C的工作方式。核心特点只需要两根线一根是时钟线SCL就像老师拍手的节奏一根是数据线SDA就像同学说话的内容每个设备有唯一地址就像每个同学有学号I2C设备出厂时就固定了地址比如0x50、0x68主从模式单片机是“主设备”老师外设是“从设备”学生只有主设备能发起对话真实场景读取温度传感器你买了一个LM75温度传感器模块。它只有4个引脚VCC电源、GND地、SCL时钟、SDA数据。你想读取当前温度步骤是这样的单片机通过SCL线发出时钟脉冲就像老师开始拍手单片机在SDA线上发送“0x48”LM75的地址后面跟一个“读”指令LM75听到自己的地址回应“我在”单片机继续发送时钟LM75开始把温度数据比如25.3°C一位一位传回来传输结束单片机停止时钟整个过程就像老师喊“学号48的同学报一下你的温度”——48号同学站起来回答“25.3度”——老师记录完毕。为什么叫“I2C”全称是Inter-Integrated Circuit集成电路间通信读作“I方C”。因为只需要两根线所以特别适合连接那些“不着急”的设备——温度传感器、实时时钟、EEPROM存储器等。速度一般在100kHz到400kHz之间每秒传10万到40万位数据够用但不算快。新塘单片机怎么用I2C新塘的NuMicro系列单片机内置了I2C硬件模块。你只需要在代码中配置SCL和SDA引脚比如PB0和PB1设置通信速度标准模式100kHz或快速模式400kHz调用库函数发送设备地址和数据比如读取LM75温度的伪代码I2C_Start(); // 发起通信 I2C_SendAddr(0x48); // 告诉LM75我要找你 I2C_SendData(0x00); // 告诉LM75我要读温度寄存器 I2C_Start(); // 重新发起读操作需要 I2C_SendAddr(0x48 | 0x01); // 告诉LM75现在我要读数据 temp I2C_ReadData(); // 接收温度值 I2C_Stop(); // 结束通信SPI像领导单独找每个人谈话生活类比现在换一个场景你是公司领导单片机手下有4个部门经理外设。你要给每个经理单独布置任务。你不可能在全体大会上说“销售部你们要……”因为这样其他部门会听到机密。所以你一个一个叫到办公室关上门单独谈。每次只和一个经理对话速度快保密性好。核心特点需要四根线MOSI主输出从输入领导说话的内容MISO主输入从输出经理回答的内容SCLK时钟领导拍手的节奏CS片选领导喊“某某经理进来”——每个经理有一根单独的CS线全双工可以同时发送和接收就像领导说话的同时经理也在回答速度极快可达几十MHz每秒几千万位比I2C快几十倍真实场景驱动OLED显示屏你买了一个0.96寸OLED显示屏它使用SPI接口。它有7个引脚VCC、GND、SCLK、MOSI、CS、DC数据/命令选择、RST复位。你想在屏幕上显示“Hello”单片机把CS引脚拉低就像喊“显示屏进来”通过SCLK发出时钟同时通过MOSI发送命令比如“清屏”再发送数据比如每个像素的颜色值发送完毕把CS拉高“出去吧叫下一个”整个过程就像领导把显示屏经理叫进办公室说“把黑板擦干净”然后说“写上Hello这几个字”说完后让他出去。为什么叫“SPI”全称是Serial Peripheral Interface串行外设接口。因为每个设备都有单独的CS线所以可以同时连接多个设备而且互不干扰。特别适合需要高速传输的设备——SD卡、显示屏、ADC模数转换器、无线模块等。新塘单片机怎么用SPI新塘单片机同样内置了SPI硬件模块。配置步骤设置SCLK、MOSI、MISO引脚比如PA0-PA3为每个外设备分配一个CS引脚可以用普通GPIO设置时钟极性和相位和外设匹配调用库函数传输数据比如向OLED发送一个字节CS_LOW(); // 选中显示屏 SPI_SendByte(0xAF); // 发送“显示开启”命令 CS_HIGH(); // 取消选中I2C vs SPI怎么选特性I2CSPI连线数量2根SCLSDA4根SCLKMOSIMISOCS每多一个设备加一根CS速度100kHz~400kHz慢最高几十MHz快通信方式半双工轮流说话全双工同时说和听设备寻址软件寻址7位或10位地址硬件片选每设备一根CS线典型应用温度传感器、EEPROM、实时时钟显示屏、SD卡、无线模块、ADC适合场景设备多、速度要求不高、引脚有限速度要求高、设备少、引脚够用一句话决策如果你要接5个以上的慢速传感器选I2C省引脚如果你要驱动一个高分辨率显示屏选SPI要速度。在真实项目中如何选择假设你正在用新塘单片机做一个智能家居控制面板需要连接的设备温湿度传感器DHT22—— 慢速I2C合适实时时钟DS3231—— 慢速I2C合适OLED显示屏128x64—— 需要刷新SPI合适SD卡存储日志 —— 需要高速写入SPI合适4个按键 —— 直接接GPIO不需要总线方案I2C总线挂载温湿度传感器地址0x40 实时时钟地址0x68—— 只用2根线SPI总线挂载OLED显示屏CS接PA0 SD卡CS接PA1—— 共用SCLK、MOSI、MISO各用一根CS这样你只用了6个引脚2个I2C 4个SPI就连接了4个外设。如果每个设备单独接需要至少8个引脚每个设备至少2根数据线。最后一点提醒初学者最容易犯的错误是忘记上拉电阻。I2C的两根线SCL和SDA是开漏输出可以理解为“只能拉低不能拉高”所以必须接上拉电阻通常4.7kΩ到电源否则信号传不出去。而SPI不需要上拉电阻因为它是推挽输出既能拉高也能拉低。新塘单片机开发板上通常已经集成了这些电阻但如果你自己搭电路一定要记得加上。总结I2C像班级里老师点名省线但慢SPI像领导单独谈话快但费线。根据你的外设数量和速度需求选对总线就能用最少的引脚连接最多的设备。下次看到某个模块标注“I2C接口”或“SPI接口”你就知道它用的是哪种“电话系统”了。