天狼的学习与思考 https://bbs.21ic.com/?540120 [收藏] [复制] [RSS] 记录我学习过程中的点点滴滴

日志

io口模拟 i2c 总线------实时时钟芯片pcf8593

已有 1252 次阅读2010-4-25 13:40 |系统分类:单片机| i2c, pcf8593

昨晚写好了 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


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)