尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32与MT6835磁编码器SPI调试:读回0xFF的完整排查指南

STM32与MT6835磁编码器SPI调试:读回0xFF的完整排查指南 这段时间我在调一套磁编码器角度反馈方案主控用 STM32G031传感器是麦歌恩的 MT6835两者走 SPI 通信。按说这种组合在电机控制、舵机反馈里并不少见但我第一次把代码烧进去读角度寄存器返回的全是 0xFFFF。连续两个晚上示波器、万用表、逻辑分析仪轮番上波形怎么看都正常命令也发出去了可数据就是不对。老话讲“见鬼了”说的就是这种状态一切证据都指向没问题结论却是一团糟。这篇文章把我这次“见鬼”调试的完整过程拆开讲。先复盘现象再把 STM32G031 的 SPI1 外设和 MT6835 的协议要求揉碎最后给出一套从波形到数据的排查流程。无论你是刚接触 SPI 的新手还是被某个从机芯片折磨到头秃的老手按这个思路走一遍大概率能少熬几个夜。1. 问题现象复盘SPI 读回来一片 0xFFFF波形却挑不出毛病1.1 现场还原从初始化到读寄存器的完整操作先说明硬件连接。MCU 用的是 STM32G031K6SPI 走 SPI1 的默认引脚映射SCK 在 PA5MISO 在 PA6MOSI 在 PA7。片选我没有用硬件 NSS而是把 PA4 配成普通 GPIO用软件方式控制这样后续切换片选策略时最灵活。MT6835 供电 3.3V和 MCU 同电源共地信号是通过杜邦线飞线连接的长度大概 10cm板子上其他人经常在这种环境下调 SPI所以一开始没太当回事。CubeMX 里 SPI1 的配置大概是这样的模式Full-Duplex Master数据长度8 Bits第一次踩坑就在这里后面细说时钟极性 CPOL 0时钟相位 CPHA 0即 SPI Mode 0MSB First预分频 /16APB 时钟 64MHz实际 SCK 4MHzNSS 选择 Disable也就是软件 NSSPA4 初始化为推挽输出空闲输出高电平。初始化完成后我写了下面这个读寄存器的函数static void MT6835_CS_Low(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); } static void MT6835_CS_High(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); } uint8_t MT6835_ReadReg(uint8_t reg_addr) { uint8_t cmd 0x80 | reg_addr; // 示意命令字真实命令以手册为准 uint8_t rx 0x00; MT6835_CS_Low(); HAL_SPI_Transmit(hspi1, cmd, 1, 50); // 发命令 HAL_SPI_Receive(hspi1, rx, 1, 50); // 读返回 MT6835_CS_High(); return rx; }现象很稳定通过串口把读取结果打出来用串口调试助手 SSCOM 看寄存器值统一是 0xFF。我换了好几个寄存器地址结果都一样。当时第一反应是接线问题于是拿起万用表量CS 空闲 3.3V 高电平SCK 和 MOSI 引脚上确实有脉冲MISO 也有电平跳变。再抓示波器波形也像模像样CS 低、SCK 八个脉冲、MOSI 的命令字节肉眼可辨。什么都正常就是数据不对这种情况最容易让人焦躁。1.2 为什么这类故障最容易让人怀疑人生数字接口的故障和模拟电路不一样。模拟电路出问题往往能找到波形畸变、噪声叠加这些“中间状态”你有一个渐进逼近的过程。而 SPI 这种数字协议结果非黑即白要么读回来的是你要的值要么就是一个看似“自洽”的乱码。乱码还会随着你的改动变化比如换个寄存器地址它就变个样子让你觉得好像是哪里差了一点但就是找不到那个点。另一个原因是调试手段常常给你“虚假的安全感”。示波器上看到 SCK 在跳、MOSI 有数据人就会下意识觉得“SPI 已经通了”但示波器看到的是电压波形不是采样结果。MCU 和从机在什么边沿采样、什么时刻数据线必须稳定这些细节波形上很难直观判断。我这次的问题里波形确实没毛病毛病出在协议帧的边界和片选时序上属于典型的不抓瞎不行、光看波形只能干瞪眼的情况。还有个很现实的原因这类问题通常是多个小坑叠加。比如帧长度不对是第一个坑CS 建立时间不够是第二个坑两个叠在一起现象就变得飘忽不定。如果你一次只怀疑一个原因改一次测一次很容易在几个假设之间反复横跳最后把代码改得一团糟。2. 先摸清底细STM32G031 的 SPI1 与 MT6835 的通信规矩2.1 STM32G031 SPI 外设速览引脚、帧格式与时钟配置STM32G031 是 ST 的 G0 系列Cortex-M0 内核主频最高 64MHz。小封装型号上 SPI 外设通常就一个 SPI1引脚默认映射就是 PA5/PA6/PA7。G0 的 SPI 支持全双工、半双工、单线收发数据帧长度可配置为 4~16 位工程里最常用 8 位或 16 位寄存器里还有硬件 CRC、断帧检测这类高级功能但调试初期基本用不上。第一次调 SPI 时几个核心配置必须想清楚。首先是 CPOL 和 CPHA。CPOL 决定 SCK 空闲时的电平是低还是高CPHA 决定数据在 SCK 的第一个边沿还是第二个边沿被采样。这两个参数组合起来就是大家常说的 SPI Mode 0 到 Mode 3很多新手的第一个坑就出现在这里以为“默认 Mode 0 就行”结果从机手册上写得清清楚楚要 Mode 3。我们在后面的章节再展开。其次是主模式收发是全双工特性。很多人第一次用 HAL 库调 SPI 读寄存器会下意识认为读操作就是“发一条命令然后等从机往 MISO 上放数据”。但 SPI 是全双工协议主机的 MOSI 和 MISO 同时工作Master 模式下要产生 SCK 时钟硬件就必须往 MOSI 上送数据——哪怕你只调 HAL_SPI_ReceiveHAL 库内部也会发一个 dummy 字节来“推”时钟。这本身不是问题问题在于如果你没意识到这一点就会搞不清楚 MISO 上的数据到底对应哪一拍的命令帧边界容易错位。最后是时钟速率。G0 的 SPI1 时钟来自 APB预分频可以选 /2 到 /256。第一次调新芯片我强烈建议先把 SCK 压到 1M~4MHz。飞线、杜邦线、面包板环境下高频信号边缘会变差采样点稍微偏一点数据就会跳位。等你把协议调通、波形确认干净了再慢慢把速度提上去不迟。对应地SPI 引脚的 GPIO Speed 也别设成 Low否则边沿太缓输出波形跟锯齿似的高速下必然出问题。2.2 MT6835 的 SPI 协议要点接口模式、命令帧与上电时序MT6835 是麦歌恩推出的一款磁编码器类芯片常用于电机转子角度检测、舵机反馈、云台角度闭环这一类场景。它内部通过磁感应原理计算角度对外提供角度数据和配置接口。这种芯片往往是“多面手”同一颗料可能支持 SPI、I2C、ABZ 编码器输出、UVW 换相信号、PWM 输出等多种模式具体启用哪套接口由芯片的型号后缀、封装引脚配置比如某个 MODE/SEL 引脚的电平或者内部 OTP 设定决定。这个“多接口”特性就是很多诡异调试的源头。你从原理图上看到芯片支持 SPI默认就以为上电后它一定在 SPI 模式等着你但实际上它可能因为某个引脚悬空、被外接电阻拉到了别的电平或者出厂 OTP 配置默认走了 I2C 而你在跟一个根本没开启的 SPI 从机说话。所以拿到 MT6835 这类芯片第一步不是写代码而是先翻数据手册找到接口模式选择那一章确认它到底怎么进 SPI 模式并且用万用表量一下相关引脚的实际电平。SPI 协议本身也有讲究。这类传感器通常不是简单的“寄存器地址直接读”而是有自己的一套命令帧格式比如一帧里包含读写标志位、寄存器地址、甚至 CRC 或奇偶校验位。读操作有的是一次命令直接回数据有的是先写地址再读数据有的还要区分单次读和连续读。帧长度可能是 8 位也可能是 16 位返回的数据可能是 12 位角度值外加状态位拼成 16 位。这些细节必须对照数据手册里的寄存器表和时序图一条一条抠。还有一个经常被忽略的点上电时序。传感器芯片内部要完成初始化、自检才进入正常通信状态。如果 MCU 比传感器先跑起来上电后 2ms 就发第一条 SPI 命令这时候芯片可能还没准备好第一个事务要么被丢弃要么返回垃圾数据。我习惯在系统初始化末尾加一个 50ms 以上的延时再先读芯片的 ID 或版本寄存器验证通信而不是直接读角度。注意MT6835 不同批次、不同型号后缀的寄存器地址和命令字可能有差异。我这里给的是排查思路和协议框架具体的 opcode、寄存器地址、位段定义一定以你手上最新版本的数据手册为准别直接抄网上的旧例程。2.3 顺带说清楚 I2C 和 SPI 的差别对选型的影响有人可能疑惑既然 MT6835 支持 I2C 和 SPI为什么非得用 SPI 不用 I2C这里就涉及两种总线的典型差异。SPI 通常要 4 根线SCK、MOSI、MISO、CS全双工速度可以做到很高适合需要连续读角度、实时性强的场景代价是占引脚多而且每个从机都要一根片选线。I2C 只要两根线SDA、SCL通过设备地址寻址省引脚、多从机挂载方便但半双工、速度相对慢复杂度和时序分析在调试初期也更绕。对电机控制这类应用来说角度数据要高频更新SPI 的全双工和速率优势是实打实的所以我选了 SPI。但在排查“芯片不说话”的问题时这个差异反而会误导人当你把 MOSI 接到芯片的 SDA 脚、SCK 接到 SCL 脚芯片其实工作在 I2C 模式你的 SPI 命令它当然听不懂。所以如果芯片多接口可选第一步就是确认它到底在哪个接口模式别用 SPI 波形去测一个 I2C 模式的从机。3. 首次通信最容易踩的 5 个坑按出现概率排序3.1 芯片根本没进 SPI 模式模式选择引脚被忽略这是我在很多群里回答 SPI 问题时遇到的第一大类原因。芯片数据手册第一页写着“支持 SPI”但它的 SPI 功能往往需要特定条件才开启。MT6835 这类传感器接口模式由内部 OTP/配置寄存器或者外部引脚决定。如果外部引脚悬空电平可能处于不定态芯片上电后可能随机进入某种模式就算进了 SPI 模式也可能选了 A 套引脚功能而不是你以为的那套。排查方法很简单。第一翻手册找到模式选择引脚确认它是高电平选 SPI、低电平选 I2C还是反过来。第二用万用表在上电状态下直接量这个引脚的电压确认它不是悬空的 1.6V 这种“半高不高”的电平。第三如果有外部上下拉电阻确认阻值没有选得过大导致灌电流不足。我见过不少案子最后就是一根飞线把模式脚悬空芯片时而正常时而不正常特别像“见鬼”。3.2 CPOL/CPHA 选错波形看着正常采样点刚好错过数据SPI 数据在 SCK 边沿被采样但到底是上升沿还是下降沿是第一个边沿还是第二个边沿由 CPOL 和 CPHA 共同决定。四组组合对应四种模式SPI ModeCPOLCPHASCK 空闲电平数据采样边沿000低上升沿第一个边沿101低下降沿第二个边沿210高下降沿第一个边沿311高上升沿第二个边沿如果 Mode 选错从机会在错误的边沿读数据读到的每一位都可能是上一拍的数据或者跳变中的毛刺。最坑的是示波器上看波形完全正常因为你看到的只是电平变化无法直观看出“采样点”落在哪。判断方法有两个一是看数据手册里的时序图图上一般会标 SCK 空闲电平和数据有效的边沿二是在代码里用同一个寄存器把四种 Mode 各试一遍看哪种能读出符合预期的值。实测大部分磁编码器类芯片要求 Mode 3但这不是绝对规律一定要以手册为准。3.3 帧长度与命令字错位8 位帧发 16 位命令的经典事故我这次踩的坑就在这一节。MT6835 的读命令整帧是 16 位的也就是读标志位、地址、数据请求都在同一帧里完成。我一开始按 8 位帧配置 SPI用 HAL_SPI_Transmit 发一个 8 位命令再 HAL_SPI_Receive 等 8 位返回。表面看好像“发了命令、也有响应”但芯片实际收到的是被拆成两半、前后顺序错乱的数据流状态机每次都停在半路最后返回一堆看似随机其实固定的异常值。症状的迷惑性在于它并不是每次都返回 0xFFFF有时某个寄存器会读出看起来有规律的值比如角度低 12 位全 0 而高 4 位在变。这种“部分像真”的数据最要命会诱导你以为是标定问题、是数据格式问题而不是通信帧本身错了。正确的做法是先把数据手册的命令帧结构画出来数清楚一个完整事务到底要几个 bit然后到 CubeMX 里把 SPI 数据长度配置成一致的帧长。如果芯片命令是 16 位SPI 就配 16 Bits用一个 uint16_t 变量做 TransmitReceiveuint16_t MT6835_ReadReg16(uint16_t cmd) { uint16_t rx 0x0000; MT6835_CS_Low(); delay_us(3); // 给片选建立时间 (void)HAL_SPI_TransmitReceive(hspi1, (uint8_t *)cmd, (uint8_t *)rx, 1, // 1 个 16 位帧 50); MT6835_CS_High(); return rx; }这里的 delay_us 用你工程里现成的微秒延时即可DWT 或者 SysTick 封装都行。另外字节序也要确认。MSB First 还是 LSB First 配置错了读出来的数据会整体位序颠倒看起来像从右往左念了一句从左往右写的话。多数 SPI 芯片默认 MSB first但 STM32G031 的 SPI 可以在 CubeMX 里切留意一下就行。3.4 片选时序CS 拉低的先后和低电平持续时间片选信号是很多人不重视、但经常出问题的地方。SPI 从机通常以 CS 的下降沿作为一次事务的起点以 CS 的上升沿作为终点。如果 CS 拉低之后立刻就有 SCK 边沿不满足芯片要求的建立时间第一个 bit 就会被吃掉。反过来如果最后一个 SCK 边沿刚结束就立刻拉高 CS芯片可能来不及锁存最后一个数据。这两类问题在示波器上都能看到但你得特意去量 CS 与 SCK 沿的相对位置光看单个信号是发现不了的。处理办法有两个方向。第一是在 CS 拉低和发送数据之间插入一个微秒级的延时我用的是 3us稳定后可以慢慢往下调。第二是确认 CS 低电平期间 SCK 的空闲电平。如果芯片要求 CS 低期间 SCK 保持高电平而你配置的 CPOL0 让 SCK 空闲为低那么有些严格芯片会直接判定“非法访问”整个事务作废。我的 SPI 调通后又顺手在 CubeMX 里对比了软件 NSS 和硬件 NSS 的差异硬件 NSS output 模式下SPI 使能瞬间可能产生多余的片选脉冲所以调试期我坚持用软件 CS 自己控制 PA4。3.5 上电时序、复位与电平匹配问题最后一个常见坑是“通信本身没问题但启动阶段有问题”。MCU 和传感器同电源上电时两边复位和初始化时间不同步。MCU 跑得快上电几十毫秒就开始轮询传感器传感器还在自检返回的自然是垃圾。这种问题典型特征是复位后前几次读会失败过几百毫秒再读就正常。解决方法是初始化程序最后加一个延时并且读一次芯片 ID 寄存器做握手通过握手之后才进入正常循环。电平匹配也不能忽略。STM32G031 是 3.3V IOMT6835 如果也是 3.3V 供电电平一致直连没问题但如果你的板子上有 5V 电平的情况MISO 输出超过 MCU 耐受电压或者从机的高电平达不到 MCU 的 VIH 阈值就会出现“时好时坏”的诡异现象。量一下 MISO 高电平的实际电压比猜一百遍都强。另外给传感器加一颗 100nF 去耦电容别嫌麻烦磁编码器内部测量瞬间电流变化大供电毛刺会造成偶发数据错误。4. 从波形到数据的排查流程示波器、逻辑分析仪、回环测试一次说清4.1 动手改代码前先用这几步把硬件和配置过一遍遇到“见鬼”问题最忌讳的就是上来就改代码。先花十分钟把硬件和配置过一遍很多时候能省下几个小时。我的固定顺序是量供电和地万用表直接点芯片引脚确认 VCC 是 3.3VGND 和 MCU 共地别只量了杜邦线另一端就认为没问题。量接口模式引脚翻手册找到模式选择引脚确认上电后电平符合 SPI 模式要求。核对接线定义SPI 信号的叫法太混乱了有的芯片叫 SDI/SDO有的叫 DIN/DOUT甚至还有把 MOSI 标成 SDO 的。接线时先确认 SCK 对 SCK、MOSI 对芯片的数据输入脚、MISO 对芯片的数据输出脚接反的例子我见过不止一次。复检 CubeMX 引脚配置PA5/PA6/PA7 是否确实复用为 SPI1 功能PA4 是否输出初始高电平。有人会把 MISO 误配成 GPIO 输出MOSI 误配成输入单看代码完全看不出来一查配置就露馅。这几步做完硬件侧的大问题基本能排除剩下的才轮到认真的波形分析。4.2 示波器抓 SPI 的正确姿势触发条件与关键参数示波器抓 SPI触发条件别选 SCK选 CS 下降沿。以 CS 下降沿触发你会看到完整的一次事务窗口CS 低电平期间 SCK 有几个脉冲、MOSI 每位数据什么时候变、MISO 什么时候开始响应一目了然。如果选 SCK 触发你看到的只是一堆孤立的时钟脉冲帧的边界完全对不上。在这个窗口里重点检查六件事CS 空闲是不是高电平CS 拉低到第一个 SCK 边沿之间有没有足够的建立时间SCK 空闲电平和 CPOL 配置是否一致MOSI 在采样边沿附近是否稳定有没有刚好在边沿上变化MISO 从哪个边沿开始出现有效数据CS 低电平内的 SCK 脉冲个数是否等于你期望的帧长。前两点对应的是时序问题后四点对应的是协议和配置问题任何一项不满足都得停下来查。实际操作中如果示波器只有两通道可以先抓 CS 加 SCK再把 SCK 分别和 MOSI、MISO 组合抓两次最后按 CS 窗口把波形对齐起来看。探头的接地线越短越好最好用接地弹簧不然几十 MHz 的开关噪声会叠加到波形上尤其 MISO 这种高阻态信号干扰会很明显。4.3 回环测试与打印输出先证明 MCU 这一侧是健康的要判断问题出在 MCU 侧还是从机侧最直接的办法是回环测试。把 MOSI 和 MISO 用一根短线短接断开 MT6835然后让 SPI1 发一组已知数据看接收到的和发送的一不一致。比如发 0xAA、0x55、0xA5、0x5A 这一组特征明显的字节收回来一比对就清楚了uint8_t tx_buf[4] {0xAA, 0x55, 0xA5, 0x5A}; uint8_t rx_buf[4] {0}; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(hspi1, tx_buf, rx_buf, 4, 100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 比较 tx_buf 与 rx_buf一致则 SPI1 主模式基本健康回环测试能排除一大堆 CubeMX 配置问题引脚复用有没有设对、时钟有没有打开、SPI 有没有卡在 BUSY 状态、数据帧长度是不是你想要的。如果回环都不对就不要去怀疑 MT6835 了先把自己 MCU 这边修好再说。调试期我还习惯在 SPI 收发函数里加打印通过 UART printf 把每次发的命令字和返回的原始值打出来用串口调试助手 SSCOM 看。一个简单的“地址 原始返回值”日志能让我快速发现规律比如“地址变了数据跟着变、但始终差一个偏移”这种线索远比在 Keil 里打一百个断点管用。Keil 的 Watch 窗口适合看单个变量但不适合观察一串事务的趋势而且断点暂停会破坏 SPI 定时关系反而容易引入新问题。4.4 逻辑分析仪解码的另一个“隐形坑”逻辑分析仪比示波器适合做协议解码但也有一个很隐蔽的坑解码器要你手工配置 CPOL 和 CPHA。如果你不知道实际通信是什么 Mode解码配置填错了逻辑分析仪会把波形解成完全不同的数据给你一个看起来很像“通信故障”的假象。我身边真有人因为解码配置不对白白查了一天代码。所以用逻辑分析仪时先别急着看解码结果把 SPI Decoder 关掉直接看原始波形。CS 下降沿之后对照数据手册的位序把 MOSI 和 MISO 的每一位手工点出来验算一遍。等确认了波形层面对得上再开解码器把 Mode 填对这时候解码出来的 Hex 才有参考价值。另外采样率至少要比 SCK 高 10 倍才能保证边沿判断可靠几十块钱的 24MHz 逻辑分析仪抓 4MHz 的 SCK 会有点勉强有条件上 50MHz 或 100MHz 的。5. 速查表与掏心窝的调试经验5.1 常见故障速查表把这次调试和这几年遇到过的 SPI 问题整理成一张速查表遇到现象直接对着查能少走很多弯路现象可能原因排查方法处理建议读回来全 0xFF芯片没进 SPI 模式CS 建立时间不足MISO 悬空被上拉量模式引脚电平抓 CS 到 SCK 的间隔看 MISO 空闲电平正确配置模式引脚CS 拉低后加延时读回来全 0x00MOSI/MISO 接反、虚焊MISO 被外部拉低回环测试万用表量 MISO 电压核对接线重新焊接数据整体错位左移/右移一位帧长不对CPOL/CPHA 采样边沿错逻辑分析仪手工数位四种 Mode 轮询修正帧长和 Mode高位正常低位乱SCK 太快信号质量差从机输出建立时间不足降 SCK 频率缩短飞线提高 GPIO Speed先降到 1MHz 验证偶发失败电源纹波、接地不良、接触不良示波器看 VCC 纹波重新插拔或焊接加 100nF 去耦缩短地线HAL 返回 BUSY/TIMEOUT上次传输未结束OVR 标志未清查看 SPI-SR 的错误标志传输后检查 ErrorCode必要时软件复位 SPI写不进配置寄存器命令格式不对寄存器有写保护对照手册命令表和解锁流程按手册先写解锁命令5.2 文档里不会写、但实测很有用的经验最后分享几条常规文档里不会写、但我在实际调试中反复验证过的经验。第一别一上来就上 DMA。我第一次调传感器的时候就想着让 SPIDMA 跑起来还整了双缓冲结果通信链路本身没通DMA 只能让错误数据来得更快更流畅。后来学乖了新芯片第一次调通链路永远用阻塞式 HAL_SPI_TransmitReceive链路通了、波形确认了再换成中断或 DMA。第二每次只改一个变量。改 Mode 就只改 Mode改帧长就只改帧长改了三个变量之后发现正常了你根本不知道是哪个起的作用下次换颗芯片又得从头摸。我这次问题最终定位是“帧长 CS 建立时间”两个因素叠加就是靠一次只改一个变量拆出来的。第三打印日志也要控制节奏。调试时为了看 SPI 返回值我在一个 1kHz 循环里放 printf结果日志本身占用了大量时间把时序搅乱了出现了“加了打印就正常、去掉打印就异常”的玄学。后来把打印改成每隔 100 次读一次循环节拍稳定了问题就暴露出来了。第四向厂商要例程时注意例程对应的平台和引脚。拿一份 STM32F103 的例程想直接移植到 STM32G031 上外设差异、时钟树差异都会让你怀疑人生。例程最大的价值是告诉你芯片的协议框架和寄存器用法而不是让你照抄配置。回到这次“见鬼”的调试。最终定位到的问题并不玄学MT6835 要求 CS 拉低之后至少有一段建立时间才能启动 SCK而且它的读命令帧是 16 位组织不是我以为的“8 位命令 8 位返回”。前两晚我一直用 8 位帧去发一个拼好的命令字节等于把一条完整命令拦腰截断从机状态机每次都停在半路返回的数据自然乱七八糟。找到原因之后我在 CubeMX 里把 SPI 数据长度改成 16 Bits在 CS 拉低后加了 3us 延时命令字按手册重新组织一次就把角度读出来了。回头想想“见鬼”的时候并不是真的撞鬼而是我还没完全理解通信对象的规矩。最后分享一个我现在一直保留的习惯拿到一款新芯片第一天先花半小时把示波器和逻辑分析仪架好把 CS、SCK、MOSI、MISO 的正常波形存成截图再开始写代码。不然等你调试到凌晨两三点连“什么波形算正常”都记不清的时候才是真的见鬼。
返回列表