野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10198|回复: 18

软件模拟I2C

[复制链接]
发表于 2022-1-10 17:12:34 | 显示全部楼层 |阅读模式
软件模拟I2C想着用逻辑分析仪看下波形,用了给的例程,观察SDA和SCL分别配置的是GPIOB.7和GPIOB.6,结果是波形没变化一直低电平,问了客服,也没有回答,
然后我用DAP仿真,输入信号,逻辑分析仪直接提示PORTB.6是Unknow Signal,
想请教下为什么,
回复

使用道具 举报

发表于 2022-1-12 09:03:01 | 显示全部楼层
用示波器来看,实在不行用debug,一步一步慢慢分析
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-1 19:38:19 | 显示全部楼层
就是没有示波器
回复 支持 反对

使用道具 举报

发表于 2022-3-2 10:04:41 | 显示全部楼层
先查GPIO 配置,注意时钟有没有开
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 17:29:34 | 显示全部楼层
白鹭林暗旅 发表于 2022-3-2 10:04
先查GPIO 配置,注意时钟有没有开

开了,都说是不能看的,只能用示波器看
回复 支持 反对

使用道具 举报

发表于 2022-3-7 16:27:13 | 显示全部楼层
old 发表于 2022-3-6 17:29
开了,都说是不能看的,只能用示波器看

开漏输出需要外接上拉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-8 09:30:56 | 显示全部楼层
LONG_R3acc 发表于 2022-3-7 16:27
开漏输出需要外接上拉

用的是推挽输出
回复 支持 反对

使用道具 举报

发表于 2022-3-8 11:08:53 | 显示全部楼层
old 发表于 2022-3-8 09:30
用的是推挽输出

必须是开漏外部上拉,推挽用不了的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-9 09:35:53 来自手机 | 显示全部楼层
为什么一定是外部上拉
回复 支持 反对

使用道具 举报

发表于 2022-3-9 10:47:36 | 显示全部楼层
old 发表于 2022-3-9 09:35
为什么一定是外部上拉

IIC协议支持多个主设备与多个从设备在一条总线上, 如果不用开漏输出, 而用推挽输出, 会出现主设备之间短路的情况 .  至于为什么需要上拉电阻, 那是因为IIC通信需要输出高电平的能力. 为了实现多个主设备抢占总线时的仲裁.IIC只有两根线(SCL和SDA), 怎么判断哪个主设备占用总线(当然是先来后到了).  假设主设备A需要启动IIC, 他需要在SCL高电平时, 将SDA由高电平转换为低电平作为启动信号. 主设备A在把SDA拉高后, 它需要再检查一下SDA的电平. 为什么? 因为线与. 如果主设备A拉高SDA时, 已经有其他主设备将SDA拉低了. 由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平, 而是低电平. 说明其他主设备抢占总线的时间比它早, 主设备A只能放弃占用总线. 如果是高电平, 则可以占用. 这就是开漏输出在IIC通信中的另一个作用. SDA是高电平, 说明主设备A可以占用总线, 然后主设备A将SDA拉低, 开始通信. SDA是低电平, 说明有人已经捷足先登了, 主设备A不能占用总线, 结束通信. 因此, 模拟IIC一定要将GPIO端口设置为开漏输出并加上上拉电阻.(硬件IIC会自动配置为开漏输出)
回复 支持 2 反对 0

使用道具 举报

发表于 2022-3-9 17:59:54 | 显示全部楼层
old 发表于 2022-3-9 09:35
为什么一定是外部上拉

其实用推挽输出也可以,就是记得读数据时切换回来
推挽引脚没有输出这个问题其实很容易找,要么是内部配置,要么外部检测...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-9 21:42:45 | 显示全部楼层
ID-fHtdZc 发表于 2022-3-9 17:59
其实用推挽输出也可以,就是记得读数据时切换回来
推挽引脚没有输出这个问题其实很容易找,要么是内部配 ...

不是很明白你的意思,就是软件仿真的时候改GPIO的配置吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-9 22:01:03 | 显示全部楼层
说错了,我配置的是开漏输出,但是软件仿真,SCL和SDA都是一直为低电平
野火论坛202203092201017676..png
回复 支持 反对

使用道具 举报

发表于 2022-3-10 08:45:43 | 显示全部楼层
本帖最后由 ID-fHtdZc 于 2022-3-10 08:53 编辑
old 发表于 2022-3-9 22:01
说错了,我配置的是开漏输出,但是软件仿真,SCL和SDA都是一直为低电平

开漏输出的话一定要接上拉电阻,否则引脚输出高电平的时候是处于相当于浮空的状态

而且你的引脚配置也错了,软件模拟I2C要配置引脚成普通的开漏输出 GPIO_Mode_Out_OD,而不是复用开漏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-12 18:08:02 | 显示全部楼层
ID-fHtdZc 发表于 2022-3-10 08:45
开漏输出的话一定要接上拉电阻,否则引脚输出高电平的时候是处于相当于浮空的状态

而且你的引脚配置也错 ...

指南者PB6和PB7接了上拉电阻的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-12 18:08:53 | 显示全部楼层
那个复用确实是我错了,配置为通用开漏输出就行
野火论坛202203121808092973..png
野火论坛202203121808181373..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-12 18:09:31 | 显示全部楼层
顺便问下,硬件I2C那两个管脚可以用来当作普通GPIO使用,来作软件I2C吗
回复 支持 反对

使用道具 举报

发表于 2022-3-14 09:59:10 | 显示全部楼层
本帖最后由 ID-fHtdZc 于 2022-3-14 10:01 编辑
old 发表于 2022-3-12 18:09
顺便问下,硬件I2C那两个管脚可以用来当作普通GPIO使用,来作软件I2C吗

可以的,软件I2C需要自己写模拟I2C总线的驱动代码。I2C总线上也可以挂载多个设备
回复 支持 反对

使用道具 举报

发表于 2022-3-19 14:16:51 | 显示全部楼层
你可以先单独的控制一下信号的高低电平,看看输出高的时候是否为3.3 输出低的时候是否为0,等高低电平没有问题了,再配置模拟IIC
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-22 15:45 , Processed in 0.156303 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表