||
昨晚写好了 i2c的接口函数,包括 字节写、页写、随机地址读、顺序读。早上加了pcf8593做了 这四个函数的测试,完全ok。里面的i2c.c文件是主题
i2c时序理解:
/*------------------------------------------------------------------
*i2c 读写时序要求:
sda线上的数据必须在scl的高电平期间保持稳定,sda的电平状态只有在scl的
低电平期间才能改变 标准模式(100Kbps),高低电平宽度必须不小于4.7us
*起始和停止条件
在i2c总线中,唯一违反上述数据有效性的是起始(s) 和停止(p)条件
起始条件(重复起始条件):在scl线时高电平时,sda线从高电平向低电平切换
停止条件:在scl线时高电平时,sda线从低电平向高电平切换
*读写
写:数据先放到sda线上,然后scl保持高一段时间,scl拉低,释放总线
读:scl保持高一段时间,从sda上读数据,然后scl拉低,释放总线
*读写前先检测应答信号:
一旦主器件发送停止位指示主器件操作结束时,从器件开始内部写周期时,这时
从器件不会理会总线上的数据输入,(这时向从器件写/读 都不会成功)
我们可以利用应答查询来检测 从器件是否已完成内部写周期:发送一个起始位
和进行写(写时)/读(读时)操作的从器件地址,如果从器件正在进行内部写
操作, 则不会发送应答信号,如果从器件已完成内部写操作,则将发送一个应
答信号,主器件可以进行 下一次 读写操作。
*在写从器件时,从器件每次收到数据后并不是立即开始进行内部擦写(数据先
存放在其内部缓冲区),而是在收到 stop条件后知道主器件停止了写操作后
才开始内部数据的擦写。(从缓冲区写入eeprom )
在读从器件时,主器件每次收到数据后都向从器件发送应答表明本字节已经收到
从器件将继续发送数据,当主器件不再发送应答时,从器件经停止数据发送,并
等待stop条件。
*关于页翻转
在对at24cxx等进行 页写 和 顺序读 时,每次读写都不能超过 其页边界,否则页
翻转 写的数据会覆盖掉当前页先前的数据,读的数据会是当前页先前的数据
这是由于其内部地址自加时 只加了低位地址 ,高位地址保持不变
------------------------------------------------------------------*/
源代码 和电路图:i2c_pcf8593.rar