这次申请到的是 Murata 的 SCL3300-D01-PCB 评估板。它不是一颗普通的加速度计,而是直接把倾角解算好、以角度形式通过 SPI 吐出来的 3D-MEMS 倾角传感器。我没有止步于"读个数点亮 LED",而是把一整条链路从头到尾跑通:SCL3300 走 SPI 裸协议 → RA4M2 读出 → DA16200 走 WiFi → PC 浏览器用 three.js 渲染一块实时跟随转动的 3D 红板。期间顺手把 Power Down 功耗、Mode1~4、自诊断、阈值报警全部做进了网页里。下面按开箱、硬件、软件、实测、踩坑的顺序一次说完。
一、开箱:先看看这块红板
板子很小,红底白丝印,双排针 J1/J2,中间一颗 QFN 封装的 SCL3300 芯片。芯片面印了 X/Y/Z 坐标轴:X 朝右、Y 朝下、Z 垂直出板面,SPI 四根线(CSB/MISO/MOSI/SCK)都在 J2 上。供电要求 3.0~3.6V,我全程接 3.3V,千万别上 5V。
图1:SCL3300-D01 芯片面,可见 XYZ 丝印坐标与 J2 排针
图2:型号贴纸面,丝印 SCL3300-D01,J1/J2 双排针
板子四角有固定孔,实际联调时我把它插在面包板上平放——这样测倾角时基准面才稳。下图就是整套联调台架:左边是生态工作室 RA4M2 v2.0 主板,上面插着 DA16200 的 PMOD Wi-Fi 模组,彩虹杜邦线把红板接到主板 GPIO 上,右边是面包板上的 SCL3300。
图3:联调台架全景,RA4M2 主板 + DA16200 PMOD + 面包板上的 SCL3300 红板
二、我要做的东西:系统长什么样
整个系统就是一条数据流水线。传感器以大约 10Hz 的频率把角度、温度和诊断寄存器通过 SPI 给 RA4M2;RA4M2 把这些数据打包成 JSON,通过 UART 发给 DA16200,由它以 TCP Client 的身份连到电脑 9000 端口;电脑上跑一个 Python FastAPI 服务,一边接收设备 TCP,一边把数据通过 WebSocket 推给浏览器。反向也通:网页上点 Mode、拉报警阈值开关、切 Power Down,命令沿同一条 TCP 回到 MCU,再被翻译成 SPI 寄存器命令作用到传感器。
图4:系统架构总览——SCL3300 → RA4M2 → DA16200 → PC Web,上行数据流与下行命令回路
这么选架构有几点考虑:其一,SPI 我没用现成的硬件 SPI 外设,而是用带 bit-banging 直接翻 GPIO,原因是要绕开 PMOD 座占用,并且方便对照手册逐位调时序;其二,Wi-Fi 模组只发 AT 指令,把工作量压在应用层,换个 Wi-Fi 名字只改一个头文件;其三,网页用 three.js 渲染一块 3D 红板,直接把角度数据映射成欧拉角,比画个仪表盘直观得多——板子怎么转,3D 模型就怎么转。
三、硬件怎么接的
方案核心器件
接线非常简单,SPI 四根线加 3.3V/GND,一共 6 根杜邦线。SCL3300 的 CSB 接 RA4M2 的 P105,SCK 接 P106,MOSI(SDA)接 P107,MISO(SDA)接 P108。供电直接 3.3V,别接 5V。
图5:硬件接线示意——SCL3300 J2 与 RA4M2 GPIO 的引脚对应关系
四、软件跑起来的流程
固件主循环不长:上电先关中断、配 GPIO 为输出,然后走一遍 SCL3300 的初始化序列——软复位、选 Mode1、使能角度输出。之后进入 10Hz 周期循环:每次循环读 4 帧 SPI,把 ANG_X/ANG_Y/ANG_Z/TEMP 四个寄存器值拼起来,加上自诊断寄存器(WHOAMI/STATUS/CRC/ERR_FLAG),打包成 JSON 通过 UART 发给 DA16200。收到网页下行命令时,在 UART 接收中断里解析 JSON,切 Mode、写报警阈值、进 Power Down。
图6:固件主流程图——从上电自检到 10Hz 周期上报循环
五、关键代码:off-frame 那点事
SCL3300 的 SPI 协议有个反直觉的地方:它不是"发命令→立刻收数据",而是"发命令→下一帧才收到上一条命令的响应"。也就是说,你发 ANG_X 命令,这一帧 MISO 线上吐回来的其实是 WHOAMI 的数据;你得再发一条 ANG_X(甚至空发一条 dummy),下一帧才能拿到 ANG_X 的值。这个叫 off-frame pipeline,手册里专门画了时序图说明响应滞后一帧。
图7:SPI off-frame 流水线时序——橙色箭头标出响应滞后一帧的关系
所以固件里读角度的代码长这样,先发 ANG_X 占位,后面连发四条把 X/Y/Z/温度依次顶出来:
(void) scl_xfer32(CMD_ANG_X); // 空发,顶出后续响应 uint32_t rx_x = scl_xfer32(CMD_ANG_Y); // 这帧才拿到 ANG_X uint32_t rx_y = scl_xfer32(CMD_ANG_Z); // 这帧拿到 ANG_Y uint32_t rx_z = scl_xfer32(CMD_TEMP); // 这帧拿到 ANG_Z uint32_t rx_t = scl_xfer32(CMD_NOP); // 这帧拿到 TEMP
调试这个花了我大半天——一开始怎么读都是 WHOAMI 的值,以为 MISO 接反了,后来翻手册才看到 off-frame 那一段。建议第一次用 SCL3300 的同学先抓波形确认这个时序,别像我一样在寄存器值上绕。
六、抓波形:逻辑分析仪实测
为了确认 SPI 时序真的对,我用 LA5016 逻辑分析仪抓了一组波形。单轮 8 帧突发,每帧 32 位(16 位命令 + 16 位数据),CSB 拉低期间连续传 8 帧,SCK 频率大概 2MHz。右边解码窗能看到每条命令字和对应的数据。
图8:单轮 8 帧 SPI 突发波形(LA5016),右侧解码窗可见每条命令字
图9:SPI 波形全景,周期性上报尖峰清晰可见
自诊断那一帧我专门抓了一版,把 WHOAMI(0x4100C136)和 ERR_FLAG 都读出来。WHOAMI 对得上说明通信链路没问题;CRC 寄存器每帧自增,说明芯片在正常跑。
图10:含 WHOAMI=0x4100C136 与 ERR_FLAG 读取的自诊断帧
七、网页长什么样
网页主界面分三块:左边是实时数字(X/Y/Z 角度、温度、tilt 合成倾角、valid 标志),中间是 three.js 渲染的 3D 红板模型,板子会跟着传感器姿态实时转;右边是自诊断面板和控制区。控制区能切 Mode1~4、拉报警阈值、开关 Power Down。
图11:网页主界面(SRC DEVICE 模式),3D 红板 + 实时角度 + Mode/报警控制
图12:自诊断面板——CRC/WHOAMI/STATUS/STO 逐帧可见
图13:Power Down 开启状态——角度归零、pd=1、valid=0
水平仪交叉对比实测
按申请计划,我把红板插在面包板上、面包板贴在手机背面,在四个静态姿态下同时记录手机自带水平仪 APP 的读数和网页 SCL3300 的 X/Y/Z 角度。手机水平仪显示的是倾斜角度(板子相对水平面的总倾角),我用 SCL3300 的 Z 轴换算成同样的总倾角(90° 减 Z)来对比。
图14:近似放平状态,网页 X=0.15°、Y=1.48°、Z=88.51°
图15:手机水平仪显示 8°,网页 X=8.22°、Y=-0.32°、Z=81.77°
图16:手机水平仪显示 13°,网页 X=13.63°、Y=2.56°、Z=76.11°
图17:手机水平仪显示 28°,网页 X=28.39°、Y=12.09°、Z=58.69°
四个姿态趋势完全一致:手机从 0° 到 28°,SCL3300 的 X 读数同步上升,最大偏差只有 0.63°,和手机水平仪本身的分辨率差不多。28° 那组 Y 轴读数到了 12.09°,不是传感器的问题——是面包板贴在手机背面时没有完全对齐,板子在面包板上往侧面歪了一点,这个歪斜只影响 Y 轴分量,X 轴读数依然准。整体来看,SCL3300 的角度趋势一致性和绝对值都可信。
。
因为面包板其实在移动的时候可能有一些晃动,所以越到后面的测试展现出来的偏差可能也会越大,实际也有可能是因为度数范围发生了变化,综合多种因素的影响,这个结果还是非常非常不错的了。
演示视频截图
因为有些网友可能不便于看视频,这里也提供一些演示部分的截图。下面从里面截三帧:放平时网页 3D 红板水平、手持红板倾斜时网页同步转动。完整视频链接看文章末尾。
图18:放平状态,网页 X约0、Z约89,3D 红板水平
图19:手持红板倾斜,网页 X=-9.78°、Y=-36.86°,3D 红板明显偏转
图20:反向倾斜,网页 X=-19.69°、Y=-0.82°,3D 红板跟随
八、功耗实测:Power Down 到底省多少
这里要先说清楚测量口径:我只测传感器本身的 DVDD/AVDD 电流,不含 RA4M2 和 Wi-Fi 模组。电流表串在 3.3V 到传感器供电之间。下面这张拼图是五种工况的实测合影,左边是网页读数、右边是万用表示数。
图21:Mode1~4 与 Power Down 各工况下的传感器侧电流实测拼图
测下来的结果和手册典型值对得很好:Mode1/2/3 都在 1.17mA 左右(手册典型 1.2mA),Mode4 因为是低噪声档升到约 1.94mA(手册 2.1mA),Power Down 只有约 2µA(手册典型 3µA)。
图22:功耗与状态机——测量态 / Power Down / 断电三者的关系
这里有个反直觉的点值得说:Mode1/2/3 电流几乎一样,但精度并不相同。手册里这三个模式共用同一个工作电流档,差别在量程、灵敏度和低通滤波,而不是靠抬高电流换精度;只有 Mode4 为了压噪声才把电流抬到 2mA 档。另外一定要分清 Power Down ≠ 断电:PD 是软件休眠,芯片还接电、SPI 随时能唤醒,十几到一百毫秒就恢复测量;断电是真把 VDD 切掉,再上电得重走一遍软复位→选 Mode→Enable Angle 的完整初始化流程。
九、踩过的坑(吐血整理)
off-frame 时序坑:第一次读角度全是 WHOAMI 值,以为 SPI 接反了。翻手册才发现 SCL3300 响应滞后一帧,必须多发一帧 dummy 才能顶出数据。
供电别上 5V:SCL3300 是 3.0~3.6V 器件,接 5V 虽然不一定立刻烧,但长期工作会漂。我全程 3.3V。
面包板平整度:测倾角时面包板本身不水平,会带进来 1~2° 的固定偏差。做精度对比时要把基准面调平。
DA16200 AT 指令换行:AT 指令必须以 \r\n 结尾,少一个 \n 模组就不回。这个坑我踩了两次。
WebSocket 跨域:网页和 FastAPI 不同端口时要配 CORS,否则浏览器控制台一片红。
十、总结
这次 SCL3300-D01 试用,从一颗传感器出发,把 SPI 裸协议、MCU 固件、Wi-Fi 透传、网页 3D 可视化、功耗实测、水平仪交叉对比整条链路跑通了。传感器本身的角度输出很干净,小角度段和手机水平仪偏差在 1° 以内,噪声密度确实低;Power Down 2µA 的休眠电流对电池供电场景很友好。three.js 那块 3D 红板做出来效果不错,板子怎么转网页就怎么转,演示效果很直观。
感谢 EEPW给的试用机会。代码和网页我都整理好了,有问题欢迎楼下交流。
视频链接:
我要赚赏金
