news 2026/2/12 4:53:38

LIS3DHTR与STM32F103的IIC通信实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LIS3DHTR与STM32F103的IIC通信实战指南

1. 硬件连接与初始化配置

第一次接触LIS3DHTR加速度传感器时,最让人头疼的就是硬件连接问题。我当年调试时因为引脚接错,整整浪费了一个下午。这里分享下我的经验:STM32F103的IIC接口默认对应PB6(SCL)和PB7(SDA),而LIS3DHTR的引脚排列需要注意VCC和GND不能接反。

具体接线方案如下:

  • VCC接3.3V电源(切记不要接5V)
  • GND接地
  • SCL接PB6
  • SDA接PB7
  • SDO/SA0引脚根据需求接高或低(影响I2C地址)
  • CS引脚必须接高电平(启用I2C模式)

硬件连接完成后,建议先用万用表检查各引脚电压:

  • VCC应为3.3V±0.2V
  • SDA/SCL空闲时应为高电平
  • CS引脚必须确认是高电平

初始化配置有个小技巧:先读取WHO_AM_I寄存器(0x0F),正常应该返回0x33。这个步骤能快速验证硬件连接是否正确。我常用的初始化代码如下:

#define LIS3DH_ADDRESS 0x18 // SA0接地时的地址 void LIS3DH_Init(void) { uint8_t who_am_i = I2C_ReadByte(LIS3DH_ADDRESS, 0x0F); if(who_am_i != 0x33) { printf("LIS3DH检测失败,返回值:0x%02X\r\n", who_am_i); while(1); } // 配置CTRL_REG1:100Hz数据速率,XYZ轴使能 I2C_WriteByte(LIS3DH_ADDRESS, 0x20, 0x57); // 配置CTRL_REG4:±2g量程,高分辨率模式 I2C_WriteByte(LIS3DH_ADDRESS, 0x23, 0x08); }

2. IIC通信协议实现细节

很多新手在实现IIC通信时会遇到各种奇怪的问题,我自己就踩过不少坑。这里分享几个关键点:

首先是时序问题,STM32的硬件IIC有个"特性":在标准模式下(100kHz)工作稳定,但在快速模式(400kHz)容易出错。建议先用标准模式调试,稳定后再尝试提速。

IIC读写函数实现要注意以下几点:

  1. 起始条件后必须检查ACK
  2. 每次发送完寄存器地址后也要检查ACK
  3. 读取多个字节时,最后一个字节要发送NACK

这是我优化过的IIC读写函数:

