I2C硬件外设疑问,求助!!!

[复制链接]
7396|23
 楼主| 查干湖 发表于 2023-4-12 11:35 | 显示全部楼层 |阅读模式
问题背景:本人小白一枚,刚学习到I2C通讯,想尝试通过I2C点亮OLED。
原本通过软件可以成功点亮,但硬件却出了问题。
问题描述:
1. 通过对比软件和硬件的输出波形发现:同样是0x78(OLED地址:011110)软件显示为0x3c,硬件为0x78,但硬件没有ACK
2. 如果把硬件改为0x3c就有ACK但还没有发送数据,它会自己发送data:0x20
百思不得其解,这个问题已经折磨了我一个星期了,求求大佬们伸出援助之手
使用板子:HT32F52352
软件:

硬件:

 楼主| 查干湖 发表于 2023-4-12 11:36 | 显示全部楼层

I2C硬件外设疑问,求助!!!

本帖最后由 查干湖 于 2023-4-12 14:27 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 查干湖 发表于 2023-4-12 11:37 | 显示全部楼层

I2C硬件外设疑问,求助!!!

 楼主| 查干湖 发表于 2023-4-12 11:38 | 显示全部楼层

I2C硬件外设疑问,求助!!!

本帖最后由 tyw 于 2023-4-12 12:59 编辑

不知道为什么不可以加上图片,上面为硬件波形,下面为软件模拟












                       tyw  注

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

@tyw :参考过数据手册和它的I2C示例代码了,但还是不太理解,它到底怎么发的为什么会有0x20  发表于 2023-4-12 13:50
tyw
去自家窩里下了啃  发表于 2023-4-12 13:01
zlf1208 发表于 2023-4-12 13:04 | 显示全部楼层
本帖最后由 zlf1208 于 2023-4-12 13:06 编辑

H78 = 0111 1000,H3C = 0011 1100,软件发送H78,硬件收到H3C,从二进制码可以看出H3C左移一位就是H78,说明软件发送的时序错位了,修改软件的时序即可
 楼主| 查干湖 发表于 2023-4-12 13:42 | 显示全部楼层
查干湖 发表于 2023-4-12 11:38
不知道为什么不可以加上图片,上面为硬件波形,下面为软件模拟

参考过了,但是硬件发送还是有问题
 楼主| 查干湖 发表于 2023-4-12 13:47 | 显示全部楼层
zlf1208 发表于 2023-4-12 13:04
H78 = 0111 1000,H3C = 0011 1100,软件发送H78,硬件收到H3C,从二进制码可以看出H3C左移一位就是H78,说 ...

参考过数据手册了,但还是不太理解。我发现它直接跳过开始就发送了0x78导致硬件直接读成1111 0000
很疑惑官方库没有开始函数,而且后面的0x20不知道怎么回事

评论

没有起始位,那就自己加呗  发表于 2023-4-12 14:02
 楼主| 查干湖 发表于 2023-4-12 13:53 | 显示全部楼层
查干湖 发表于 2023-4-12 13:47
参考过数据手册了,但还是不太理解。我发现它直接跳过开始就发送了0x78导致硬件直接读成1111 0000
很疑惑 ...

还有一种猜想就是OLED会屏蔽最高位既:原本0111 1000会被读取1111 0000.因为OLED的地址码为011110
zlf1208 发表于 2023-4-12 13:55 | 显示全部楼层
查干湖 发表于 2023-4-12 11:38
不知道为什么不可以加上图片,上面为硬件波形,下面为软件模拟

加图片我都是这样做的:先把文字发出来,然后再点击“编辑”,重新进入,然后用黏贴的方法把图贴上去就行了
zlf1208 发表于 2023-4-12 13:58 | 显示全部楼层
查干湖 发表于 2023-4-12 13:47
参考过数据手册了,但还是不太理解。我发现它直接跳过开始就发送了0x78导致硬件直接读成1111 0000
很疑惑 ...

