恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

I2C数据抓取

  • 首页
  • 资讯中心
  • /
  • I2C数据抓取

相关资讯

CC-Switch 使用攻略:一键管理多款 AI CLI 工具配置 2026/10/17 2:24:15
同步FIFO空满判定与Verilog实现:深度8参数化设计详解 2026/10/17 2:24:15
深入理解AbstractQueuedSynchronizer:Java并发锁的底层骨架 2026/10/17 2:24:15

最新资讯

React Native鸿蒙跨平台推箱子游戏:地图建模与核心逻辑实现
三天上线内容型网站:DedeCMS快速建站全流程实战
DedeCMS快速建站全流程:从部署到安全加固
别把成熟度识别当普通分类:深度学习毕设全流程避坑指南
RAG 2.0企业级实践:从投诉系统看AI原生架构设计
深入理解分布式系统一致性:从CAP理论到实际应用

今日推荐

Qwen3.5-122B-A10B-singprobe幻觉检测实战:AUC 0.7806,如何实时揪出大模型一本正经的胡话?
NetSpot 实战:用信道分析与频宽优化解决 Wi-Fi 卡顿
C++ split() 字符串分割的五种实现与性能实测

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

I2C数据抓取

发布时间:2026/10/17 2:29:15
I2C数据抓取 PB6:SCL PB7:SDA PD1:TEST脚(遇START/STOP/取反,读取sda电平)加了while(1)循环接收数据,START.STOP.SR会漏检测,数据也不对.开始我写的接收数据位流程是,SCL1读到SDA是多少就直接写进去了,如果说这时SDA数据发送变化了呢?SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化检测到start加了while(1)循环接收数据,SCL1时读取SDA,我们在读SDA确认要写入databuf之前要先判断sda是否有变化;如果说开始读到scl1,sda1,等scl1,sda1时序跑完变成scl1,sda0就是SR,是sr就继续接收数据goto receivesr; ,还是scl1,sda1 没变就写入databuf;如果说开始读到scl1,sda0,等scl1,sda0时序跑完变成scl1,sda1就是STOP,是STOP就重新去找起始条件goto start;//是STOP找START忽略应答位,只把他的时序走完不做任何操作I2C时序:空闲状态 起始条件-接收一个字节(8位)-应答位(1位)-停止条件空闲状态:SCL高电平,SDA高电平start:/*起始条件*/if((GPIOB-IDR 0x80) (GPIOB-IDR 0x40)) //SCL1 SDA1{起始条件(START):SCL高电平期间SDA从高电平切换到低电平;SCL从高电平切换到低电平,表示主机准备将数据位依次放到SDA线上高位先行while((GPIOB-IDR 0x40) (GPIOB-IDR 0x80)); //等待SCL1 SDA1跑完if((GPIOB-IDR 0x40) !(GPIOB-IDR 0x80)) //SCL1 SDA1跑完后,SCL1 SDA0 是起始条件{GPIOD-ODR ^ GPIO_Pin_1; //D1取反while((GPIOB-IDR 0x40) !(GPIOB-IDR 0x80)); //等待 SCL1 SDA0 起始条件 跑完while(GPIOB-IDR 0x40); //拉低scl等待下一时序接收一个字节:7位从机地址1位读(1)写(0)SCL低电平期间主机将数据位依次放到SDA线上高位先行然后释放SCL从机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节for(i0; i8; i) //接收8位数据{while(!(GPIOB-IDR 0x40)); //等待SCL拉高if(GPIOB-IDR 0x40) //SCL1{/*SCL1读取SDA,SDA为1就写1,为0默认写0*/if((GPIOB-IDR 0x80)) //SCL1 SDA1{/*在写期间判断SCL1时SDA是否有变化*/while((GPIOB-IDR 0x40) (GPIOB-IDR 0x80)); //等待SCL1 SDA1跑完if((GPIOB-IDR 0x40) (!(GPIOB-IDR 0x80))) //SCL1 SDA1跑完后,SCL1 SDA0, SCL1期间SDA由1-0是重复起始条件sr{GPIOD-ODR ^ GPIO_Pin_1;while((GPIOB-IDR 0x40) (!(GPIOB-IDR 0x80)));//等待SCL1 SDA0跑完while(GPIOB-IDR 0x40); //拉低scl等待下一时序goto receivesr; //是sr,继续接收}else{ //没有变化,直接接收1GPIOD-BSRR (11);//Hdatabuf | (0x80i); //置1}}else{ //SCL1 SDA0while((GPIOB-IDR 0x40) (!(GPIOB-IDR 0x80))); //等待SCL1 SDA0跑完if((GPIOB-IDR 0x40) (GPIOB-IDR 0x80))//SCL1 SDA0跑完后,SCL1 SDA1, SCL1期间SDA由0-1是结束条件STOP{GPIOD-ODR ^ GPIO_Pin_1;goto start; //是STOP找START}else{ //没有变化,直接接收0GPIOD-BRR (11);//Ldatabuf ~(0x80i); //置0}}}}接收应答位(先忽略):接收前释放SDA,避免干扰从机的数据发送;释放SCL,主机在SCL高电平期间读取SDA,拉低SCL开始下一个时序模块/*ACK*/while(!(GPIOB-IDR 0x40)); // 等 SCL 高if(GPIOB-IDR 0x80){GPIOD-BSRR (11);//Lack 1;}else{GPIOD-BRR (11);//Lack 0;}while(GPIOB-IDR 0x40); // 等 SCL 低终止条件SCL高电平期间SDA从低电平切换到高电平while((GPIOB-IDR 0x40) (!(GPIOB-IDR 0x80))); //等待SCL1 SDA0跑完if((GPIOB-IDR 0x40) (GPIOB-IDR 0x80))//SCL1 SDA0跑完后,SCL1 SDA1, SCL1期间SDA由0-1是结束条件STOP{GPIOD-ODR ^ GPIO_Pin_1;goto start; //是STOP找START

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号