数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2179|回复: 17

[C51] 请教关于I2C总线问题

[复制链接]
发表于 2022-3-14 11:21:54 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
单片机I/O口模拟I2C总线挂载多个I2C器件,我现在代码实现没有问题,能见到的例程大都是采用单片机主机通讯模式,我想知道,如果采用单片机非主机(传感器主机模式)会有什么问题,我只知道可能会有总线占用问题,但不知道会否影响单片机的其他工作,请高手大神门得空说说,先谢了。
发表于 2022-3-14 12:21:20 | 显示全部楼层
应该没有啥问题吧?指令中不是都有地址码和主从机判断么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-16 09:26:48 | 显示全部楼层
本帖最后由 慕名而来 于 2022-3-16 09:50 编辑
xiaoyao_mdj 发表于 2022-3-14 12:21
应该没有啥问题吧?指令中不是都有地址码和主从机判断么?

多谢临帖指点,看来这个求问贴注定要沉了,不知道是因为太基础的东西没人感兴趣还是大家都不用单片机非主机I2C这种模式,其实我的问题是这样的,因为喜欢,我经常做各种单片机闹表、万年历,用于采集温度、湿度的传感器我喜欢用HTU21D,以前用过的两只都是采样STC8系列有硬件I2C的单片机,驱动HTU21D毫无障碍而且精度也很好,最近无聊又在玩编程时发现,用STC12或STC15无硬件I2C的单片机的I/O口模拟I2C总线驱动HTU21D时出现了各种奇奇怪怪的问题,很多以往使用非常可靠的模拟I2C程序也不好用了,为了验证器件的品质,我又搭了电路用ESP8266通过arduino程序来测试,结果传感器毫无问题,接下来继续在STC15W板子上测试,最终发现如果采用单片机非主机模式则采集的数据是正确的,由此我想到了这个问题,看过很多单片机驱动I2C器件的例程、为什么没有用非主机模式的那,我这个爱玩单片机的编程菜鸟真心的不懂,于是发帖求教。
回复 支持 反对

使用道具 举报

发表于 2022-3-16 10:36:29 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2022-3-16 09:26
多谢临帖指点,看来这个求问贴注定要沉了,不知道是因为太基础的东西没人感兴趣还是大家都不用单片机非主 ...

IIC协议本身就支持多主机多从机。
你软件模拟出问题估计是代码问题吧?
搜索下IIC的总线仲裁机制看看吧。
回复 支持 反对

使用道具 举报

发表于 2022-3-16 12:54:43 | 显示全部楼层
本帖最后由 简燕 于 2022-3-16 15:09 编辑

在标准IIC电路里,SCK和SDA都是双向信号,主机与从机传输数据时,SCK由主机产生,当从机忙,不能继续接收或者发送数据时,从机会把SCK线拉低,阻止主机继续发送时钟.这时主机端需要等待SCK信号恢复为高电平后,才能继续发送时钟.这就是HTU21D的"Hold Master Mode".

对应到HTU21D上,如果采用"保持主机模式",主机在发送完"读取"指令后,从机立即将SCK线拉低,阻止主机继续发送时钟,此时主机必须等待.从机HTU21D完成采集转换,数据准备好后,释放SCK信号线,主机检测到SCK恢复高电平后,继续发送时钟,从机把数据送往SDA线上.

如果软件模拟IIC的代码不完备,不支持对SCK双向信号的处理,则上述过程就无法完成,只能采用HTU21D的"非保持主机模式".

HTU21D,无论是"主机保持模式",还是"非主机保持模式",它都是从机."Hold Master Mode"翻译成"主机保持模式",很别扭,容易产生歧义.

回复 支持 反对

使用道具 举报

发表于 2022-3-16 17:29:59 | 显示全部楼层
操作SHT21时,延时比手册里给出的时间稍长的时间再去读取结果就行了,没必要让它占着总线,也没必要频繁读取。
非保持主机模式,如果你的主控芯片的I2C像某厂家芯片的I2C一样不发Stop、Re-Start它就停不下来的话,启动转换后发送Stop、延时再读取数据SHT21也认,无需完全按照数据手册时序操作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-17 09:29:50 | 显示全部楼层
非常感谢以上几位朋友的热心指点,其实,现在程序已经调试好了,我只是不知道如果HTU21D主机保持模式下对单片机的其他工作会有那些影响,再次感谢各位!我也将发帖分享这段调试好了的代码。
https://www.mydigit.cn/thread-302008-1-1.html


回复 支持 反对

使用道具 举报

发表于 2022-3-17 22:49:31 | 显示全部楼层
慕名而来 发表于 2022-3-17 09:29
非常感谢以上几位朋友的热心指点,其实,现在程序已经调试好了,我只是不知道如果HTU21D主机保持模式下对单 ...

软件模拟IIC,如果是HTU21D工作在Hold Master Mode模式下,对单片机其他工作没有影响,因为HTU21D还是个IIC的Slave设备.就是对程序员有影响,费脑子,哈哈.
回复 支持 反对

使用道具 举报

发表于 2022-3-17 22:58:58 | 显示全部楼层
简燕 发表于 2022-3-17 22:49
软件模拟IIC,如果是HTU21D工作在Hold Master Mode模式下,对单片机其他工作没有影响,因为HTU21D还是个IIC ...

他的程序是循环等待的,无论哪种模式,等待期间都干不了别的活的。
回复 支持 反对

使用道具 举报

发表于 2022-3-17 23:08:39 | 显示全部楼层
本帖最后由 hecat 于 2022-3-17 23:09 编辑

