news 2026/9/8 19:53:50

单片机调试IIC笔记 — 首先检测GPIO和协议能不能用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单片机调试IIC笔记 — 首先检测GPIO和协议能不能用

单片机协议调试笔记 — GPIO和IIC测试

问题背景

最近在调一个IIC陀螺仪,发什么命令都没反应。折腾半天才发现——GPIO引脚根本没动!

原来是移植了正点原子的库,里面的IO操作是F103的位带操作,和F401不兼容。


分享两个实用的测试函数

1. GPIO电平测试 — 确认引脚真的在动

这个函数用来验证SCL和SDA能不能正常拉高/拉低。

voidGPIO_Test(void){printf("Starting GPIO test...\r\n");// 测试SCL引脚(PA8)printf("Testing SCL (PA8)...\r\n");IIC_SCL(1);delay_ms(100);printf("SCL = 1, PA8_IDR = %d\r\n",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8));IIC_SCL(0);delay_ms(100);printf("SCL = 0, PA8_IDR = %d\r\n",HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8));// 测试SDA引脚(PC9)printf("Testing SDA (PC9)...\r\n");SDA_OUT();IIC_SDA(1);delay_ms(100);printf("SDA = 1 (output), PC9_IDR = %d\r\n",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9));IIC_SDA(0);delay_ms(100);printf("SDA = 0 (output), PC9_IDR = %d\r\n",HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9));printf("GPIO test completed.\r\n");}

正常应该这样:

Starting GPIO test... Testing SCL (PA8)... SCL = 1, PA8_IDR = 1 SCL = 0, PA8_IDR = 0 ← 写0能读到0,说明拉低了 Testing SDA (PC9)... SDA = 1 (output), PC9_IDR = 1 SDA = 0 (output), PC9_IDR = 0

我当时的情况:

SCL = 0, PA8_IDR = 1 ← 写0还是读到1,根本没拉低! SDA = 0 (output), PC9_IDR = 1

2. IIC设备扫描 — 找设备地址

GPIO没问题后,用这个扫描总线上的设备。

voidI2C_Scan(void){u8 i,ack;printf("Starting I2C scan...\r\n");for(i=0;i<128;i++){IIC_Start();IIC_Send_Byte((i<<1)&0xFE);// 写地址ack=IIC_Wait_Ack();IIC_Stop();if(ack==0){printf("Found device at 0x%02X (7-bit: 0x%02X)\r\n",(i<<1),i);}delay_ms(1);}printf("I2C scan completed.\r\n");}

输出示例:

Starting I2C scan... Found device at 0xD0 (7-bit: 0x68) ← 找到陀螺仪了,地址0x68 I2C scan completed.

我遇到的坑:F103的位带操作库,不兼容F401

正点原子的库里有这么一段:

#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))#defineGPIOA_ODR_Addr(GPIOA_BASE+12)// 0x4001080C#defineGPIOA_IDR_Addr(GPIOA_BASE+8)// 0x40010808...

这些地址是F103的!F401的寄存器布局不一样,直接用会导致IO操作失效。
F103的ODR偏移是+12
F103的IDR偏移是+8
F401的ODR偏移是+20
F401的IDR偏移是+16

解决办法

一:改为F403的位带操作

Cortex-M4编程手册 PM0214 第3.7节 Bit-Banding

#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))// F401的GPIO寄存器偏移(参考RM0368手册)#defineGPIOA_ODR_Addr(GPIOA_BASE+20)// 0x40020014 ← F401的ODR偏移是+20#defineGPIOA_IDR_Addr(GPIOA_BASE+16)// 0x40020010 ← F401的IDR偏移是+16...
二:改为HAL函数,更直接,通用
// 别用位带了,直接HAL#defineIIC_SCL(n)HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,n)#defineIIC_SDA(n)HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,n)// 读取SDA切换方向#defineSDA_IN(){GPIOC->MODER&=~(3<<(9*2));GPIOC->MODER|=0<<(9*2);}#defineSDA_OUT(){GPIOC->MODER&=~(3<<(9*2));GPIOC->MODER|=1<<(9*2);}#defineREAD_SDAHAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)

快速排查流程

设备没反应? ↓ 跑 GPIO_Test() ↓ 写1读1,写0读0? ──否──→ 检查IO配置/上拉电阻/代码兼容性 ↓ 是 跑 I2C_Scan() ↓ 找到设备地址? ────否──→ 检查接线/供电/设备是否损坏 ↓ 是 开始正常读写调试
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 12:06:43

LightOnOCR-2-1B跨平台开发:Electron桌面应用集成指南

LightOnOCR-2-1B跨平台开发&#xff1a;Electron桌面应用集成指南 1. 为什么在Electron里集成LightOnOCR-2-1B值得你花时间 最近做文档处理工具时&#xff0c;我遇到一个很实际的问题&#xff1a;用户上传PDF或扫描件后&#xff0c;需要快速提取结构化文本&#xff0c;但又不…

作者头像 李华
网站建设 2026/9/5 12:06:41

StructBERT在农业病虫害智能诊断系统中的应用

StructBERT在农业病虫害智能诊断系统中的应用 最近跟一个做农业科技的朋友聊天&#xff0c;他提到一个挺头疼的问题&#xff1a;他们公司开发了一个面向农户的病虫害诊断小程序&#xff0c;用户可以在上面描述自家作物遇到的问题&#xff0c;比如“水稻叶子发黄&#xff0c;有…

作者头像 李华
网站建设 2026/9/5 6:42:28

智能预约系统:90%成功率的稀缺资源自动预约解决方案

智能预约系统&#xff1a;90%成功率的稀缺资源自动预约解决方案 【免费下载链接】campus-imaotai i茅台app自动预约&#xff0c;每日自动预约&#xff0c;支持docker一键部署 项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai 在数字化时代&#xff0c…

作者头像 李华
网站建设 2026/9/5 12:06:37

Nano-Banana算法优化:基于数据结构的性能提升

Nano-Banana算法优化&#xff1a;基于数据结构的性能提升 最近在折腾Nano-Banana引擎的时候&#xff0c;我发现了一个挺有意思的现象&#xff1a;同样的模型&#xff0c;同样的硬件配置&#xff0c;不同的人跑出来的性能差异能差好几倍。一开始我以为是提示词写得不够好&#…

作者头像 李华
网站建设 2026/9/3 10:55:27

gte-base-zh GPU显存精控:通过xinference --max-concurrent 4防止高并发OOM崩溃

gte-base-zh GPU显存精控&#xff1a;通过xinference --max-concurrent 4防止高并发OOM崩溃 1. 模型简介 GTE模型是由阿里巴巴达摩院研发的文本嵌入模型&#xff0c;基于BERT框架构建。该模型提供中文和英文两种语言版本&#xff0c;并在大规模语料库上进行训练&#xff0c;覆…

作者头像 李华
网站建设 2026/9/2 11:04:52

企业文档安全对话新范式:GPT4All本地化解决方案全攻略

企业文档安全对话新范式&#xff1a;GPT4All本地化解决方案全攻略 【免费下载链接】gpt4all gpt4all: open-source LLM chatbots that you can run anywhere 项目地址: https://gitcode.com/GitHub_Trending/gp/gpt4all 在数字化转型加速的今天&#xff0c;企业如何在享…

作者头像 李华