单片机I/O端口模拟I2C时序为什么要延时,单片机端口不是会自动保持电平不变吗?

I2C开始时序:
void start()
{
SDA=1;
NOP();
SCL=1;
NOP();
NOP();
NOP();
SDA=0;
}
为什么要用到NOP();呢??它的作用是什么呢?是延迟一会才执行下一条语句,还是保持上一条语句一会儿??

延时是保证拉高拉低时间大于设备接口时序要求的时间,因为时序要求高低保持时间是有要求的,如果你执行太快,设备还没检测到,就过去了,那就错了。追问

它的作用是什么呢:
(1)延迟一会才执行下一条语句。
(2)保持上一条语句一会儿。
作用是哪一条呢?(1)还是(2)?

追答

作用主要是(2),使上一条指令保持时间够了,再执行下一条语句
加不加延时和你的I2C设备的反应速度有关系,一般都是要加的,普通i2c设备的start时间为几个uS,保持时间也是几个us,主要要保持i2c总线是时序时间是合理的,比如pcf8583这个芯片他开始时序的SDA=1升起时间是4.7uS,SDA=1保持时间是4uS,然后才能使SCL=1,然后将SDA=0,这时设备接收到这过程就认为开始。

温馨提示:答案为网友推荐,仅供参考