1、首先确认你的I2C的速率,软件模拟的话就与MCLK直接相关了,自然单片机的速率下降就会正常;如果是硬件I2C的话需要看时钟来源是不是MCLK并作修改。
2、看你的电路并没有进行上拉也就是SDA和SCL需要接4.7K或者10K的电阻至VCC即可。
3、如果你的I2C是等待延时的话建议修改delay参数或者使用返回ACK查询方式。
4、有问题随时hi我,可以给你传一份调试通过的代码!
楼下的说了等于白说啊。。。
首先说一下感想:I2C确实不容易啊!
楼主说的I2C传递数据是指的主机往从机上写数据对吧?
楼主应该知道:I2C在数据传送(发送、接收)时,只有在SCL为低电平期间,才允许SDA上的电平改变状态;SCL为高电平期间,SDA上的数据必须保持稳定。
那么看这个循环:
{
temp=temp<<1; //左移一位 移出的一位在CY中
SCL=0; //只有在scl=0时sda能变化值
delay(); ---------|
SDA=CY; |------>这3行程序,数SDA可以变化,主机SDA数据准备完成(类似于子弹上
delay(); --------- | 膛,随时可以发给从机)
SCL=1; SDA数据位保持稳定,数据发送给从机(子弹发射)
delay();
}
所以,scl先拉低在拉高。
手打不容易啊。。。。。。。ORZ
上升、下降时间过长可能会导致建立保持时间变小,从而影响数据传输的可靠性,最终导致误码