news 2026/2/19 9:20:56

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/2/17 3:20:46

提升文本编辑效率:notepad--的实用技巧与场景应用

提升文本编辑效率&#xff1a;notepad--的实用技巧与场景应用 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器&#xff0c;目标是做中国人自己的编辑器&#xff0c;来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 你是否曾…

作者头像 李华
网站建设 2026/2/15 8:34:18

带上U盘去客户现场:GLM-4.6V-Flash-WEB演示神器诞生

带上U盘去客户现场&#xff1a;GLM-4.6V-Flash-WEB演示神器诞生 在客户会议室里&#xff0c;投影仪刚接好&#xff0c;笔记本却提示“驱动缺失”&#xff1b;工厂质检台前&#xff0c;系统崩溃无法联网&#xff0c;但客户急着要看AI识别效果&#xff1b;高校实验室里&#xff…

作者头像 李华
网站建设 2026/2/12 5:12:02

Qwen3-32B在Clawdbot中的惊艳效果:中英文技术文档互译+术语一致性校验

Qwen3-32B在Clawdbot中的惊艳效果&#xff1a;中英文技术文档互译术语一致性校验 1. 为什么技术文档翻译需要“懂行”的AI&#xff1f; 你有没有遇到过这样的情况&#xff1a;一份刚写完的中文API接口说明&#xff0c;要同步给海外团队&#xff0c;结果用通用翻译工具一翻&am…

作者头像 李华
网站建设 2026/2/16 21:23:31

AXI DMA IP核实战指南:从基础配置到多通道优化

1. AXI DMA IP核基础入门 第一次接触AXI DMA IP核时&#xff0c;我盯着文档里那些MM2S、S2MM缩写看了半天——这玩意儿不就是个数据搬运工吗&#xff1f;后来在实际项目中用它处理视频流数据时&#xff0c;才发现这个"搬运工"的能耐远超想象。简单来说&#xff0c;A…

作者头像 李华
网站建设 2026/2/13 15:34:32

4D-STEM数据分析全面解析:从理论到实践的开源工具应用指南

4D-STEM数据分析全面解析&#xff1a;从理论到实践的开源工具应用指南 【免费下载链接】py4DSTEM 项目地址: https://gitcode.com/gh_mirrors/py/py4DSTEM py4DSTEM是一款专为四维扫描透射电子显微镜&#xff08;4D-STEM&#xff09;数据设计的开源Python工具包&#x…

作者头像 李华