*1关于读写操作*
在读操作时候,先执行一个伪写操作,然后再执行读操作。I2C要求的。
2关于时间的问题
一个晶振周期是晶振频率的倒数。
对于51单片机,一个机器周期是12个晶振周期。
一个nop()是一个机器周期。(具体nop()的时间见汇编)
对于时钟频率为11.0592Mhz的单片机,一个nop()是1us。
对于I2C驱动EEPROM的时序要严格按照下图:
我们一般把delay()时间设置为5us。即5个nop()。
对于I2C驱动其他外设,比如oled,它要求的保持周期只是0.6us。具体的要看器件的要求。
对于stm32
cortexm3的指令有单周期的,也有多周期的,3级流水线相当于同时处理3条指令,这同时被处理的3条指令处于指令执行周期的不同时段。所以平均下来,会达到1.25mips/Mhz的效果,也就是每个时钟周期能够执行超过一条指令。但具体到程序,并不是总能达到这个效果。
static void i2c_Delay(void)
{
uint8_t i;
/*
下面的时间是通过逻辑分析仪测试得到的。
工作条件:CPU主频72MHz ,MDK编译环境,1级优化
循环次数为10时,SCL频率 = 205KHz
循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
上面的意思是SCL的频率是变化的。因为I2C要求,delay()延时超过4us。即scl频率低于250Khz。
上面的处理大抵是符合的。
*/
for (i = 0; i < 10; i++);
}
除了上述要求的延时之外,写和读之间也必须有延时,不可以写之后立刻读。需要延时相当长一段时间。
读操作没有时间要求,写操作一次最多8字节,需要得到10ms以上来固化数据。