IIC起始信号不就是在SCL为高的时外层,SDA由高变低的跳变吗。为什么SDA由高变低后还要将SCL置低

a006045 2010-07-20 08:40:45

void iic_start(void)
{
SDA=1;
SCL=1;
iic_delay();
SDA=0;
iic_delay();
SCL=0; //去掉这句代码为什么程序写进at24c1204的数据便是错误的呢。。
/*总线开始信号不就是在SCL为高的时外层,SDA由高变低的跳变吗。为什么SDA由高变低后还要将SCL置低
*结束信号无论有无将SCL置低读写的数据都是正确的
*/
}

void iic_stop(void)
{
SDA=0;
SCL=1;
iic_delay();
SDA=1;

}
...全文
980 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesea87 2010-07-23
  • 打赏
  • 举报
回复
楼上这句话很玄
lbing7 2010-07-22
  • 打赏
  • 举报
回复
//去掉这句代码为什么程序写进at24c1204的数据便是错误的呢。。

这个感觉是要给数据通信留出空间。。。

bluesea87 2010-07-21
  • 打赏
  • 举报
回复
时序图上面有T值的,这些T值,在说明文档里面都能查得到,仔细看看,若还是找不到的话,你就找iic的协议,按照最慢的那个时序要求写,那样就好了,只是通信相对慢点
a006045 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 linux_lee 的回复:]
引用 6 楼 a006045 的回复:

引用 5 楼 a006045 的回复:
引用 3 楼 jldream110 的回复:
io 模拟IIc 延时是按照硬件需要来的 。 scl必须置低 楼上这方面说的很好, 因为IIc通信时 只有scl为高时 sda的数据才有效 如果开始后 scl不置低 那么sda的没一次抖动 都是一个信号 可能也是结束信号

多谢。。这点搞明白了。

但AT……
[/Quote]
时序图上没说需要多长的延时时间啊。我怎么确定呢??
Linux_lee 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 a006045 的回复:]

引用 5 楼 a006045 的回复:
引用 3 楼 jldream110 的回复:
io 模拟IIc 延时是按照硬件需要来的 。 scl必须置低 楼上这方面说的很好, 因为IIc通信时 只有scl为高时 sda的数据才有效 如果开始后 scl不置低 那么sda的没一次抖动 都是一个信号 可能也是结束信号

多谢。。这点搞明白了。

但AT24C1024芯片资料上面也没说延时这方面的……
[/Quote]
延时由时序决定的,数字电路都存在建立时间和保持时间
a006045 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 a006045 的回复:]
引用 3 楼 jldream110 的回复:
io 模拟IIc 延时是按照硬件需要来的 。 scl必须置低 楼上这方面说的很好, 因为IIc通信时 只有scl为高时 sda的数据才有效 如果开始后 scl不置低 那么sda的没一次抖动 都是一个信号 可能也是结束信号

多谢。。这点搞明白了。
[/Quote]
但AT24C1024芯片资料上面也没说延时这方面的事。。怎么去把握延时的时间呢?
a006045 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jldream110 的回复:]
io 模拟IIc 延时是按照硬件需要来的 。 scl必须置低 楼上这方面说的很好, 因为IIc通信时 只有scl为高时 sda的数据才有效 如果开始后 scl不置低 那么sda的没一次抖动 都是一个信号 可能也是结束信号
[/Quote]
多谢。。这点搞明白了。
a006045 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluesea87 的回复:]
你把void iic_start(void)这个函数单独拎出来无法说明为什么,因为不知你send的函数如何实现,若不吧SCL置低,期间必须要保持SDA电平的稳定,不然就成了结束信号。所以你的send函数实现可能是先改变SDA然后置高SCL,那么连在一起,时序就错了。

延时是必要的,而且这个延时最好也根据你那通信器件的要求来写,就是SCL和SDA信号边缘之间的最小时间来确定,所以,i/o模拟时……
[/Quote]
我这次用的是AT24C1024这块芯片。芯片资料上面也没说延时这方面的事。。只不过在网上看到的程序都有延时。然后我去掉都不影响。。

“send函数实现可能是先改变SDA然后置高SCL,那么连在一起,时序就错了。

下面是往芯片写一个字节的函数
jldream110 2010-07-20
  • 打赏
  • 举报
回复
io 模拟IIc 延时是按照硬件需要来的 。 scl必须置低 楼上这方面说的很好, 因为IIc通信时 只有scl为高时 sda的数据才有效 如果开始后 scl不置低 那么sda的没一次抖动 都是一个信号 可能也是结束信号
bluesea87 2010-07-20
  • 打赏
  • 举报
回复
你把void iic_start(void)这个函数单独拎出来无法说明为什么,因为不知你send的函数如何实现,若不吧SCL置低,期间必须要保持SDA电平的稳定,不然就成了结束信号。所以你的send函数实现可能是先改变SDA然后置高SCL,那么连在一起,时序就错了。

延时是必要的,而且这个延时最好也根据你那通信器件的要求来写,就是SCL和SDA信号边缘之间的最小时间来确定,所以,i/o模拟时序,最好总整体时序上看问题
a006045 2010-07-20
  • 打赏
  • 举报
回复

/*另外,我把两条延时语句iic_delay();去掉后程序仍正常读写,请问这两条延时语句起什么作用。可以去掉吗*/

void iic_start(void)
{
SDA=1;
SCL=1;
iic_delay();

SDA=0;
iic_delay();
SCL=0; //去掉这句代码为什么程序写进at24c1204的数据便是错误的呢。。
/*总线开始信号不就是在SCL为高的时外层,SDA由高变低的跳变吗。为什么SDA由高变低后还要将SCL置低
*结束信号无论有无将SCL置低读写的数据都是正确的
*/
}

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