AT24C01学习心得
花了一晚上时间终于稍微搞清楚了IIC是怎么回事,照着书上的程序在电脑上敲了一便,然后又把一个个子程序分析一便,终于明白了IIC是怎么工作的了~
首先看下从24C01中读数据的协议:
1、在读数据之前需要初始化:
SDA=1;_nop_();_nop_();_nop_();_nop_(); //不论读/写操作,SDA在开始时总是为1
SCL=0;_nop_();_nop_();_nop_();_nop_(); //这个没搞明白
2、初始化后,要启动读写时序,即调用start()函数,其内容就是让SDA和SCL收到一个下降沿脉冲
SDA=1;_nop_(); _nop_(); _nop_(); _nop_();
SCL=1;_nop_(); _nop_(); _nop_(); _nop_();
SDA=0;nop_(); _nop_(); _nop_(); _nop_();
SCL=0;nop_(); _nop_(); _nop_(); _nop_();
3、之后需要给24C01发送起始命令和器件中数据的地址信息
command=160; //芯片寻址10100000,最后一位0表示对芯片写操作,7~4位是 固定的控制码1010,3~1位芯片的片选信号端。要写入的信息是芯片的控制信息及数据单元的地址
shift8(command); //把这个控制信息发送给芯片,串行移位实现,左移,
ack(); //应答信号,其内容是SCL线产生一个下降脉冲
shift8(a); //a中存储AT24C01中某单元的地址
ack(); //应答信号
start(); //再次启动读写时序,即调用start()函数
command=161; //芯片寻址10100001,告诉芯片要读数据了
shift(command);
ack();
4、最后就可以读取芯片中的数据了
SDA=1;_nop_(); _nop_(); _nop_(); _nop_(); //读取开始要置SDA线为1
for (i=0;i<8;i++)
{
com_data=com_data*2; //com_data左移一位,将读到的数据移进com_data
SCL=1;_nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_();
low_bit=SDA; //数据位读到com_data的低字节
SCL=0;nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_();
}
stop(); //读取完要结束操作,
调用STOP函数 SDA=0; _nop_(); _nop_(); _nop_(); _nop_();
SCL=1;_nop_(); _nop_(); _nop_(); _nop_();
SDA=1;_nop_(); _nop_(); _nop_(); _nop_();
其次在看向24C01中写数据协议:
1、2、3部分和读取协议一样
4、直接调用移位程序发送存在24C01中某单元中的数据
shift8(b); //发送存在24C01的b单元中的数据
ack(); //应答
stop();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //停止操作
虽然大概明白了,但还有很多地方有问题,
1、24C01有128页,每页8个字节,那第2页的第3个单元其地址是否为10,第3页的第 5个单元地址是否为20??
2、在读取24C01中的数据时,分为立即地址读取,随机地址读取,顺序地址读取。而在随机地址读取中,24C01的地址计数器内容为最后操作字节的地址加1,也就是说,如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。如果N=E(24C01,E=127;24C02,E=255;),则计数器将翻转到0切继续输出数据。
那我的问题就是24C01为128页,每页8个字节,那上文中的N为操作地址,它应该是字节的地址,为什么最大是127呢??? |