打印
[51单片机]

I2C总线通信 EEPROM实验中遇到的疑问,请大神解答

[复制链接]
1002|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangwentao2|  楼主 | 2016-1-21 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在郭天祥的那本书中关于I2C总线  EEPROM的试验中,先往AT24C02芯片中写了一个数据write_byte(0xFE)(为了精简我只把主函数拿上来);
void main()
{
        init();
        start();
        write_byte(0xa0);
        respons();
        write_byte(2);
        respons();
        write_byte(0xFE);
        respons();
        stop();        //这里的停止和下一个启动之间要有一个时间间隔
        delay_0(10);
        start();
        write_byte(0xa0);
        respons();
        write_byte(2);
        respons();
        start();
        write_byte(0xa1);
        respons();
        a=read_byte();
        no_respons();
        stop();
        P1=a;
        delay_0(1);
}
那么问题1:先给从器件AT24C02写一个地址write_byte(2)(如上所示);之后再写数据write_byte(0xFE);那么在用keil调试的时候 如何通过从器件AT24C02的RAM来查看这个数据0xFE是否被准确写入地址为2的存储单元中?

还有问题2:在读取地址为2的存储单元中的数据0XFE时,这8位数据是如何被一位一位地读走的?
以下是读数据函数:
uchar readbyte()
{
      uchar i,k;
      scl=0;
     delay();
     sda=1;
     for(i=0;i<8;i++)
{
     scl=1;
    delay();
    k=(k<<1)|sda;
    scl=0;
    delay();
}
   delay();
   return k;
}
        
特别不能理解k=(k<<1)|sda这一行,sda在这里不过是一根数据线,也不是存储单元,那么在这8次的循环中,又如何能够确定每次scl时钟脉冲产生的时候sda的值呢?如何能确定sda在8次所传出的值是0xFE呢?

以上两个问题 特别是第二个问题已经困扰我很久了,特别希望有大神能帮忙指点迷津! 小弟在此先谢过了

相关帖子

沙发
zxqchongchi| | 2016-2-4 11:03 | 只看该作者
闲来无事,先回答你第一个问题。
一,write_byte(0xa0);这句是指定I2C从设备地址为0xA0,write_byte(2)是指定AT24C02第二个字节,write_byte(0xFE);是往指定的第二个字节中写0xFE。keil调试只能看到单片机内部RAM,AT24C02存储的值是无法在keil中看到的。因此才有后面的读出来加以验证。

二,sda,如果没猜错的话应该有个类似的如下定义:
#define SDAT  P00
这句的意思就是用sda代表P00,那么P00又是什么意思呢。P00代表的就是51单片机第0组第0个引脚的状态寄存器。
51单片机不同于ARM,不需要设置IO口的方向。一般你向P00中写1,P00就呈现高电平,你从P00读到1就证明P00引脚是高电平。

你跑得太快了,连单片机最基本的原理都没搞清楚,就学习单片机IO口模拟I2C协议。

使用特权

评论回复
板凳
解博| | 2016-2-4 23:21 | 只看该作者
哈哈,楼上正解

使用特权

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

本版积分规则

14

主题

29

帖子

1

粉丝