软件模拟IIC Slave,CPU就耗死在这里了,做不了其他事,你得时刻准备着,因为你不知道Master什么时候会访问你。
如果Master以400k访问,SCL变化速度是1.25uS,这个速度下软件模拟Slave没几个单片机扛得住。
即便100k速度,代码优化不好的都容易出错。

软件模拟的,一般都用作Master。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-18 10:10:21 | 显示全部楼层
hecat 发表于 2022-3-17 23:08
软件模拟IIC Slave,CPU就耗死在这里了,做不了其他事,你得时刻准备着,因为你不知道Master什么时候会访问 ...

多谢!看来速度是大问题,难怪能见到的例程几乎都是主模式通讯的,学习了。
回复 支持 反对

使用道具 举报

发表于 2022-3-18 11:06:00 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2022-3-18 10:10
多谢!看来速度是大问题,难怪能见到的例程几乎都是主模式通讯的,学习了。 ...

见到都是主机模式是因为,编程都是为了读取其他设备的信息,对于iic来说,只有主机才能发起通讯,所以只能设置为主机才能主动读取信息。

至于速度我认为问题不大,非要做从机的话,可以用中断来判断主机发起通讯请求,不需要轮询。
回复 支持 反对

使用道具 举报

发表于 2022-3-18 11:17:41 来自手机浏览器 | 显示全部楼层
慕名而来 发表于 2022-3-18 10:10
多谢!看来速度是大问题,难怪能见到的例程几乎都是主模式通讯的,学习了。 ...

另外分清楚两个概念:
一、主机和从机:
iic只能主机发起开始信号,从机被动应答。

二、Hold Master 和 No Hold Master (主机保持和非主机保持模式):这个是针对从机来说的
主机保持模式:从机收到命令后需要时间来准备数据,准备数据这段时间iic的时钟线被从机拉低,iic总线所有通讯停止,主机检测到时钟线恢复高电平后才可以继续发送时钟脉冲并以从从机读取数据。
非主机保持模式:从机不会拉低时钟线的电平,在从机准备数据这段时间,总线上的其他设备可以正常通讯。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-18 20:51:37 | 显示全部楼层
crazy0qwer 发表于 2022-3-18 11:17
另外分清楚两个概念:
一、主机和从机:
iic只能主机发起开始信号,从机被动应答。

多谢!根据各位的交流,我的理解是,无论传感器主模式还从模式,影响到的只是这对儿I2C总线上其他器件的驱动,与单片机本身无关,换言之单片机总是主动控制方并不会被谁拖累,而如果总线上的各个器件都是从模式时,单片机可以分别启动工作、分别查询收集数据,而传感器主模式时只能一对一的通讯。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-18 21:06:04 | 显示全部楼层
本帖最后由 慕名而来 于 2022-3-18 21:09 编辑

真心感谢与楼上各位的交流,以下是我的理解但不知道是否正确还请各位指正:我的问题描述的本身是有错误的,无论怎样的控制单片机总是主控设备,只有在传感器采样工作期间短时间等待,并不会被器件锁定,无论单片机模拟的I2C总线上挂载了多少个器件,单片机对数据的采集总是要一个个的进行,例如,同时有RX8025+HTU21D,无论他们的工作模式为主模式还是从模式,单片机总是要采集完时间并送显示后再来采集温湿度并送显示,在这种应用场景下就无所谓它们各自的工作模式了,只要单片机分配好采集时段就可以了。
回复 支持 反对

使用道具 举报

发表于 2022-3-18 21:47:32 | 显示全部楼层
慕名而来 发表于 2022-3-18 21:06
真心感谢与楼上各位的交流,以下是我的理解但不知道是否正确还请各位指正:我的问题描述的本身是有错误的, ...

你的理解是错的,传感器、存储器都是作为从机存在的,因为它们是没有思想的,它们不知道什么时候通讯、以什么参数通讯。I2C总线同一时间只能有一个主机在工作,如果多个主机哄抢总线,仲裁机制确定谁可以控制总线,如果是非标的主机或软件模拟的主机不按套路来,通讯就进行不下去了。SHT21的保持主机模式和非保持主机模式实际上并没有区别,因为I2C协议允许从机拉低时钟线使主机进入等待状态,只是保持主机模式拉低时钟线的时间太长而已。如果主机的模拟的,时钟线和数据线的高电平都应由上拉电阻产生,即输出“1”时应把IO设置为输入上拉态、高阻输入态,不能设置为推挽输出,输出前应检测IO是不是高电平,如果是低电平,应等待知道IO变为高电平。


回复 支持 反对

使用道具 举报

发表于 2022-3-18 23:14:49 | 显示全部楼层
慕名而来 发表于 2022-3-18 20:51
多谢!根据各位的交流,我的理解是,无论传感器主模式还从模式,影响到的只是这对儿I2C总线上其他器件的 ...

有点问题。

总之记住一点:同一时刻只能有两个设备通讯。所以如果总线上挂了多个设备,不管是<主机、从机、保持模式、非保持模式>,那么主机在开始通讯时候一定要判断总线是否空闲。

至于如何判断,还是百度下 《IIC总线仲裁》  吧
回复 支持 反对

使用道具 举报

发表于 2023-4-28 15:59:47 | 显示全部楼层
现在STC32位的8051,全部有DMA支持的I2C, 速度最快 系统时钟/8, 如工作在35MHz, /8 = 4.375M bps
现在STC 1T 的8051,全部有I2C, 速度最快 系统时钟/8, 如工作在40MHz, /8 = 5M bps
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-24 20:42 , Processed in 0.265201 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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