lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.forumotion.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    关于i2c的问题

    分享
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    关于i2c的问题

    帖子 由 拂若微风 于 2013-10-20, 12:14 am

    #include
    #include "i2c.h"
    #include "delay.h"
     
    sbit SDA = P1^2;
    sbit SCL = P1^1;
     
    void i2c_init()
    {
    SCL = 1;
    delayms(1);
    SDA = 1;
    delayms(1);
    }
     
    void i2c_start()          //开始信号
    {
    SDA = 1;
    delayms(1);
    SCL = 1;
    delayms(1);
    SDA = 0;
    delayms(1);
    }
     
    void i2c_stop()          //停止信号
    {
    SDA = 0;
    delayms(1);
    SCL = 1;
    delayms(1);
    SDA = 1;
    delayms(1);
    }
     
    void i2c_ack()       //应答
    {
    unsigned char i;
    SCL = 1;
    delayms(1);
    while((SDA == 1)&&(i<250))i++;     //设备应答表现为将SDA线拉低
    SCL = 0;
    delayms(1);
    }
     
    void i2c_noack()
    {
    SDA = 1;
    delayms(1);
    SCL = 1;
    delayms(1);
    SCL = 0;
    delayms(1);
     
    }
     
    void i2c_writebyte(unsigned char date)   //写一个字节
    {
    unsigned char i,temp;
    temp = date;
    for(i = 0;i < 8;i++)
    {
    temp = temp<<1;
    SCL = 0;
    delayms(1);
    if(SDA) temp++;
    delayms(1);
    SCL = 1;
    delayms(1);
    }
    SCL = 0;
    delayms(1);
    SDA = 1;
    delayms(1);
    }
     
    unsigned char i2c_readbyte()   //读一个字节
    {
    unsigned i,k;
    SCL = 0;
    delayms(1);
    SDA = 1;
    delayms(1);
    for(i = 0;i < 8;i++)
    {
    SCL = 1;
    delayms(1);
    k = (k<<1)|SDA;
    SCL = 0;
    delayms(1);
    }
      return k;
    }
     
    void i2c_write(unsigned char address,unsigned char date)               //写数据
    {
    i2c_start();
    i2c_writebyte(0xae);
    i2c_ack();
    i2c_writebyte(address);
    i2c_ack();
    i2c_writebyte(date);
    i2c_ack();
    i2c_stop();
    }
     
    unsigned char i2c_read(unsigned char address)               //读数据
    {
    unsigned char date;
    i2c_start();
    i2c_writebyte(0xae);
    i2c_ack();
    i2c_writebyte(address);
    i2c_ack();
    i2c_start();
    i2c_writebyte(0xaf);
    i2c_ack();
    date = i2c_readbyte();
    i2c_noack();
    i2c_stop();
    return date;
    }




    求大神指点这个“i2c.c”文件哪里错了
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-20, 12:15 am

    第一排是#include
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-20, 12:17 am

    “reg52.h”


    由拂若微风于2013-10-20, 12:18 am进行了最后一次编辑,总共编辑了1次
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-20, 12:17 am

    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-20, 9:30 am

    有几个函数似乎有问题~我之后贴个正确的上来~
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-20, 3:12 pm

    代码:
    #include "i2c.h"

    void delay()
    {
        uint i;
        for(i = 0;i < 10;i++)
        {
       
            _NOP(); 
       
        }
    }





    void Init_I2c()
    {
       SCL_OUT;
       SDA_OUT;
       SDA_H;    //把SDA拉高
       delay();
       SCL_H;    //时钟脚拉高
       delay();
     
    }


    void Start()
    {
         SDA_OUT;
       SDA_H;
       delay();
       SCL_H;
       delay();
       SDA_L;      //SDA拉低
       delay();
    }


    void Stop()
    {
         SDA_OUT;
       SDA_L;
       delay();
       SCL_H;
       delay();
       SDA_H;
       delay();
    }


    void Spond()
    {
       uint i=0;
            SDA_OUT;
            SDA_H;
       SDA_IN;
       SCL_H;
       delay();
       while((SDA)&&(i<1000))  i++;
       SCL_L;
       delay();
    }


    void Write_I2c(uint date)
    {
            uchar i,temp;
       SDA_OUT;
       for(i=0;i<8;i++)
       {
          temp = date & 0x80;
          SCL_L;
          delay();
          if(temp==0x80)
            SDA_H;
          else
            SDA_L;
          delay();
          SCL_H;
          delay();
          date = date<<1;
       }
       SCL_L;
       delay();
       SDA_H;
       delay();
     
    }

    uchar Read_I2c()
    {
        uchar i,Dat;
        for(i = 0;i < 8;i++)
        {
            Dat = Dat << 1;
            SDA_OUT;
            SCL_L;
            SDA_H;
            SDA_IN; //如果是51单片机,这里不要
           
            SCL_H;
            delay();
         
            if(SDA)
              Dat =  Dat | 0x01;
            SCL_L;
            delay();
        }

        return Dat;
    }



    void Write_Date(uchar Adr,uchar Date)
    {
       
        Start();
        Write_I2c(0xa0);
        Spond();
        Write_I2c(Adr);
        Spond();
        Write_I2c(Date);
        Spond();
        Stop(); 
    }


    uchar Read_Date(uchar Adr)
    {
        uchar Temp;
        Start();
        Write_I2c(0xa0);
        Spond();
        Write_I2c(Adr);
        Spond();
        Start();
        Write_I2c(0xa1);
        Spond();
        Temp = Read_I2c();
        Stop();
        return Temp;

    }
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-20, 10:50 pm

    嗯,我看看
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-22, 4:06 pm

    代码:

    现改为这样,但还是有问题(用的是51),求指点.
    #include <reg52.h>
    #include "i2c.h"
    #include "delay.h"

    sbit SDA = P1^2;
    sbit SCL = P1^1;

    void i2c_init()
    {
    SCL = 1;
    delayms(1);
    SDA = 1;
    delayms(1);
    }

    void i2c_start()          //开始信号
    {
    SDA = 1;
    delayms(1);
    SCL = 1;
    delayms(1);
    SDA = 0;
    delayms(1);
    }

    void i2c_stop()          //停止信号
    {
    SDA = 0;
    delayms(1);
    SCL = 1;
    delayms(1);
    SDA = 1;
    delayms(1);
    }

    void i2c_ack()       //应答
    {
    unsigned char i;
    SCL = 1;
    delayms(1);
    while((SDA == 1)&&(i<250))i++;     //设备应答表现为将SDA线拉低
    SCL = 0;
    delayms(1);
    }

    void i2c_noack()
    {
    SDA = 1;
    delayms(1);
    SCL = 1;
    delayms(1);
    SCL = 0;
    delayms(1);

    }

    void i2c_writebyte(unsigned char date)   //写一个字节
    {
    unsigned char i,temp;
    temp = date;
    for(i = 0;i < 8;i++)
    {
    temp = temp&0x80;
    SCL = 0;
    delayms(1);
    if(temp==0x80)
    SDA = 1;
    else
    SDA = 0;
    delayms(1);
    SCL = 1;
    delayms(1);
    temp = temp<<1;
    }
    SCL = 0;
    delayms(1);
    SDA = 1;
    delayms(1);
    }

    unsigned char i2c_readbyte()   //读一个字节
    {
    unsigned i,k;
    SCL = 0;
    delayms(1);
    SDA = 1;
    delayms(1);
    for(i = 0;i < 8;i++)
    {
    SCL = 1;
    delayms(1);
    k = k<<1;
    if(SDA)
    k = k|0x01;                        //传送时高位在前,低位在后

    SCL = 0;
    delayms(1);
    }
      return k;
    }

    void i2c_write(unsigned char address,unsigned char date)               //写数据
    {
    i2c_start();
    i2c_writebyte(0xae);
    i2c_ack();
    i2c_writebyte(address);
    i2c_ack();
    i2c_writebyte(date);
    i2c_ack();
    i2c_stop();
    }

    unsigned char i2c_read(unsigned char address)               //读数据
    {
    unsigned char date;
    i2c_start();
    i2c_writebyte(0xae);
    i2c_ack();
    i2c_writebyte(address);
    i2c_ack();
    i2c_start();
    i2c_writebyte(0xaf);
    i2c_ack();
    date = i2c_readbyte();
    i2c_noack();
    i2c_stop();
    return date;
    }





























































    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-22, 5:56 pm

    代码:
    //这是一份操作AT24C02的程序,用到IIC
    void delay()
    { ; ; }

    void delayms(uint xms)
    {
       uint i,j;
       for(i=0;i<xms;i++)
         for(j=0;j<110;j++);
    }

    void initat()
    {
       SCL=1;
       delay();
       SDA=1;
       delay();
    }

    void start()
    {
       SDA=1;
        delay();
       SCL=1;
        delay();
       SDA=0;
        delay();
    }

    void stop()
    {
       SDA=0;
       delay();
       SCL=1;
        delay();
       SDA=1;
        delay();
    }

    void spon()
    {
        uint i;
       SCL=1;
        delay();
        while((SDA==1)&&(i<200))  i++;
       delay();
       SCL=0;
       delay();
    }

    void uspon()
    {
        SDA=1;
        delay();
       SCL=1;
        delay();
       SCL=0;
        delay();
    }

    void iicw(uchar dat)
    {
       uchar i;
       SCL=0;
        delay();
       for(i=0;i<8;i++)
       {
           if(dat&0x80)
           SDA=1;
           else
           SDA=0;
           dat=dat<<1;
           delay();
           SCL=1;
           delay();
          SCL=0;
            delay();
       }
       SDA=1;
        delay();
    }

    uchar iicr()
    {
       uchar i,temp;
       SCL=0;
        delay();
       SDA=1;
        delay();
       for(i=0;i<8;i++)
       {
          SCL=1;
           delay();
          temp=temp<<1;
           if(SDA)
           temp=temp|0x01;
           SCL=0;
           delay();
       }
       return temp;
    }

    void iicc(uchar add,uchar dat)
    {
        initat();
       start();
       iicw(0xa0);
       spon();
       iicw(add);
       spon();
       iicw(dat);
       spon();
       stop();
       delayms(5);
    }

    uchar iicq(uchar add)
    {
     uchar tmp;
        initat();
       start();
       iicw(0xa0);
       spon();
       iicw(add);
       spon();
       start();
       iicw(0xa1);
       spon();
       tmp=iicr();
       uspon();
       stop();
       delayms(5);
       return tmp;
    }
    还有就是你能说说你的具体问题吗,还有就是你的IIC是用在什么地方,可以把原理图贴出来看看
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-22, 6:53 pm

    http://pan.baidu.com/s/1ordo3
    这是我的程序,用的是mini80s 51单片机,结果只显示0000
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-22, 7:01 pm

    你做的这个东西我做过,我直接把源码共享给你,你看看吧。。。如果是操作AT24C02,那么一定要注意芯片的地址。这个的地址是根据硬件来的。http://pan.baidu.com/s/15RWY9
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-22, 10:26 pm

    我注意了,A0A1A2都是接vcc,而且我还比对了好几遍,没有发现错误,编译也是0 error,0 warning.
    实在是找不出来了,可不可以帮我看看...
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-23, 12:22 am

    拂若微风 写道::我注意了,A0A1A2都是接vcc,而且我还比对了好几遍,没有发现错误,编译也是0 error,0 warning.
    实在是找不出来了,可不可以帮我看看...
    用我的代码试试,,我明天给你好好看看
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-24, 3:21 pm

    看出错误了吗?
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-25, 1:48 am

    你那个写字节的函数应该有问题吧,你再好好看看,你那样写的是错的。按照我的程序你修改吧
    avatar
    拂若微风
    初级会员
    初级会员

    帖子数 : 26
    威望 : 0
    注册日期 : 13-01-19

    回复: 关于i2c的问题

    帖子 由 拂若微风 于 2013-10-25, 7:55 pm

    嗯,改过来了,是写字节函数的问题.谢了...
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    回复: 关于i2c的问题

    帖子 由 Admin 于 2013-10-25, 10:58 pm

    拂若微风 写道::嗯,改过来了,是写字节函数的问题.谢了...
    恩,多交流

      目前的日期/时间是2018-11-20, 1:48 am