拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CH341A不止刷BIOS:I2C传感器与SPI Flash读写实战指南

CH341A这颗芯片在硬件圈子里最出圈的用途就是刷BIOS。无论是老主板救砖、给路由器换固件还是笔记本刷写很多人手里都有那么一块蓝色小板子。但我发现一个特别普遍的现象大家买完CH341A之后除了插上25系列SPI Flash座子刷个BIOS剩下的排针和24系列座子基本都在吃灰。其实CH341A本身就是一颗USB总线转接芯片SPI和I2C功能是它自带的核心能力刷BIOS只是SPI模式下的一个典型应用。这篇文章我就把它的I2C传感器读写和SPI Flash读写两条线完整走一遍从原理、接线、软件到常见坑保证你读完能直接上手。先说明一下适用人群手里已经有CH341A编程器但不知道还能干别的、想做传感器数据采集的嵌入式新手、需要批量读写EEPROM或SPI Flash的维修调试党都合适。如果你完全不熟悉I2C和SPI也不用担心我会把这两个协议用大白话讲清楚。1. 为什么CH341A能做的不止刷BIOS1.1 它其实是一颗“万能转接器”先搞清楚CH341A是什么。它是一颗USB总线转接芯片通过USB连接电脑后内部可以切换成三种工作模式UART串口模式、并口模式EPP/ECP、以及SPI/I2C主机模式。市面上那些蓝色CH341A编程器小板本质就是把芯片的引脚引出来加上25系列SPI Flash座、24系列I2C EEPROM座、部分还有1.8V/3.3V/5V电压选择跳线方便直接用。I2C模式下芯片会提供SCL时钟和SDA数据两根线外加GND和VCC。SPI模式下提供CS片选、SCK时钟、MOSI主出从入、MISO主入从出四根线。所以从硬件角度看这小板子天生就是个I2C主机和SPI主机可以接几乎所有低速I2C传感器SHT30、MPU6050、BH1750等和标准SPI NOR FlashW25Q系列、MX25系列、GD25系列等。很多人没意识到的是板子上的24系列座子其实就是I2C总线虽然它名义上是给24C01/24C02这类EEPROM用的但SDA和SCL两根线是完全标准的I2C信号。所以如果你要接一个I2C传感器完全可以借用24座上的SDA/SCL/GND/VCC用杜邦线飞出来或者直接从排针上取信号。1.2 为什么“刷BIOS”成了它的代名词CH341A在中文互联网上被叫成“刷BIOS神器”是因为绝大多数主板、显卡、路由器的固件芯片用的都是25系列SPI Flash而CH341A恰好支持SPI主机模式硬件上可以直接读写这类芯片。加上这块板子便宜、操作简单软件生态成熟于是“CH341A刷BIOS”的印象就被牢牢焊死了。但这也带来一个副作用围绕CH341A的大多数教程都在讲怎么备份和写入BIOS文件I2C功能很少有人系统性讲。我猜原因有两个第一I2C方向需要自己找工具和资料不像刷BIOS那样有大批现成教程第二I2C读写需要理解设备地址、寄存器这些概念门槛比SPI Flash高一点。结果就是一块功能很全的调试板被大多数人用成了“只会刷BIOS的专用工具”。其实只要把它的I2C功能用起来你会发现它完全可以胜任传感器调试、EEPROM批量烧录、I2C设备故障排查这些日常工作性价比非常高。1.3 它和树莓派、逻辑分析仪、专业编程器的区别有读者可能会问我想调试传感器为什么不用Arduino或者树莓派我想抓协议为什么不用逻辑分析仪我想烧芯片为什么不用专业的编程器这几个工具确实存在功能重叠但使用场景完全不同。工具核心功能上手难度适合场景价格参考CH341A编程器SPI/I2C读写、低速逻辑分析、串口低维修、调试、小批量烧录十几到几十元Arduino/ESP32可编程控制、传感器采集中做产品原型、交互控制几十元树莓派完整系统、GPIO扩展中高复杂系统、网络化项目几百元逻辑分析仪高速协议抓取、时序分析中排查I2C/SPI/UART通信问题几十到上千元专业编程器芯片全兼容、高速批量烧录中高工厂烧录、大规模维修几百元起步我的观点是CH341A不是这些工具里最强的而是“什么都带一点”的均衡型选手。它最大的优势是便宜、即插即用、软件生态成熟。对嵌入式入门、维修佬、实验室调试来说它比树莓派简单比专业编程器便宜虽然逻辑分析功能比不过专用仪器但胜在一个工具干多件事。2. 环境准备驱动、模式切换和软件工具2.1 驱动安装三个平台的差异和坑Windows下去WCH官网下载CH341驱动即可。安装完后在设备管理器里能看到CH341设备。有个容易踩的坑如果你的电脑以前装过非常老的CH341驱动又插了多个USB转串口设备可能遇到设备号冲突或者驱动签名问题。这时候建议先把老驱动卸载干净重启后再装新版。Linux下就省心很多。内核自带ch341串口驱动不过注意flashrom这类工具走的是libusb直接访问方式反而不依赖内核驱动。也就是说Linux下一般不需要额外装驱动插上板子后lsusb能看到设备flashrom识别出芯片就能干活。如果发行版自带的flashrom没编入ch341a_spi支持可能需要自己从源码编译一次这个后面会细说。macOS下也能用官方有驱动但I2C方向的软件支持不如Windows丰富。如果主力机是Mac我的建议是装个虚拟机或者用一个旧Windows笔记本跑这些工具省心很多。2.2 工作模式切换不用动硬件CH341A的UART、并口、SPI/I2C模式之间切换是由软件通过USB控制命令完成的不需要拨开关、不需要跳线这也是它方便的地方。比如你用AsProgrammer打开软件它会自动把芯片切到SPI/I2C模式你把它当串口用时串口工具会自动切到UART模式。但这里有个细节要提醒CH341A和CH340不是一回事。CH340是单纯的USB转串口芯片没有SPI/I2C功能CH341A才是带SPI/I2C的那个。很多人买了CH340模块后问我为什么不能刷BIOS、不能读传感器就是因为芯片型号不一样别买错。2.3 工具链我平时用这几套Windows下我首选AsProgrammer。这软件图形化、体积小、支持CH341A的SPI和I2C芯片数据库也很全既能读25系列Flash也能扫I2C总线和读写EEPROM。另外一个老牌工具是ch341eeprom专门用来读写24系列I2C EEPROM操作极其简单适合只想读个EEPROM的场景。Linux下SPI Flash读写用flashrom这个是命令行工具功能强、支持芯片多。I2C方向没有特别统一的命令行工具我一般用libusb写Python脚本或者临时用Windows虚拟机里的AsProgrammer。如果你想抓I2C时序波形PulseViewsigrok支持把CH341A当逻辑分析仪用采样率不高但抓个100kHz/400kHz的I2C时序绰绰有余。这个功能特别适合排查“总线忙”“无ACK”这类疑难杂症。3. 手把手实战用CH341A读写I2C传感器3.1 先搞懂I2C的两个底层问题开漏输出和上拉电阻I2C协议本身不复杂SCL提供时钟SDA传输数据主设备发起通信从设备通过地址应答。但有两个概念新手经常栽跟头一个是开漏输出一个是上拉电阻。开漏这个词听着吓人其实可以这么理解I2C的SDA和SCL线所有设备都不能主动输出高电平只能选择“拉低”或者“释放”。释放之后总线电平由外部上拉电阻拉高。这样做的好处是多个设备可以共享同一根线同时拉低也不会造成短路。如果改成推挽输出两个设备一个输出高一个输出低直接就把总线干废了。上拉电阻的取值很关键。选太小低电平时的灌电流太大设备可能拉不低选太大总线电容充电慢上升沿变缓通信速率上不去甚至信号畸变。热词里那个“i2c上拉电阻小了不通信”说的就是这个上拉电阻过小导致低电平不够低从设备无法正确识别。电阻范围可以用两个公式估算。下限是保证低电平能拉到位Rp_min (VCC - VOL_max) / IOL_max。以3.3V总线为例VOL_max按0.4VIOL_max按3mA算Rp_min约等于966Ω。上限是保证上升沿够快Rp_max t_r / (0.8473 × Cbus)。按100kHz的I2C、上升时间1μs、总线电容100pF算Rp_max约等于11.8kΩ。所以常见模块上用4.7kΩ很合理兼顾了速度和功耗。如果线比较长或者设备多我会换成2.2kΩ如果只是短距离调试10kΩ也不是不能用。3.2 接线从24座飞线或排针接线以最常见的SHT30温湿度传感器模块为例。模块一般有四个引脚VCC、GND、SCL、SDA板子上通常已经带了4.7kΩ上拉电阻。接线非常简单CH341A板SHT30模块VCC选3.3VVCCGNDGNDSCLSCLSDASDA操作里有几个原则。第一先接GND再接VCC不要带电插拔模块很便宜但烧掉也影响排查思路。第二CH341A板的3.3V是板载LDO转出来的带一个低功耗传感器没问题但如果你同时接好几个传感器建议外部供电并且把GND和CH341A共地。第三SDA和SCL不要接反很多传感器误接反不会马上坏但会表现为扫描不到地址浪费时间。如果是MPU6050这类模块接线完全一样只是模块供电一般是3.3V特别注意别接到VCC 5V档否则可能直接损坏。3.3 第一步扫描I2C地址I2C设备都有个7位地址主设备发地址读写位从设备匹配后回一个ACK。所以拿到一个新传感器第一件事就是扫描总线看它在哪个地址。在AsProgrammer里切到I2C模式选“扫描”或者“Bus Scan”软件会依次对0x08到0x77之间的地址发探测请求有ACK的设备会被列出来。如果你用ch341eeprom界面里也有地址扫描功能。SHT30的默认地址常见是0x44或0x45由ADDR引脚决定MPU6050是0x68或0x69。如果自己写脚本核心逻辑就是逐个地址发一个字节能收到ACK就记录。示意代码如下# 伪代码扫描I2C总线上的设备地址 import ch341a_i2c bus ch341a_i2c.CH341A() for addr in range(0x08, 0x78): try: bus.write_byte(addr, [0x00]) # 发一个字节等待ACK print(f找到设备: 0x{addr:02X}) except ch341a_i2c.NACKError: pass注意不同库的接口不一样这里展示的是思路。实际使用中如果你用libusb封装注意每次扫描前要把总线释放干净避免上一次通信残留的SDA电平影响结果。3.4 第二步读取SHT30温湿度数据扫描到地址后就可以真正读数据了。SHT30的读取流程比较典型先发送测量命令0x24 0x00周期测量、高重复性等待约20ms让芯片完成测量然后连续读6个字节分别是温度高字节、温度低字节、温度CRC、湿度高字节、湿度低字节、湿度CRC。温度和湿度的换算公式是温度 -45 175 × (原始值 / 65535)单位°C湿度 100 × (原始值 / 65535)单位%RHPython示例import time import ch341a_i2c bus ch341a_i2c.CH341A() addr 0x44 bus.write(addr, [0x24, 0x00]) # 发送测量命令 time.sleep(0.02) data bus.read(addr, 6) # 读取6字节 raw_t (data[0] 8) | data[1] raw_h (data[3] 8) | data[4] temp -45.0 175.0 * raw_t / 65535.0 hum 100.0 * raw_h / 65535.0 print(f温度: {temp:.2f}°C 湿度: {hum:.2f}%RH)这里有个小技巧数据里的CRC可以拿来校验通信质量但如果连续几次读出来的温湿度都合理CRC偶尔不一致也不用太紧张大概率是线太长或上拉电阻不合适优先排查硬件。MPU6050也是同样的套路。先读0x75寄存器拿WHO_AM_I值确认地址没错再读0x3B开始的加速度数据、0x43开始的陀螺仪数据。如果你在Arduino/ESP32上用过MPU6050的DMP库底层操作的寄存器就是这些CH341A读出来的原始值和ESP32读出来的一致可以交叉验证。3.5 I2C常见故障速查现象可能原因解决思路扫描不到任何设备SDA/SCL接反、上电顺序错、供电不足重查接线确认先GND后VCC量模块供电电压能扫描到地址但读数据全是0xFF传感器未初始化、测量命令没发对确认命令寄存器和时序等待时间加长偶尔读错、CRC老不对线太长、上拉电阻不合适、附近干扰缩短接线上拉改2.2kΩ加粗地线总线一直处于忙状态设备没释放SDA、上拉电阻缺失确认模块是否自带拉高必要时外接4.7kΩ4. 手把手实战用CH341A读写SPI Flash4.1 从BIOS芯片说起25系列SPI Flash的引脚和命令SPI Flash的引脚比I2C多但逻辑也更直白。以最常见的25系列8脚封装为例标准引脚是1脚CS#片选、2脚DO数据输出/MISO、3脚WP#写保护、4脚GND、5脚DI数据输入/MOSI、6脚CLK时钟、7脚HOLD#保持、8脚VCC。CH341A要和Flash通信本质就是发命令。常用命令有很多但调试时你只需记住几个核心的0x9F读JEDEC ID0x03按地址读数据0x06写使能0x02页编程0x20扇区擦除0x05读状态寄存器。以W25Q64为例发送0x9F后会返回三个字节EF 40 17EF表示Winbond40是SPI类型17表示容量是64Mbit。这就是识别芯片的原理。为什么CH341A能刷BIOS因为BIOS芯片就是SPI NOR FlashCH341A以SPI主机身份发出读ID、擦除、编程命令本质上和编程器做的事一模一样。只是BIOS刷写脚本把这些命令封装得更“傻瓜化”了。4.2 离线烧录 vs 板载烧录怎么选烧SPI Flash有两种方式离线烧录和板载烧录。离线烧录是把芯片拆下来放到编程器的25系列座子里接触可靠、速度稳适合需要反复擦写或者芯片已经被拆下来的场景。注意芯片1脚要对着座子上的1脚标记插反轻则识别不到重则烧芯片。板载烧录是用SOP8测试夹夹住主板上焊着的Flash不用拆焊适合刷BIOS这种场景。但板载烧录有个硬性要求目标板必须完全断电最好连电池都拔掉只留Flash芯片由CH341A供电。如果目标板上还有其他设备挂在SPI总线上有可能抢总线或者影响电平识别不到就先把夹子重新夹一遍。我的建议是能拆就拆能不拆就不拆。维修场景下如果只是读备份板载夹子够用但如果是反复调试固件拆下来放座子里最稳能少踩很多接触不良的坑。4.3 用flashrom和AsProgrammer完整读写一遍Linux下用flashrom比较顺手。先让软件识别芯片flashrom -p ch341a_spi如果支持它会打印Found Winbond flash chip W25Q64等信息。然后读取整个芯片内容到文件flashrom -p ch341a_spi -r backup.bin备份完想写入新固件flashrom -p ch341a_spi -w new.bin注意flashrom的-w操作会自动完成擦除、写入、校验三步不需要单独执行擦除命令。如果只想清空芯片可以执行flashrom -p ch341a_spi -EWindows下用AsProgrammer的流程也差不多选择CH341A设备点“识别”确认芯片型号然后“读取”保存成bin文件再“擦除”打开目标文件“写入”“校验”。和flashrom的区别是它把擦除、写入、校验拆成了独立按钮对新手更直观但也更容易漏步骤。我在实际使用中写完后一定会点一次校验校验不过就绝不认为烧录成功。4.4 SPI Flash实战避坑清单第一个坑是容量单位。W25Q64是64Mbit换算成字节是8MB不是64MB。新手经常把文件大小和芯片容量搞混拷入文件时发现装不下或者写入后校验失败。第二个坑是WP#和HOLD#引脚。这两个引脚在芯片内部有上拉但如果你用夹子板载操作周围电路可能把这些引脚拉低导致写保护生效或通信挂起。处理办法是离线座子里一般不用管默认处理好了板载夹子操作时如果写入不稳定检查这两个引脚是否被板上电路影响。第三个坑是接触不良。SOP8夹子用久了弹簧老化夹在芯片上很容易虚接。一个经验是夹好之后用万用表通断档分别量夹子另一端的线与芯片对应引脚是否导通全部通过再上电读取。别嫌麻烦这能省掉一半的“读出来全是FF”问题。第四个坑是擦除后写入失败。常见原因是供电不足。CH341A板载LDO电流有限如果你用的是USB延长线加HUB电压掉到3V以下Flash擦写就容易出问题。换一根短线直插电脑USB口大多数问题能解决。还有一个必须养成的好习惯任何写操作之前先把原芯片完整读出来存成bin文件。一旦刷进去的固件有问题随时可以用备份恢复。这个习惯救了我不下十次。5. 把CH341A玩明白的几条硬件经验5.1 电平选择3.3V和5V别搞混CH341A板上常见的电压选择是3.3V和5V两档I2C传感器和SPI Flash绝大多数是3.3V器件但也有一些老型号是5V的。接之前一定要查芯片手册确认供电电压。如果3.3V的芯片接到5V档轻则冒烟重则串进下一级电路。反过来5V的芯片接3.3V供电可能工作不正常表现为读ID异常、写入后校验失败。还有一个细节逻辑电平也要匹配。如果你用CH341A给3.3V的Flash供电但SPI信号的逻辑电平是跟随VCC的那没问题如果给5V芯片供电但CH341A输出的信号是3.3V有些5V芯片对高电平门槛要求比较高可能读不到。碰到这种情况加个电平转换板是最稳的。5.2 供电能力有限别指望它带大负载CH341A板的3.3V是从USB 5V经过LDO线性稳压来的电流输出能力有限。带一个SHT30、一个MPU6050这种低功耗模块没问题但如果你要同时给多个传感器、无线模块、屏幕供电就不太够用了。这时候的解法是外部电源单独供电然后把CH341A和外部电源的GND接在一起保持共地。对传感器调试来说供电不稳会导致数据跳变、随机错误。我遇到过一台CH341A接上MPU6050后读出的加速度一直有小幅跳动排除接线问题后换成外部3.3V供电立刻稳定了。所以别小看供电质量。5.3 后续还能怎么玩逻辑分析、数据采集和课程设计等I2C和SPI都熟悉了CH341A还能往几个方向扩展。第一当逻辑分析仪用。在PulseView里选择CH341A作为采集设备可以把SCL/SDA直接接到逻辑分析通道上实时抓取I2C波形。这对排查“时序到底对不对”“ACK到底回没回”特别有用。虽然采样率赶不上专业逻辑分析仪但跑100kHz的I2C足够。第二配合Python做传感器数据采集。很多开源库实现了libusb直接访问CH341A的I2C/SPI接口你可以把多个传感器挂到总线上用一个脚本定时轮询记录温湿度、加速度、光照等数据。这种玩法特别适合传感器课程设计比如做一个多传感器环境监测站CH341A负责数据采集和上传完全可行。第三和一些控制场景联动。比如云台配合倾角传感器和编码器使摄像头随臂架俯仰自动调整角度这种项目的第一步就是先确认传感器能不能读出正确数据。用CH341A把传感器端调通再交给单片机做闭环控制调试效率会高很多。我自己折腾下来最大的体会是CH341A的I2C和SPI功能就是一对双胞胎刷BIOS只是SPI这个方向的冰山一角。很多人遇到I2C传感器读不出数据就急着换设备、换软件其实问题往往出在上拉电阻、供电电平和接线顺序这些最基础的地方。最后分享一个伴随我很久的习惯任何芯片不管是传感器还是Flash拿到的第一件事永远是先备份原始数据再动手改。这个习惯能让你在踩坑之后全身而退。如果这篇文章正好帮你把手头的CH341A盘活了下次遇到陌生的传感器读不出数据你还可以回来翻翻这套流程——先扫描地址再读寄存器最后分析数据三步走完八成问题都已经解决了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门