打印

IIC协议细节深究。。。

[复制链接]
3338|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-4-19 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XIANSir 于 2011-4-19 16:11 编辑

void iic_start(void)
{
scl = 0;
DELAY();
sda = 1;
DELAY();

scl = 1;
DELAY();
sda = 0;//sclk为高时sdat的下降沿表示“起始”
DELAY();   
}
这是我写的软件IIC的起始条件产生函数,很简单,知道IIC的应该很容易就看懂。

我的疑惑来自于:使用Proteus中IIC协议分析仪检验软件IIC实现时,分析仪显示前面两句:scl = 0;DELAY();sda = 1;DELAY();在IIC总线上产生了噪音“Noise”。。

起初不理解,后来想想确实这样,这两句确实产生了噪音。。

我当初之所以有scl = 0;DELAY();sda = 1;DELAY();这两句,是觉得:既然要在SCL为高时在SDA上产生下降沿,那首先得让SDA为高才行啊,而且还得是在SCL为低的时候把SDA置为高,若不然,有可能产生停止条件。。

后来想明白了:IIC初始化完成后SDA和SCL都自动为高了,所以产生Start条件不需要scl = 0;DELAY();sda = 1;DELAY();这两句。

可是:在产生Repeated Start条件时,之前的SDA状态是无法保证的,所以对于产生Repeated Start条件scl = 0;DELAY();sda = 1;DELAY();这两句应该是必须的。

也就是说产生Start条件和产生Repeated Start条件的代码并不完全相同:
产生Start条件:
void iic_start(void)
{
scl = 1;
DELAY();
sda = 0;//sclk为高时sdat的下降沿表示“起始”
DELAY();   
}


产生Repeated Start条件:
void iic_restart(void)
{
scl = 0;
DELAY();
sda = 1;
DELAY();

scl = 1;
DELAY();
sda = 0;//sclk为高时sdat的下降沿表示“起始”
DELAY();   
}


不知道我这种理解对不对???

另外请教:如果产生Start条件也使用产生Repeated Start条件相同的代码,虽然会产生“Noise”,但是我想问,这个Noise对协议有实质的影响吗???

相关帖子

沙发
ayb_ice| | 2011-4-19 16:26 | 只看该作者
本帖最后由 ayb_ice 于 2011-4-19 16:32 编辑

一般在初始化时产生停止信号,正常操作后SDA,SCL都是高电平,操作出错时调用初始化生停止信号,这样是比较规范的,注意初始化产生停止信号必须确保无论之前SDA,SCL的电平怎样都能正确产生停止信号

使用特权

评论回复
板凳
XIANSir|  楼主 | 2011-4-19 16:45 | 只看该作者
2# ayb_ice
初始化函数产生停止信号,这个很有用,以后也这么做。。

多谢前辈指点。。

使用特权

评论回复
地板
ayb_ice| | 2011-4-19 17:23 | 只看该作者
2# ayb_ice
初始化函数产生停止信号,这个很有用,以后也这么做。。

多谢前辈指点。。
XIANSir 发表于 2011-4-19 16:45

这招是和ZLG的陈明计学的,感觉不错

使用特权

评论回复
5
XIANSir|  楼主 | 2011-4-20 12:01 | 只看该作者
反正已经能用了,就不再继续深究了!!

使用特权

评论回复
6
ghost_like_li| | 2013-8-6 15:19 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