找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3254|回复: 32
打印 上一主题 下一主题
收起左侧

关于硬件I2C调试

[复制链接]
跳转到指定楼层
楼主
硬件I2C调试,在数据传输过程中,会周期性的发生主机给从机发送地址没有停止位,造成通讯中断,加入外部中断,在没有停止位的时候重启I2C,加入外部中断调试发现,在从机向主机传输 数据 过程中,容易误触发外部中断,所以加入定时器1,给外部中断在从机向主机发送数据时 延时50 us后再开启外部中断,现在遇到的问题是加了很多中断,程序短时间运行可以,长时间运行程序中断会死机,所有中断进不去。

51hei图片_20210916082632.jpg (130.24 KB, 下载次数: 82)

51hei图片_20210916082632.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-9-16 12:39 | 只看该作者
停止位? 你确定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?
回复

使用道具 举报

板凳
ID:959346 发表于 2021-9-16 14:36 | 只看该作者
1 你是主设备还是从设备出问题?2 你这个不是硬件IIC,是软件模拟的IIC吧?硬件IIC只要配置完成,中间不需要软件处理,不会受中断影响啊。
回复

使用道具 举报

地板
ID:933803 发表于 2021-9-16 14:51 | 只看该作者
188610329 发表于 2021-9-16 12:39
停止位? 你确定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

你没用过I2C吗,STOP信号啊
回复

使用道具 举报

5#
ID:933803 发表于 2021-9-16 14:53 | 只看该作者
Jiang_YY 发表于 2021-9-16 14:36
1 你是主设备还是从设备出问题?2 你这个不是硬件IIC,是软件模拟的IIC吧?硬件IIC只要配置完成,中间不需 ...

从设备出问题,从设备向主设备发送数据,不会受其他中断影响,那就是I2C中断优先级是最高的吗
回复

使用道具 举报

6#
ID:933803 发表于 2021-9-16 14:58 | 只看该作者
Jiang_YY 发表于 2021-9-16 14:36
1 你是主设备还是从设备出问题?2 你这个不是硬件IIC,是软件模拟的IIC吧?硬件IIC只要配置完成,中间不需 ...

我用的是硬件I2C,只不过这个芯片硬件I2C 可能有bug,从机向主机传输数据完成后,不产生停止位,所有加入外部中断 重启I2C,这种方法短时间程序可以运行,长时间所有中断容易 挂,包括看门狗也失效
回复

使用道具 举报

7#
ID:592807 发表于 2021-9-16 16:46 | 只看该作者
188610329 发表于 2021-9-16 12:39
停止位? 你确定你用的是I2C? I2C 有停止位的么? 不是只有 ACK, NAK 么?

I2C有开启信号和终止信号和ACK,停止位STOP BIT不是串口通信的吗
回复

使用道具 举报

8#
ID:401564 发表于 2021-9-16 18:04 | 只看该作者
没有启动信号和停止信号就不叫IIC,只能是叫一种通讯方式,它能叫IIC就肯定是有启动和停止信号的
如果是像你说的没有信号,你怎么知道接收到的数据是第几个位的?反正就是时钟和高低电平而已
回复

使用道具 举报

9#
ID:187802 发表于 2021-9-16 18:38 | 只看该作者
调整一下频率吧
回复

使用道具 举报

10#
ID:959346 发表于 2021-9-17 09:24 | 只看该作者
3346661547 发表于 2021-9-16 14:58
我用的是硬件I2C,只不过这个芯片硬件I2C 可能有bug,从机向主机传输数据完成后,不产生停止位,所有加入 ...

IIC的停止信号是由主设备产生的啊,从设备只产出ACK信号啊?
回复

使用道具 举报

11#
ID:844772 发表于 2021-9-17 10:13 | 只看该作者
是不是适用的库有问题,不可能不发停止信号,把程序贴点上来看看呗,用两个中断去处理停止问题,频率上不来啊。
回复

使用道具 举报

12#
ID:933803 发表于 2021-9-17 13:19 | 只看该作者
glinfei 发表于 2021-9-17 10:13
是不是适用的库有问题,不可能不发停止信号,把程序贴点上来看看呗,用两个中断去处理停止问题,频率上不来 ...

用两个中断可以运行,只不过不能长时间运行,能运行4,5个小时
回复

