打印

AT24C01学习心得

[复制链接]
2593|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yeyangqlg|  楼主 | 2009-8-4 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT24C01学习心得
    花了一晚上时间终于稍微搞清楚了IIC是怎么回事,照着书上的程序在电脑上敲了一便,然后又把一个个子程序分析一便,终于明白了IIC是怎么工作的了~
首先看下从24C01中读数据的协议:
1、在读数据之前需要初始化:
   SDA=1_nop_();_nop_();_nop_();_nop_();  //不论读/写操作,SDA在开始时总是为1
   SCL=0_nop_();_nop_();_nop_();_nop_();  //这个没搞明白
2、初始化后,要启动读写时序,即调用start()函数,其内容就是让SDASCL收到一个下降沿脉冲
      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位是         固定的控制码10103~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中写数据协议:
123部分和读取协议一样
4、直接调用移位程序发送存在24C01中某单元中的数据
      shift8(b);   //发送存在24C01b单元中的数据
      ack();      //应答
      stop();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //停止操作
虽然大概明白了,但还有很多地方有问题,
124C01128页,每页8个字节,那第2页的第3个单元其地址是否为10,第3页的第  5个单元地址是否为20??
2、在读取24C01中的数据时,分为立即地址读取,随机地址读取,顺序地址读取。而在随机地址读取中,24C01的地址计数器内容为最后操作字节的地址加1,也就是说,如果上次读/写的操作地址为N,则立即读的地址从地址N+1开始。如果N=E24C01E=12724C02E=255;),则计数器将翻转到0切继续输出数据。
    那我的问题就是24C01128页,每页8个字节,那上文中的N为操作地址,它应该是字节的地址,为什么最大是127呢???

相关帖子

沙发
bin362422| | 2009-8-4 21:42 | 只看该作者
学有所得,大家分享,好啊。谢谢了先

使用特权

评论回复
板凳
gaohq| | 2009-8-4 21:51 | 只看该作者
打击楼主
1、在读数据之前需要初始化:
   SDA=1;_nop_();_nop_();_nop_();_nop_();  //不论读/写操作,SDA在开始时总是为1
   SCL=0;_nop_();_nop_();_nop_();_nop_();  //这个没搞明白
——————————————————————————————————————————————
初始化中SDA=1不一定要的。SDA=1是为了把I/O口设为输入状态,当读外部数据时(2401接受MCU传来的数据)才用,当2401给MCU传数据时就不必了。

使用特权

评论回复
地板
qciqci| | 2009-8-5 09:00 | 只看该作者
127是因为页是从0~127页,共128页

使用特权

评论回复
5
ytfyiu| | 2010-4-8 17:24 | 只看该作者
1、24C01有128页,每页8个字节,那第2页的第3个单元其地址是否为10,第3页的第  5个单元地址是否为20??
  
谁回答一下啦

使用特权

评论回复
6
bobchen1122| | 2010-4-8 19:43 | 只看该作者
学习学习

使用特权

评论回复
7
qufo| | 2010-4-9 09:32 | 只看该作者
貌似 Datasheet 中有描述时序的。看懂这个差不多就能看懂上面的那些指令了。


谢谢楼主分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

11

帖子

0

粉丝