因为你的时序是错误的,所以先要纠正错误,不要去关注后面的0x20,因为前面错了,后面的东西也肯定是错的,把前面改正确了,后面自然就对了
 楼主| 查干湖 发表于 2023-4-12 14:14 | 显示全部楼层
zlf1208 发表于 2023-4-12 13:55
加图片我都是这样做的:先把文字发出来,然后再点击“编辑”,重新进入,然后用黏贴的方法把图贴上去就行 ...

图片上传成功了,可以帮忙看看吗
zlf1208 发表于 2023-4-12 14:24 | 显示全部楼层
本帖最后由 zlf1208 于 2023-4-12 14:30 编辑

图一:数据是0xF0,图二:数据是0x78,0x20,图三:数据0x78,0x00,0xAE。对比三张图,感觉图一的起始位不够宽,少了一个SCL周期
 楼主| 查干湖 发表于 2023-4-12 14:29 | 显示全部楼层
zlf1208 发表于 2023-4-12 14:24
图一:数据是0xF0,图二:数据是0x78,0x20,图三:数据0x78,0x00,0xAE。对比三张图,感觉图一的起始位 ...

请问该怎么该写呢?
zlf1208 发表于 2023-4-12 14:34 | 显示全部楼层
本帖最后由 zlf1208 于 2023-4-12 14:41 编辑
查干湖 发表于 2023-4-12 14:29
请问该怎么该写呢?

应该就是你说的没有起始位,加一个呗。现在是0x78最前面的二进制0当成了起始位。你可以发0xFF试试,我估计都发不出去
 楼主| 查干湖 发表于 2023-4-12 14:45 来自手机 | 显示全部楼层
好的感谢
timerc 发表于 2023-4-12 16:28 | 显示全部楼层
本帖最后由 timerc 于 2023-4-12 16:33 编辑

OLED地址是0x1E,是7位地址,那发送的地址应该左移一位,最后一位是R/W标志,就是地址是0x3C/0x3D;I2C起始条件满足,数据发送一般不会错,I2C一般都有起始条件和结束条件,具体是SDA和SCK的电平状态决定;还有I2C一般是用的开漏方式;你用的什么方式,IO模拟还是硬件I2C
 楼主| 查干湖 发表于 2023-4-12 18:16 | 显示全部楼层
timerc 发表于 2023-4-12 16:28
OLED地址是0x1E,是7位地址,那发送的地址应该左移一位,最后一位是R/W标志,就是地址是0x3C/0x3D;I2C起始 ...

我用的是硬件I2C。OLED的地址是6位的011110,图4上有。
但很奇怪我配置成0x78结果就成图1那样
配置成0x3c虽然没有问题,但会多一个0x20(图2)
图3是软件模拟的,配置成的0x78,但检测时0x3c但可以驱动OLED
百思不得其解
William1994 发表于 2023-4-12 19:48 | 显示全部楼层
看二楼图片里面都说了7bit地址+1bit 读写,组成8bit地址,0x78或者0x7A都可以当写地址用。
timerc 发表于 2023-4-13 08:44 | 显示全部楼层
查干湖 发表于 2023-4-12 18:16
我用的是硬件I2C。OLED的地址是6位的011110,图4上有。
但很奇怪我配置成0x78结果就成图1那样
配置成0x3c ...

那么剩下的一个地址就是SA0决定的,
SA0是0,是0x78/0x79 ;设备地址是0x3C
SA0是1,是0x7A/0x7B;  设备地址是0x3D
这有啥问题;
假设SA0是0,你用的厂家的程序,如果看不到代码,那么你用0x78不行,用0x3C可以,那就是厂家的代码函数自己对R/W标志位进行处理了,你只需要将设备的地址0x3C带进去就行了;
可以看到波形的话,就是地址命令那个在波形里面肯定要是0x78/0x79,因为波形是直接进入从设备的,地址肯定是这个;
 楼主| 查干湖 发表于 2023-4-13 14:54 来自手机 | 显示全部楼层
十分感谢大家,问题已经解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部