使用道具 举报

13#
ID:933803 发表于 2021-9-17 13:23 | 只看该作者
glinfei 发表于 2021-9-17 10:13
是不是适用的库有问题,不可能不发停止信号,把程序贴点上来看看呗,用两个中断去处理停止问题,频率上不来 ...

通过示波器观察,在从机向主机发送数据的时候,SDA数据变化不在时钟低电平中间变化电平,在时钟快要上升沿的时候才变化电平,容易造成误判为停止信号,造成数据异常,加入定时器约束外部中断判断时间,在数据发送完成再判断。
回复

使用道具 举报

14#
ID:933803 发表于 2021-9-17 15:18 | 只看该作者
glinfei 发表于 2021-9-17 10:13
是不是适用的库有问题,不可能不发停止信号,把程序贴点上来看看呗,用两个中断去处理停止问题,频率上不来 ...

主要问题是这个硬件I2C,在几次通讯完成后,周期性的有一次,发送完数据后缺少应答位,主机直接发送停止位,但是I2C从机不进入空闲状态。
回复

使用道具 举报

15#
ID:624769 发表于 2021-9-17 15:29 | 只看该作者
3346661547 发表于 2021-9-16 14:51
你没用过I2C吗,STOP信号啊

STOP 终止信号,不是停止位,这两个意思不能搞混。
串口发送8位数据后,有一个停止位,这个之所以叫停止位,是因为有个固定的位置。
而I2C, 发送 8位字节和接受1位ACK/NAK 应答位,这些位置是固定的,所以叫“位”
但是,任何时候,只要CLK高电平的时候,即两个“位”的中间区域 拉高 IO 就产生了终止传输信号,这个不能叫做"位",你可以在ACK之后发,也可以在数据传输一半的时候发,所以,I2C是没有停止"位"的,设计的时候,就没有给终止信号,预留一个专门的"位"给他。
所以,事实上不该你问我用过I2C吗? 而是你到底搞明白什么是 I2C了吗?
回复

使用道具 举报

16#
ID:933803 发表于 2021-9-17 15:45 | 只看该作者
188610329 发表于 2021-9-17 15:29
STOP 终止信号,不是停止位,这两个意思不能搞混。
串口发送8位数据后,有一个停止位,这个之所以叫停止 ...

我就叫他停止位不行吗,I2C是你发明的吗,哪个不知道我说的I2C中的停止位就是STOP终止信号,还有其他意思吗,我说了停止位你就关注到这几个字了?也只有你在这扣字眼,天生杠精啊
回复

使用道具 举报

17#
ID:624769 发表于 2021-9-17 16:06 | 只看该作者
3346661547 发表于 2021-9-17 15:45
我就叫他停止位不行吗,I2C是你发明的吗,哪个不知道我说的I2C中的停止位就是STOP终止信号,还有其他意思 ...

不是我扣字眼,是你钻牛角尖了。
我之所以跟你强调,没有停止“位”,就是让你明白,  串口有专属的停止“位”,所以,是硬件自己完成的。

而I2C是没有停止“位”的,所以,不管你是不是用的硬件I2C, 没有发送终止传输的“信号”,
不是硬件有问题,只是你没有让他去发送这个终止传输的“信号”,

硬件的I2C 自身不会 自做主张 发送 停止“信号”, 因为它无法确定何时需要发停止“信号”,因为没有专门发送停止信号的“位”。需要你自己在你认为适当的时候,命令I2C硬件 发送 终止传输的“信号”。
回复

使用道具 举报

18#
ID:933803 发表于 2021-9-17 16:06 | 只看该作者
188610329 发表于 2021-9-17 15:29
STOP 终止信号,不是停止位,这两个意思不能搞混。
串口发送8位数据后,有一个停止位,这个之所以叫停止 ...

就显的你很懂I2C了,我看你是很会扣字眼啊,自己上百度搜搜I2C停止位,看看有没有人用I2C停止位这个词提问,就算都叫错了,难道大家就不知道这个就是STOP停止信号了?咋就显的你很棒呢,键盘在手,天下我有?我看你不该叫高级工程师,应该叫高级扣字眼工程师。
回复

使用道具 举报

