EEPROM IIC
来源:互联网 发布:香港御可贡茶加盟 知乎 编辑:程序博客网 时间:2024/05/16 19:48
1. 数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化
2. 起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态
接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行
3. 数据传送格式
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)
主机向从机发送数据:
有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送
A表示应答, Â非表示非应答。S表示起始信号,P表示终止信号
主机在第一个字节后,立即从从机读数据:
改变传送方向:
在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次
4. 总线的寻址
D7~D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器
一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中
5. 信号模拟
起始信号:
void I2CStart(void){ SDA = 1; SomeNop(); SCL = 1; SomeNop(); SDA = 0; SomeNop();}
终止信号:
void I2CStart(void){ SDA = 0; SomeNop(); SCL = 1; SomeNop(); SDA = 1; SomeNop();}
6. 串行E2PROM 写入过程:
读出过程:
7. 引脚说明
A0、A1、A2均为0
所以从机地址的7位数据为:0xa0
8. 总线时序
9. 举例 单片机小精灵:
http://download.csdn.net/download/zhangxuechao_/9894028
void delay10us(void) //误差 0us{ unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--);} //IIC起始void i2cStart(){ SDA = 1; delay10us(); SCL = 1; delay10us(); SDA = 0; delay10us(); SCL = 0; delay10us(); return;} //IIC停止void i2cStop(){ SDA = 0; delay10us(); SCL = 1; delay10us(); SDA = 1; delay10us(); return;}//IIC发送u8 i2cSend(u8 d){ u8 i = 0, j = 0; for(i = 0; i < 8; i++) { SDA = d >> 7; d = d << 1; delay10us(); SCL = 1; delay10us(); SCL = 0; } SDA = 1; delay10us(); SCL = 1; while(SDA) { if(j++ > 200) { SCL = 0; delay10us(); return 0; } } SCL = 0; delay10us(); return 1;} //IIC接收u8 i2cRecv(){ u8 i = 0, d = 0; for(i = 0; i < 8; i++) { SCL = 1; delay10us(); d <<= 1; d |= SDA; delay10us(); SCL = 0; delay10us(); } return d;}//E2PROM写void at24c02Write(u8 addr, u8 d){ i2cStart(); i2cSend(0xa0); i2cSend(addr); i2cSend(d); i2cStop(); }//E2PROM读u8 at24c02Read(u8 addr){ u8 d = 0; i2cStart(); i2cSend(0xa0); i2cSend(addr); i2cStart(); i2cSend(0xa1); d = i2cRecv(); i2cStop(); return d; }
- IIC&EEPROM
- EEPROM IIC
- S3C2410 IIC EEPROM 总结
- s3c2440 iic eeprom
- IIC&EEPROM总结
- STM32 IIC EEPROM
- 外部EEPROM,IIC总线和EEPROM通信技术
- mini2440 IIC实验(读写EEPROM)
- 关于EEprom的iic接口实现流程
- linux中使用IIC读写EEPROM
- IIC 针对EEPROM的驱动代码
- 51单片机之IIC&EEPROM的驱动程序
- EEPROM通过IIC协议进行读写操作
- At24C0X IIC-EEPROM的keil C操作程序.
- mini2440----keil for AMR之IIC读写EEPROM(AT24C08)
- mini2440----keil for AMR之IIC读写EEPROM(AT24C08)
- 单片机模拟 IIC 总线与 EEPROM(AT24C02)通信
- mini2440裸机试炼之——IIC控制EEPROM数据传输
- 如何在C++中使用VBScript(使用Qt)--How to use VBScript in C++ (Using Qt)
- HDU1166 敌兵布阵
- 素数环
- 一文弄懂神经网络中的反向传播法——BackPropagation
- python学习笔记(2)
- EEPROM IIC
- 遍历集合时移除一个元素
- TCP三次握手和四次挥手
- OpenGL ES中的坐标变换
- 腾讯社交广告大赛 —— 特征与模型介绍
- TensorFlow 卷积层
- canvas实现图片旋转缩放
- [BZOJ 3629][ JLOI2014 ]聪明的燕姿
- 关于HttpClient的应用