uint8_t I2C_ReadByte(uint8_t devAddr, uint8_t regAddr) { uint8_t data; I2C_Start(); I2C_Send_Byte(devAddr << 1); // 写模式 I2C_Wait_Ack(); I2C_Send_Byte(regAddr); I2C_Wait_Ack(); I2C_Start(); I2C_Send_Byte((devAddr << 1) | 1); // 读模式 I2C_Wait_Ack(); data = I2C_Read_Byte(0); // 发送NACK I2C_Stop(); return data; } void I2C_WriteByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { I2C_Start(); I2C_Send_Byte(devAddr << 1); I2C_Wait_Ack(); I2C_Send_Byte(regAddr); I2C_Wait_Ack(); I2C_Send_Byte(data); I2C_Wait_Ack(); I2C_Stop(); delay_ms(5); // 写入后需要适当延时 }

常见问题排查:

  1. 如果读取总是返回0xFF:检查上拉电阻(4.7kΩ)是否接好
  2. 如果ACK失败:检查设备地址是否正确(SA0引脚状态)
  3. 如果数据不稳定:尝试降低IIC时钟频率

3. 数据读取与处理技巧

LIS3DHTR的数据寄存器是6个8位寄存器(OUT_X_L, OUT_X_H, OUT_Y_L, OUT_Y_H, OUT_Z_L, OUT_Z_H),需要组合成16位数据。这里有个细节:数据是补码形式,需要转换为有符号整数。

我推荐使用这个读取函数,它一次性读取所有三个轴的数据:

typedef struct { int16_t x; int16_t y; int16_t z; } LIS3DH_Data; void LIS3DH_ReadAccel(LIS3DH_Data *data) { uint8_t buf[6]; // 使用地址自动递增功能,连续读取6个寄存器 I2C_Start(); I2C_Send_Byte(LIS3DH_ADDRESS << 1); I2C_Wait_Ack(); I2C_Send_Byte(0x28 | 0x80); // 0x80启用地址自动递增 I2C_Wait_Ack(); I2C_Start(); I2C_Send_Byte((LIS3DH_ADDRESS << 1) | 1); I2C_Wait_Ack(); for(int i=0; i<5; i++) { buf[i] = I2C_Read_Byte(1); // 发送ACK } buf[5] = I2C_Read_Byte(0); // 最后一个字节发送NACK I2C_Stop(); // 组合数据并转换为有符号整数 >// 配置Z轴高阈值中断 void LIS3DH_ConfigInterrupt(void) { // 使能AOI1中断 I2C_WriteByte(LIS3DH_ADDRESS, 0x22, 0x40); // 配置Z轴高阈值检测 I2C_WriteByte(LIS3DH_ADDRESS, 0x30, 0x20); // 设置阈值为0.5g (0.5/0.001 = 500) I2C_WriteByte(LIS3DH_ADDRESS, 0x32, 0x05); // 设置持续时间10个采样周期(100Hz时为100ms) I2C_WriteByte(LIS3DH_ADDRESS, 0x33, 0x0A); }

FIFO模式配置

  1. 配置FIFO_CTRL_REG(0x2E)选择模式
  2. 通过FIFO_SRC_REG(0x2F)读取状态
  3. 建议使用流模式(Stream mode)实现连续采样
// 启用FIFO流模式 void LIS3DH_EnableFIFO(void) { // FIFO模式使能,流模式,触发中断1 I2C_WriteByte(LIS3DH_ADDRESS, 0x2E, 0x40); // 设置CTRL_REG5使能FIFO I2C_WriteByte(LIS3DH_ADDRESS, 0x24, 0x40); }

调试技巧:

  1. 使用逻辑分析仪抓取IIC波形
  2. 读取STATUS_REG(0x27)检查数据就绪标志
  3. 对于间歇性故障,检查电源稳定性
  4. 温度变化大时,建议重新校准零点
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 2:11:46

Qwen2.5-1.5B Streamlit部署教程:日志记录+用户行为审计追踪方案

Qwen2.5-1.5B Streamlit部署教程&#xff1a;日志记录用户行为审计追踪方案 1. 为什么需要带审计能力的本地对话助手&#xff1f; 你有没有遇到过这样的情况&#xff1a; 在公司内部搭建了一个AI对话工具&#xff0c;大家用得很开心&#xff0c;但领导突然问&#xff1a;“上…

作者头像 李华
网站建设 2026/2/6 10:17:37

智能相册分类第一步:用阿里模型自动打标签

智能相册分类第一步&#xff1a;用阿里模型自动打标签 你是否整理过上千张手机照片&#xff0c;却在找“去年旅行的那张雪山照”时翻了二十分钟&#xff1f;是否给家人建了几十个相册文件夹&#xff0c;却总有人把“宝宝学步”误存进“家庭聚餐”&#xff1f;传统手动分类早已…

作者头像 李华
网站建设 2026/2/7 20:43:12

GLM-Image创新应用:打造专属IP形象的AI生成路径

GLM-Image创新应用&#xff1a;打造专属IP形象的AI生成路径 你有没有想过&#xff0c;不用请设计师、不学PS、甚至不用懂绘图软件&#xff0c;就能从零开始塑造一个独一无二的虚拟角色&#xff1f;比如一个穿汉服的机械猫、一个在赛博巷口卖糖葫芦的AI小贩&#xff0c;或者你公…

作者头像 李华
网站建设 2026/2/1 15:15:05

Glyph功能全测评:长上下文处理的真实表现如何

Glyph-视觉推理镜像实测&#xff1a;长上下文处理的真实能力边界在哪&#xff1f; 你有没有试过把一份50页的PDF技术文档丢给大模型&#xff0c;然后问它&#xff1a;“第三章第二节提到的三个限制条件&#xff0c;分别对应哪些硬件参数&#xff1f;” 结果模型要么直接报错“…

作者头像 李华
网站建设 2026/2/10 7:06:31

CogVideoX-2b企业应用:与钉钉/飞书打通,文字消息直出视频卡片

CogVideoX-2b企业应用&#xff1a;与钉钉/飞书打通&#xff0c;文字消息直出视频卡片 1. 这不是普通视频生成工具&#xff0c;而是企业级内容生产中枢 你有没有遇到过这样的场景&#xff1a;市场部同事在钉钉群里发了一条需求——“请今天下班前出一条30秒新品预告视频&#…

作者头像 李华
网站建设 2026/2/6 22:09:20

Clawdbot整合Qwen3-32B惊艳效果展示:高拟真对话与复杂指令理解实录

Clawdbot整合Qwen3-32B惊艳效果展示&#xff1a;高拟真对话与复杂指令理解实录 1. 开场&#xff1a;这不是一次普通对话&#xff0c;而是一次“像人一样思考”的实录 你有没有试过和AI聊着聊着&#xff0c;突然愣住——它没按套路出牌&#xff0c;却把事情办得更周全&#xf…

作者头像 李华