19#
ID:933803 发表于 2021-9-17 16:20 | 只看该作者
188610329 发表于 2021-9-17 16:06
不是我扣字眼,是你钻牛角尖了。
我之所以跟你强调,没有停止“位”,就是让你明白,  串口有专属的停止 ...

什么叫适当的位置命令I2C硬件硬件发送终止传输的信号?硬件I2C不都是传输完成后主机自动发送STOP信号的吗,还要命令?你说的是软件I2C吧,硬件I2C工作流程是只要把寄存器配置好了,自动发送START信号和STOP信号,第一步主机发出START信号+从机地址,第二步传感器地址,第三步寄存器操作命令,寄存器读还是写,第四部是数据传输+主机发出STOP信号进入空闲状态然后进入下一次传输,主机发出START...。什么叫适当的地方发送STOP信号呢?
回复

使用道具 举报

20#
ID:933803 发表于 2021-9-17 16:24 | 只看该作者
188610329 发表于 2021-9-17 16:06
不是我扣字眼,是你钻牛角尖了。
我之所以跟你强调,没有停止“位”,就是让你明白,  串口有专属的停止 ...

你到底懂不懂硬件I2C哦,
回复

使用道具 举报

21#
ID:933803 发表于 2021-9-17 16:26 | 只看该作者
188610329 发表于 2021-9-17 16:06
不是我扣字眼,是你钻牛角尖了。
我之所以跟你强调,没有停止“位”,就是让你明白,  串口有专属的停止 ...

我看你只会纠结I2C的STOP信号不该叫停止位,你是只会这个吧,
回复

使用道具 举报

22#
ID:624769 发表于 2021-9-17 16:30 | 只看该作者
3346661547 发表于 2021-9-17 16:20
什么叫适当的位置命令I2C硬件硬件发送终止传输的信号?硬件I2C不都是传输完成后主机自动发送STOP信号的吗 ...

你前面三步都对,
第四步错了, 第四步只是数据传输,第五步才是发送 STOP 指令,因为数据可能会传输多次,会多次循环第四步。等到所有的数据都接受完毕,才会去发送 STOP 指令,终止传输。
回复

使用道具 举报

23#
ID:624769 发表于 2021-9-17 16:46 | 只看该作者
3346661547 发表于 2021-9-17 16:26
我看你只会纠结I2C的STOP信号不该叫停止位,你是只会这个吧,

你要是觉得我不懂,你懂得话那么就这么觉得吧,反正我I2C用到现在没出过任何问题,现在遇到问题的是你。

纵观用到现在各种不同的的 硬件I2C,
全手动的,所有信号包括ACK/NAK都要自己发送和接收的用过,
半自动的,自动开始信号,自动ACK/NAK的也用过。
就是没有见到过 自动 STOP 信号的。

一个单片机而已,又不是人工智能,它能知道你数据传输完了?然后就自动切断链接了? 你查查手册上,I2C的命令寄存器,里面的指令集,终止传输的指令 到底是独立的,还是会包含在其他指令里?
回复

使用道具 举报

24#
ID:161164 发表于 2021-9-17 17:54 | 只看该作者
说了那么多还是没有提及该有Bug的芯片的型号牌子
是不是特供需要保密的?
回复

使用道具 举报

25#
ID:933803 发表于 2021-9-17 18:33 | 只看该作者
188610329 发表于 2021-9-17 16:46
你要是觉得我不懂,你懂得话那么就这么觉得吧,反正我I2C用到现在没出过任何问题,现在遇到问题的是你。
...

我的I2C不是有问题,只是这个芯片的硬件I2C有bug,调试比较难,现在能持续运行几个小时,中断就挂了,所有中断全部失效,包括看门狗也失效,程序其他没用到中断的地方还能继续运行。不知道是什么原因,用示波器也抓不到最后传输过程中发生了什么导致中断挂了,我也没有逻辑分析仪。
回复

使用道具 举报

26#
ID:624769 发表于 2021-9-17 19:23 | 只看该作者
3346661547 发表于 2021-9-17 18:33
我的I2C不是有问题,只是这个芯片的硬件I2C有bug,调试比较难,现在能持续运行几个小时,中断就挂了,所 ...

如果,你的单片机,连看门狗都挂了,那么就不是I2C,或者中断的问题,

