本帖最后由 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对协议有实质的影响吗??? |