
简介这份SC7A21中文数据手册面向嵌入式硬件、驱动开发与运动传感应用人员聚焦士兰微三轴数字加速度计的选型、寄存器配置与系统集成也可为手机平板、室内导航、图像旋转、智能穿戴等场景提供器件依据。文档围绕±2G/±4G/±8G/±16G四档量程、12bit数据输出、I²C/SPI接口及1.71V—3.6V宽压低功耗设计展开并给出6D/4D方向、自由落体、单击双击、睡眠唤醒等中断检测以及计步、抬手识别、FIFO、自测试和倾斜校准的实现说明。压缩包仅含1个PDF文件约2.07MB正文共39页除功能概述外还收录管脚定义、内部框图、极限参数、机械与电气参数、I²C/SPI时序和寄存器描述便于对照原理图与驱动代码逐项核对地址、中断映射及初始化流程。已有1150人学习适合需要快速掌握芯片配置、低功耗策略与运动事件处理的工程师查阅。1. 一颗加速度计到底在测什么从 pF 到 fF 的运动学翻译把手机横过来屏幕自动旋转手环抬腕亮屏——这些动作的起点都是一次运动学测量器件必须先知道重力向量在自己坐标系里指向哪。SC7A21 这类三轴微机械加速度计看起来只是“输出三个数”真正反直觉的是它的输入静止时敏感结构的电容是 pF 量级1g 加速度拽出来的变化只有 fF 量级也就是千分之一。整颗芯片的设计难点全压在这千分之一怎么被低噪声地放大、量化再翻译成 12 位补码。值得搞懂它是因为现场 90% 的“数据不对”根本不是算法问题而是量程档位、ODR、中断阈值、总线时序这些底层参数没对齐。把这份手册里的几条主线理顺——电容链路怎么走、地址自增怎么省时钟、中断状态机怎么配阈值和时间——你会发现那些看起来玄学的漂移和抖动其实都有明确的物理出处和寄存器出处。2. 传感链条fF 级电容失衡怎么变成 12 位补码2.1 质量块、差分电容与那一级电荷积分机械部分的结构很朴素一块悬空的质量块通过锚点挂在硅框架上可以在三维空间里自由移动外面做盖帽保护防止封装注塑时把机械结构压坏。质量块和固定电极之间构成差分电容稳定状态下这个电容是 pF 级一旦有加速度质量块相对固定端产生位移差分电容失衡最大改变量只有 fF 级。这里有两个设计动机值得停下来想。第一是为什么用差分而不是单端封装应力、温度漂移、注塑带来的介电环境变化在差分结构里是共模量两边一起动、相减就没了而加速度引起的位移是差模量一正一负相减翻倍。这一手同时解决了灵敏度低和一个大得多的麻烦——漂移。第二是为什么后面必须跟低噪声电荷放大器fF 级变化对应的电荷量极小直接进 ADC 会被噪声淹没所以先用电荷积分电路把电容变化积成电压再由 ADC 量化。手册里那句“对加在差分电容上的电压脉冲进行积分以积分结果衡量差分电容大小”说的就是这个电荷放大过程。链路定型之后带宽也就被钉死了系统带宽等于 ODR/2。采样率 100Hz 时有效带宽 50Hz这不是随便写的数字而是采样定理给的上限——再高就会混叠。做手势识别、敲击检测这类需要保留高频分量的场景ODR 直接决定你能看到多快的动作。2.2 量程与灵敏度换档等于换一把尺子四个量程档不是简单的“放大倍数切换”它同时改变了三件事满量程、每 LSB 代表多少 mg、以及你能分辨的最小加速度。FS[1:0]满量程灵敏度HR 模式1g 对应 LSB等效分辨率00±2g1 mg/digit10001 mg01±4g2 mg/digit5002 mg10±8g4 mg/digit2504 mg11±16g8 mg/digit1258 mg这张表最容易被误读的地方是“量程越大越不灵敏”。物理上它是同一套电容结构靠改变积分增益和 ADC 参考来适配不同量程代价就是每 LSB 代表的加速度变粗。所以做倾角测量、静态姿态判断永远选 ±2g做跌落检测、冲击记录才往 ±8g、±16g 走。手册里给出的零漂指标是在 ±2g 下 ±40mg温漂 ±0.5mg/°C灵敏度温漂 ±0.01%/°C——注意零漂这个量级40mg 相当于 2.3° 的静态倾角误差这就是为什么纯靠加速度计做绝对倾角不校准是撑不住精度的。把原始值换成物理量的代码短得几乎不像核心逻辑但每行都对应上面一个参数/* 原始数据在 0x28~0x2D低字节在前FS0 时 1 LSB 1 mg */ static const uint8_t sens_mg[4] {1, 2, 4, 8}; /* 与 FS[1:0] 一一对应 */ static int16_t le16(const uint8_t *p) { /* BLE0小端序低字节在前置位 BLE 则要反过来拼 */ return (int16_t)((uint16_t)p[0] | ((uint16_t)p[1] 8)); } void acc_to_mg(const uint8_t *buf, uint8_t fs, int32_t out[3]) { out[0] le16(buf[0]) * sens_mg[fs]; /* X0x28 / 0x29 */ out[1] le16(buf[2]) * sens_mg[fs]; /* Y0x2A / 0x2B */ out[2] le16(buf[4]) * sens_mg[fs]; /* Z0x2C / 0x2D */ }三个参数决定这段代码对不对sens_mg必须和当前 FS 档位一致改档忘了改表是最常见的“数值整体偏大/偏小”来源le16里的字节序受 BLE 位控制寄存器名上那个(BLE0)就是提示用int16_t强转是为了让补码自动变成负数别自己写符号位判断。还有一点12 位有效数据放在 16 位寄存器里低位那几位不是精度只是噪声和填充把它当 16 位分辨率去算算出来的有效位数会虚高。2.3 功耗账本为什么 400Hz 和 1.5Hz 差着两个数量级在 ODR50Hz 的同一条件下高性能模式 290µA、正常模式 14µA、低功耗模式 8µA掉电 0.2µA。三档差着二十倍不是靠“降电压”实现的而是靠改变模拟前端的占空比和平均次数采样间隔里把积分器、ADC 关掉只在采样窗口打开平均次数越多噪声越低、电流越大。高性能模式在 ±2g 下能拿到 12 位有效位就是拿电流换来的信噪比。这解释了一个常见误配把 ODR 拉到 400Hz 却用低功耗模式指望既省电又灵敏结果噪声大到计步乱跳。反过来做静态的抬腕检测用 290µA 的高性能模式也是浪费——抬手识别内部用的是另一套定点标度1g 64 LSB约 6 位精度它压根不需要 12 位数据。参数之间是有耦合的选档位的时候得先问一句“我这个场景真正需要多少有效位”。3. 数字接口一根 CS 线切两种总线一位地址换一次 burst3.1 CS 决定协议SDO 决定地址同一组引脚要同时支持 I²C 和 SPI靠的是第 10 脚 CS 的电平高电平走 I²C低电平使能 SPI。这个设计意味着硬件上没有“自动识别”CS 接错电平后面所有时序都是白忙。I²C 模式下 SCL/SDA 复用第 12、2 脚SPI 四线模式下变成 SPC/SDISDO 单独一根三线模式下 SDO 让出来SDI 变双向。更容易翻车的是地址。7 位从机地址是 0011xxxb低三位里有一位由 SDO 引脚决定SDO 悬空或接高地址是 0x19写 0x32、读 0x33SDO 接逻辑低地址是 0x18写 0x30、读 0x31。手册里还专门提示若要把 SDO 外接低电平需要通过 I²C 总线通讯关闭 SDO 的内部上拉电阻——因为这三根脚默认内置 50k~60k 上拉接到 VDDIO。上拉阻值这么大走线一长、速率一上 400kHz上升沿就爬不起来示波器上看是圆角逻辑分析仪上看是偶发 NACK。这是典型的“电路上没画错、时序上过不去”。3.2 子地址最高位一个 bit 换掉整段握手I²C 写完从机地址之后发的那个字节叫子地址它的低 7 位是寄存器地址最高位是地址自增开关。最高位为 1后续访问地址自动加一可以连续读写为 0每次都打同一个寄存器。手册给的例子很干脆读 0x28~0x2D 六个字节子地址发0xA8就是0x28 | 0x80。/* 0x28 起连读 6 字节子地址最高位置 1打开地址自增 */ static int acc_read_xyz(i2c_bus_t *bus, uint8_t addr7, uint8_t out[6]) { uint8_t sub 0x28 | 0x80; /* 0xA8burst 读的关键 */ if (i2c_write(bus, addr7, sub, 1)) /* 只发子地址不发数据 */ return -1; return i2c_read(bus, addr7, out, 6); /* 一次读完 X/Y/Z */ }为什么强调“一次读完”因为分三次单字节读三次读之间可能夹着新的采样点X 来自第 n 次采样、Z 来自第 n1 次合成出来的向量长度就不是 1g 了做姿态解算时会看到莫名其妙的“伪运动”。这个坑在低 ODR 下不明显一旦 ODR 上到 200Hz 就开始露头。同理SPI 侧的地址域也是 7 位地址加自增位多字节读写靠 M-S 位控制M-S 为 0 时每次访问同一地址为 1 时地址递增。3.3 SPI 三线模式的先有鸡还是先有蛋三线模式靠 SIM 位置 1 打开可问题是配置这个位本身得先能通信。手册给的解法是利用“四线写模式只用三根线”这个事实——写操作本来就不需要 SDO所以先用四线模式的写时序把 SIM 位置 1之后 SDO 让出来SDI 变双向再按三线时序访问。SPI 的时序细节也有几个数字要记住时钟最高 10MHz单字节读写 16 个时钟bit0 是读写控制位0 写 1 读bit1~7 是地址bit8~15 是数据MSB 先发数据在 SPC 下降沿驱动、上升沿采样最后一个 SPC 上升沿必须在 CS 上升沿之前完成。还有一条明确的功能开关多设备复用 SPC/MOSI/MISO 时要向 0x0E 寄存器写 0x04 关闭 I²C 通讯功能。不关的话SDA 脚上的内部上拉和外部总线状态会互相干扰表现是 SPI 偶尔读回全 0xFF。4. 中断与内置状态机为什么这些判断要放在硅片里4.1 中断是事件通道数据寄存器是数据通道INT1 和 INT2 两根脚不是数据出口它们是事件出口。芯片内部有一堆检测模块命中条件就置状态位、拉中断MCU 只需要在中断里读一下状态寄存器判断是哪类事件绝大多数时间可以睡。这个划分直接决定了系统功耗结构如果靠 MCU 轮询 0x27 状态寄存器判断有没有新数据主控就永远睡不深把判断下推到传感器主控才能长时间待在低功耗态。中断源是可以映射的比如抬手功能可以在 0x08 里分别配置 INT1、INT2 映射成“抬手状态值”“抬手动作”“放下动作”三种语义计步在 0x10 里可以映射“溢出”“达到差值”“达到设定阈值”。这意味着同一根引脚在不同产品里可能代表完全不同的含义调试时先看映射配置再看现象。4.2 所有检测功能其实是同一套骨架阈值 持续时间 与或关系把手册里那些功能摊开看会发现它们都是同一个模板的实例一个或多个轴的输出与阈值比较比较结果按 AND/OR 组合再要求持续若干个采样周期最后置位。差别只在参数名字。中断源判据寄存器时间控制典型场景6D/4D 方向AOI1/AOI2_THS、AOI_SRCAOI_DURATION横竖屏、翻盖检测自由落体AOI_THS低阈值 多轴 ANDAOI_DURATION跌落保护单击/双击CLICK_THSTIME_LIMIT / LATENCY / WINDOW敲击唤醒睡眠/唤醒ACT_THSACT_DURATION低功耗驻留计步S_WTM、S_DELTASTEP_MODE 约束 ODR手环计步抬手T_Angle、Angle_ScaleTT_TH / FT_TH2^n × 0.1s抬腕亮屏单击双击那组参数最能说明这套骨架的意图THS 管“多大力算一次敲”TIME_LIMIT 管“按下最长多久”LATENCY 管“两次敲之间至少隔多久”WINDOW 管“第二次敲必须在多久内到达才算双击”。四个参数分别对应机械按键抖动、误触和双击判定窗口三个现实问题本质上是把一段软件滤波逻辑固化成了比较器加计数器。抬手识别也一样TT_TH 是“进入抬手状态要持续多久”2 的设定值次方乘 0.1 秒FT_TH 是“离开抬手状态要持续多久”前者防误触发后者防闪烁。还有一个细节暴露了设计取舍抬手检测内部用的是 1g 64 LSB 的标度目标角度值用 7 位补码表示再乘 2静止时加速度值最大 64 约对应 90°。也就是说这条支路只有 6 位左右的精度而主数据通道是 12 位。为什么不复用高精度数据因为抬手判断只需要粗角度独立支路可以做得更小更省电还不占用主数据通道的采样节奏。4.3 计步器把算法放进硅片的三笔账内置计步的价值不在算法多先进而在于三笔账算得过来。第一笔是功耗主控跑计步算法要定期唤醒、读数据、算峰值累计功耗远大于传感器内部一个状态机第二笔是内存算法要缓冲区、要滤波状态低端 MCU 的 RAM 紧得很第三笔是实时性片内逻辑每个采样周期都在看不会因为主控忙别的就漏掉一步。计步值本身是个 24 位寄存器从 0x15 起三个字节低位在前/* 24 位计步值0x15 起连读 3 字节低位在前 */ uint8_t step[3]; uint32_t steps; acc_burst_read(0x15 | 0x80, step, 3); steps ((uint32_t)step[2] 16) | ((uint32_t)step[1] 8) | step[0];24 位意味着到 1600 多万步才溢出正常佩戴基本不会碰到但 0x14 里仍然给了OVER_STEP标志位说明设计上考虑了长时间不读的情况。STEP_CLR位是自清零的写 1 清完自己回 0不需要软件再写回 0STEP_MODE是个硬约束——置 0 要求 ODR ≥ 25Hz置 1 要求 ODR ≥ 50Hz本质是内部算法需要足够的采样密度才能分辨出步态周期。ODR 配低了STEP_EN打开了也不走数这种问题查寄存器是查不出来的只能回去看 ODR 档位。5. 避坑与排查五个现场反复出现的翻车点5.1 数据类读到了但读的是错的现象三轴数据能读出来静止放着 Z 轴约 1000、XY 接近 0看着没问题但一动起来数值明显偏小做倾角算出来的角度也不对。原因量程档位和换算表不匹配。寄存器里配的是 ±8g代码里还按 1mg/LSB 在算所有值都小了三倍多。解决把 FS 字段和灵敏度表做成同一个枚举改档必须一起改别让两处配置有机会分家。现象三轴数据偶尔跳出一个明显不合理的点向量模值突然变成 1.4g 又回来。原因分三次单字节读X/Y/Z 来自不同采样时刻也可能是读 6 字节的过程中被新采样打断高字节和低字节不是同一次转换的结果。解决一律 burst 读并且先确认数据就绪再读对时间敏感的场景打开块数据更新保护避免读的过程中寄存器被刷新。5.2 总线类扫不到设备、偶发 NACK现象I²C 上扫不到任何设备或者能扫到但地址是 0x19 而不是预期的 0x18。原因SDO 引脚悬空内部上拉把它拉到高地址就落在 0x19想用 0x18 必须把 SDO 明确接低并且通过总线关掉它的内部上拉。解决地址先用 0x19 试通再决定硬件上怎么接不要在没确认地址的情况下怀疑芯片坏了。现象白天好好的晚上或者温度一变化就开始偶发 NACK示波器上看 SCL/SDA 上升沿是圆弧。原因内部上拉只有 50k~60k总线电容稍大时间常数就上去了400kHz 快速模式下上升沿超标。解决外部加 2.2k~4.7k 上拉或者降到 100kHz 标准模式先用通总线挂多个从机时更要注意容性负载。现象SPI 共享总线时别的设备一通信加速度计就读回全 0xFF。原因没有关掉 I²C 功能SDA 脚上的内部上拉参与进来把总线状态搅乱。解决初始化时向 0x0E 写 0x04 关闭 I²C 通讯功能再开始用 SPI。5.3 配置类中断不来、计步不走现象自由落体中断怎么都不触发阈值调大调小都没反应。原因这类检测要多个轴同时满足条件才置位只使能了某一个轴或者持续时间设得太长实际跌落过程还没走完就落地了。解决三个轴都参与比较持续时间按 ODR 折算成毫秒去核对别只看设定值。现象计步功能使能了走了一万步还是 0。原因STEP_MODE要求的 ODR 门槛没满足或者STEP_EN没置位或者中途误写了STEP_CLR。解决按“ODR 档位 → STEP_MODE → STEP_EN → 读 0x14 状态”的顺序逐级确认状态寄存器里的DELTA_STEP、WTM_STEP能告诉你算法到底在不在工作。现象初始化时写 0x0F 读回不是 0x13后面所有配置都不生效。原因上电后芯片还在引导加载阶段NVM 里的修调值正在往寄存器里搬这段时间写寄存器会被覆盖也可能是复位没做完就发命令。解决上电先延时等稳定再读 WHO_AM_I 确认通信正常最后才配置软复位之后同样要走一遍这个流程别复位完立刻写参数。6. 校准、自测试与那条 276 LSB 的判据出厂校准这块的设计取舍值得单独说。芯片内部有灵敏度和零漂的修调值存在 NVM 里上电后自动加载到寄存器用户不做任何校准就能用。这么设计的好处很直接省掉了产线上一台转台和一道工序也避免了“用户校得比出厂还差”的风险。代价是它只能补偿芯片自己的一致性补偿不了板级应力——零漂在手册里的定义就写得很清楚它是机械部分应力的结果焊到 PCB 上或者处在外部压力环境下会变。所以内置了产品倾斜校准对贴片和板卡安装导致的倾斜做补偿参数存在片内、不占系统资源固件升级也不影响——这一手是在“出厂校准覆盖不到的地方”补的一刀。零漂 ±40mg、温漂 ±0.5mg/°C 这两个数字决定了要不要做二次校准。40mg 对应 2.3° 静态倾角误差做屏幕旋转、翻盖检测完全够用做高精度水平仪就不够。判断方法很朴素六面法。把板子六个面依次朝下静置每个面记录三轴输出X/Y/Z 各自的正反向读数相减除以 2 得灵敏度相加除以 2 得零偏。这套流程跑一遍你就能分清误差是来自芯片本身的零漂还是来自焊接应力——两者的区别是后者会随板子弯曲而变。自测试则是另一类工具它解决的是“不想上转台也想验证机械链路”。使能自测试位之后一个静电驱动力被加到质量块上模拟出确定的加速度输入此时输出是外部加速度和静电驱动力的代数和。手册给的判据是 FS0 时 X/Y 轴 276 LSB、Z 轴 984 LSB。Z 轴的数字比 X/Y 大了三倍多不是笔误而是 Z 轴的电极面积和弹簧结构跟面内两轴不同同样的静电力产生的等效加速度不一样。用这条判据时有个必须注意的前提得把重力分量扣掉或者干脆水平放置让 Z 轴正对重力否则你测到的是自测力加重力的合力怎么算都对不上。早年我在一个模拟项目上吃过这个亏自测读出来 Z 轴差了将近 1000 LSB我一口咬定是芯片坏了换了两片都一样最后才发现板子是竖着插在治具上的重力全叠在 X 轴上。从那以后我每次跑自测试都强制走一遍“先水平静置读基线、再开自测读差值、最后和手册范围比对”的三步一步都不省。这份手册的价值也在这里——它把每个数字背后的前提条件都写清楚了276 和 984 不是随便给的两个阈值而是告诉你这条链路在什么条件下算正常。希望帮到你。本文还有配套的精品资源点击获取