而是你单片机直接有问题,或者晶振直接停摆了。你反而应该在这方面去找原因了。因为,就算I2C有bug,也不可能挡住 看门狗 要重起的欲望。因为看门狗是逆向判断,到时间了就重起,除非你不停的给看门狗喂时间。所以就算单片机因为你程序的问题,或者其它硬件的问题卡死了,时间一到看门狗就会重起。
回复

使用道具 举报

27#
ID:933803 发表于 2021-9-17 19:43 | 只看该作者
188610329 发表于 2021-9-17 19:23
如果,你的单片机,连看门狗都挂了,那么就不是I2C,或者中断的问题,

而是你单片机直接有问题,或者晶 ...

我现在做的是芯片代码移植,之前的板子的芯片是ST的,现在改用ABOV的,用的是硬件I2C的100khz的传输速率,移植的是从机的代码,从机检测温湿度发送主机,移植的代码和原ST的代码思路是一样的,和ABOV官网I2C例程配置寄存器的方法都是一样的,用这种方法周期性的通讯完成后,主机发送START+地址后缺少应答位,主机直接发送STOP信号了,但是I2C从机不进入空闲状态,所以我用外部中断直接检测STOP信号,在从机给主机发送数据开始的时候打开使能外部中断,检测到STOP信号直接重新初始化I2C,然后关闭外部中断,这样通讯就不会中断,但是在传输传感器数据过程中容易误判为STOP信号,所以加了定时器延时外部中断,等到数据要传输完成再打开外部中断。
回复

使用道具 举报

28#
ID:933803 发表于 2021-9-17 19:44 | 只看该作者
188610329 发表于 2021-9-17 19:23
如果,你的单片机,连看门狗都挂了,那么就不是I2C,或者中断的问题,

而是你单片机直接有问题,或者晶 ...

我是把看门狗喂狗直接放在定时器中断里面,中断挂了看门狗也不会复位
回复

使用道具 举报

29#
ID:933803 发表于 2021-9-17 19:51 | 只看该作者
3346661547 发表于 2021-9-17 19:44
我是把看门狗喂狗直接放在定时器中断里面,中断挂了看门狗也不会复位

会不会是因为中断太频繁造成的,因为外部中断是在传输数据过程中就打开,SDA一个上升沿就进入外部中断,应该会很频繁,传输整个字节外部中断都是打开的,大概20us进入一次外部中断,最多能进入8次外部中断
回复

使用道具 举报

30#
ID:624769 发表于 2021-9-17 20:32 | 只看该作者
3346661547 发表于 2021-9-17 19:44
我是把看门狗喂狗直接放在定时器中断里面,中断挂了看门狗也不会复位

你是不是对看门狗有什么误会?
你把喂狗放在定时器里,定时器中断挂了,看门狗铁定就会复位,而只要定时器中断没挂,看门狗就不会生效,那么,这看门狗还有什么意义?和没开没有任何区别。
另外,我不明白,你在SDA上设什么外部中断,你如果是硬件I2C,你要中断控制不是应该用I2C 中断么?
就算是软件模拟I2C, 做主机的话,不需要中断,做从机的话,外部中断也是压在CLK上,没有放在SDA上的,因为,时钟变化了,SDA变化才有意义,时钟没有变化,SDA的变化没有任何意义。
回复

使用道具 举报

31#
ID:401564 发表于 2021-9-17 22:21 | 只看该作者
与其在这跟别人抬扛,不如把电路,单片机型号,IIC器件型号上传,说不定有人用过,问题就能解决了也说不定
回复

使用道具 举报

32#
ID:933803 发表于 2021-9-18 08:05 | 只看该作者
188610329 发表于 2021-9-17 20:32
你是不是对看门狗有什么误会?
你把喂狗放在定时器里,定时器中断挂了,看门狗铁定就会复位,而只要定时 ...

外部中断不是放在I2C的引脚上,用I2C引脚短接其他外部中断引脚,用其他引脚监控I2C引脚状态。SDA变化没意义????STOP信号是啥????我看的是假的I2C ???
回复

使用道具 举报

33#
ID:1069203 发表于 2023-3-31 10:36 | 只看该作者
3346661547 发表于 2021-9-17 13:23
通过示波器观察,在从机向主机发送数据的时候,SDA数据变化不在时钟低电平中间变化电平,在时钟快要上升 ...

这个波形的问题是咋回事呀,请问有解决吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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