搜索
bottom↓
回复: 13

I2C从机问题

[复制链接]

出0入0汤圆

发表于 2011-6-14 14:25:21 | 显示全部楼层 |阅读模式
之前做项目,MCU都是I2C主机,而且多是访问24C系列的EEPROM,认为I2C编程超级简单,而且用GPIO就可以模拟得到
但是有一天我想实现一块24C的EEP的功能,再用一块MCU作为主机访问它,却碰到了很多问题(主要是从机的编程),最终实现了,总结一下咯,里面有很多个人的理解,如果不对请高人纠正~~~

首先模拟GPIO是不可能了,因为要捕获到start信号就够你折腾的,于是我开启了I2C的从机下的接收和发送中断。

我先说说对于从记下的接收和发送中断的理解(从机的I2C地址为:读-0xA1,写-0xA0)
接收中断,只响应0xA0的写指令,也就是说主机只有先发送了0xA0之后,再发送的数据才能进入接收中断,并且I2C模块自动过滤这个命令,也就是说在接收中断中读取接收寄存器的第一个字节是跟在0xA0后面的第一个字节。

发送中断,首先从机的发送需要主机的clk来驱动,当把要发送的数据填入到发送寄存器的时候并不是像uart那样直接就会发送,而是需要等待主机的clk来驱动,因此从机是不知道何时数据被发送出去的,但是却可以知道当前的发送fifo中空了,因此当检测到fifo空了可以产生发送中断(准确的说应该是发送完成中断),而这个中断时需要0xA1这个指令来激活的,也就是说从机只有先接收到了0xA1之后才能在主机的clk的激励下发送数据。

下面是我的实现思路:
1。主机写模式
start + I2C addr (wr) + memory addr + data 1 ... data n + stop
这个比较简单,这要在接收中断中判断第一次接收,记录下来,这个就是memory addr,后面的data每接收一次,记录的同时把memory addr + 1 (当然要考虑回卷问题)

2。主机随机读模式
start + I2C addr (wr) + memory addr +  stop + I2C addr (rd) + ... + stop

我首先在接收中断中判断第一次,记录下来,这个就是memory addr,并且把该地址下的数据预先填入发送寄存器(注意填入不代表发送,请看以上说明),然后主机会接着发送I2C addr (rd)并且继续要clk来激励,因为我已经预先填入了一个数据,所以发送完成后会触发发送中断,在发送中断中我让memory addr+1,并且继续填入要发送的数据。

整个过程就是这样,关键就是接收中断中要预先填入要发送的数据,尽管下一次指令不一定是0xA1(读取指令)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-6-14 14:28:17 | 显示全部楼层
改一个错误:
2。主机随机读模式
start + I2C addr (wr) + memory addr +  stop + start + I2C addr (rd) + ... + stop

少了个start

出0入0汤圆

发表于 2011-8-27 23:13:56 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-28 15:07:15 | 显示全部楼层
good  good

出0入0汤圆

发表于 2011-9-13 09:58:47 | 显示全部楼层
回复【楼主位】LitePuter_uvn
-----------------------------------------------------------------------

楼主用的是哪款IC,我现在用的是430F249的单片机,但是这个硬件I2C模式,但是他的操作过程我一直都没怎么弄明白,楼对这快熟的话能不能给我解释一下这快!

出0入0汤圆

发表于 2011-9-13 10:02:32 | 显示全部楼层
回复【楼主位】LitePuter_uvn
-----------------------------------------------------------------------

另外I2C的模式,不是一直都有一个应答位,怎么没有看到资料介绍这个应答位在硬I2C中是如何给出去的???也没有看到有判断I2C中是如何判断接受到了应答位的?

出0入0汤圆

发表于 2011-9-13 11:17:09 | 显示全部楼层
回复【1楼】LitePuter_uvn  
之前做项目,MCU都是I2C主机,而且多是访问24C系列的EEPROM,认为I2C编程超级简单,而且用GPIO就可以模拟得到
但是有一天我想实现一块24C的EEP的功能,再用一块MCU作为主机访问它,却碰到了很多问题(主要是从机的编程),
-----------------------------------------------------------------------

楼主之前的项目不也是访问24C,后面怎么又说24C的EEP的功能遇到问题呢?搞不懂楼主的问题。。。

出0入0汤圆

 楼主| 发表于 2011-9-16 13:24:32 | 显示全部楼层
回复【6楼】brownheart
-----------------------------------------------------------------------

呵呵,你还是不明白什么意思,之前的项目是mcu访问24c,现在我想要用mcu做一个24c,让别的mcu来访问,第一个mcu是主模式,访问24c这个从设备,第二个mcu是从模式,让别的mcu来访问……

出0入0汤圆

 楼主| 发表于 2011-9-16 13:26:40 | 显示全部楼层
回复【4楼】tianyaxtujxlg

回复【楼主位】liteputer_uvn  
-----------------------------------------------------------------------
楼主用的是哪款ic,我现在用的是430f249的单片机,但是这个硬件i2c模式,但是他的操作过程我一直都没怎么弄明白,楼对这快熟的话能不能给我解释一下这快!
-----------------------------------------------------------------------

我用的是adi的基于arm7tdmi内核的芯片
硬件i2c模式基本都是一个样子,全部是中断

出0入0汤圆

 楼主| 发表于 2011-9-16 13:36:42 | 显示全部楼层
回复【5楼】tianyaxtujxlg  
回复【楼主位】liteputer_uvn   
-----------------------------------------------------------------------  
另外i2c的模式,不是一直都有一个应答位,怎么没有看到资料介绍这个应答位在硬i2c中是如何给出去的???也没有看到有判断i2c中是如何判断接受到了应答位的?
-----------------------------------------------------------------------

这个是硬件i2c自动答复的,如果连这种应答都需要软件介入的话,那和用gpio模拟没什么区别了,建议你还是仔细看一下它的datasheet,基本上硬件发送和接收应答,stop,这种信号虽然不需要软件接入,但都会产生一个中断的,你只需要关心各个中断怎么处理即可

出0入0汤圆

发表于 2011-9-23 11:19:59 | 显示全部楼层
回复【10楼】LitePuter_uvn
-----------------------------------------------------------------------

我用AVR做主机,430做从机,主机的开始为和地址以及数据都正常发送出来了,但是从机接受到地址和数据后并不做响应,按理来,我只有配置好从机的I2C模式,只要主机有信号发送过来,地址匹配上了起码硬件会自动给出这个应答位!另外作为主机是不是一定要等待从机响应后才能进行下一步的操作???

出0入0汤圆

发表于 2012-3-2 19:47:59 | 显示全部楼层
回复【楼主位】LitePuter_uvn
-----------------------------------------------------------------------

楼主的思路很好,我也想做这个。
请教:你的思路是不用查询用中断,这非常好,避免长时间等待,如果丢失了还容易死循环。
1.你说的用从机的发送和接收中断,那你用的就是串口中断了,而且模式似乎只能用0模式了,那如何判断起始和停止标志?
2.从机不管发送还是接收,包括起始和停止标志,它的CLK都是主机给的,从机中断模式如何接收CLK,特别是发送。
3.如果从机还要完成其它功能,如果用查询方式来接收和发送数据,如何保证超时跳出还不能漏检测信号?
不知道我说明白了没有,万分感谢!

出0入0汤圆

发表于 2013-12-7 16:48:39 | 显示全部楼层
谢谢提供思路 可以试着搞搞...
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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