原创 单片机模拟I2C从机的构思

2008-8-31 10:03 6544 7 9 分类: MCU/ 嵌入式

在论坛里看到有人想用单片机模拟I2C从机。


原帖:http://bbs.ednchina.com/ShowTopic.aspx?id=68892


#1 楼主:有关I2C的问题,请求帮助。 精华帖


贴子发表于:2008-8-25 18:06:20




我最近用单片机模拟I2C做slave,现在做出来了,但是误码率很高,检查了一下原因,是地址经常读错,还有的是地址读到之后没有给主机应答。我检测时钟信号是用while语句写的,下面是我写的接收一个字节数据的程序:


uchar RcvB()
{


。。。。。。
}


首先很少人有这个想法,但模拟主机很普遍。


模拟I2C主机是可行的,因为时钟SCL由主机提供,MCU很容易掌控。


但是模拟I2C从机的难度要大很多。


首先SCL由主机提供,有效地捕捉和跟随它要看主机的速率而定。


所以选择模拟从机应该是个错误,但又带来了可行性的讨论。


一般IO模拟有2种方法:中断或查询。


由于中断有着固定的响应时间,再加上到中断的有效处理处的时间,可能信号早已翻转,此时有不如简单的IO查询了。


所以要根据主机速率来选择IO模拟的方式。


真正满足I2C协议的主机有个很重要的特性:


允许从机拉低时钟降速。


这就告诉我们模拟从机是可行的,虽然并不合理。


考虑到中断嵌套和中断响应时间等问题,我认为查询比中断会好些。(当主机速率低是中断是很好的选择)


但这又带来了CPU占有率的问题。


因为while(SCL)或while(!SCL)会使其他任务阻塞,故裸奔时其他程序


应该由定时中断及其他中断激活,OS时由高优先级任务激活。


这样做问题又来了---其他任务打断了I2C协议的次序。


所以程序应该采用协作式,即在主机SCL=0时:


首先从机拉低SCL=0!!!


若需从机发送数据,此时从机可以发送SDA.


然后开中断在其他任务中断时把控制权让出。


当从机程序重新获取控制权后,再关中断后释放SCL=1.


再用while(!SCL)捕捉SCL的上升沿后来读取SDA数据。


总之模拟从机很困难,成功的前提时:


必须捕捉到SCL=0而不丢失一次。


要做到这个可以选择外部中断为最高级中断。但中断响应时间


必须小于SCL=0的脉宽,否则只能采用查询方法。

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户461316 2008-9-4 18:54

这个构思不错!!!

ilove314_323192455 2008-8-31 17:46

这个想法不错
相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
EE直播间
更多
我要评论
2
7
关闭 站长推荐上一条 /3 下一条