驱动程序照着时序图写或上网找,这里不说了
24c02是按照i2c通信的,
在此谈一下鄙人关于i2c的认识:
首先需一个起始信号表示操作开始:先将sda和scl均置高(释放总线)再将sda置0,即在scl为高时sda低跳变,就是开始信号 顺便把scl拉低。
开始写一字节:在scl为低时把sda赋好数据,scl上升沿后写过去,再将scl置低,sda装载数据,如此重复,写完8位后,释放总线,等待应答 ,最后把scl置0
等待ack:等待从件把sda拉低 表示接受成功
读一个字节:先将sda置高(个人理解:若读字节时是下降沿后读到信号,该信号靠从件发出,若主机sda拉低,从件是无力拉高的,因此主机先将sda拉高)此后与写类似,只不过有可能下降沿后读,结束后把scl置0
读后也需要释放总线
结束信号:先将scl,sda均置低(释放总线,若上述均保证结束时scl为0,则不需置scl)再将scl置高,此时sda上升跳变,就是结束信号
具体实现:
向某个地址写一个数据:
void At24c02Write(uchar addr,uchar dat) { I2C_Start();//起始信号 · I2C_SendByte(0xa0,1);//器件寻址,1表等待响应,0则略过,另外:器件地址高四位固定为1010,低四位中最低位为写入与读取的选择,
//其余三位为器件选择,这里全部接地所以为0 I2C_SendByte(addr,1);//写入数据的目标地址 I2C_SendByte(dat,1);//要写的数据 I2C_Stop(); //停止信号 ,此后器件进入擦写工作,期间不接受主机的信号 }
向某个地址读一个数据:
<pre name="code" class="cpp">uchar At24c02Read(uchar addr) { uchar dat=0; I2C_Start();//起始信号 I2C_SendByte(0xa0,1); I2C_SendByte(addr,1);//假写入 ,地址即为要读的地址,具体看所含芯片文档 I2C_Start();//起始信号 I2C_SendByte(0xa1,1); //最低位变1,设为读取模式 dat=I2C_ReadByte(); //接受数据 I2C_Stop();//停止信号 return dat; }
接着上次读或写的地址读数据:
uchar At24c02Read_next() { uchar dat=0; I2C_Start(); I2C_SendByte(0xa1,1);//直接读命令,接着上一次读写的地址读数据 dat=I2C_ReadByte(); I2C_Stop(); return dat; }
注意:写入操作后一段时间不能对24c02进行任何操作(正在擦写) 需延时10ms左右
代码:点击打开链接
时间: 2024-10-15 01:18:51