知道解决
HOLTEK 主I2C的源程序代码
浏览169次2018-03-13 14:24

调用的代码
            case C_READ+C_I2C:
                return_buf[2] = comm_buf[4];    // 
                read(comm_buf[3],comm_buf[4],&return_buf[3]);
                break;
                
            case C_WRITE+C_I2C:
                return_buf[2] = 0;
                write(comm_buf[3],comm_buf[4],&comm_buf[5]);
                break;


 主I2C的代码

 #define Chip_ADDR 0x78

 unsigned char cread(uchar addr);
 void cwrite(uchar addr,uchar dat);
 void read(uchar addr, uchar num, uchar * buf);
 void write(uchar addr, uchar num,uchar * buf);
 void i2c_start(void);
 void i2c_stop(void);
 uchar WaitAck(void);
 void SendNotAck(void);
 void SendtAck(void);
 void delay_5us(void);
 void delay(unsigned char num);
 void i2c_writ2(unsigned char dat);
 uchar i2c_rea2(bit ack);


 
 void i2c_start()
 {
    SCL=1;delay_5us();
    SDA=1;delay_5us();
    SDA=0;delay_5us();delay_5us();
    SCL=0;delay_5us();
 }

 
 void i2c_stop()
 {
    SCL=0; 
    SDA=0;delay_5us();
    SCL=1;delay_5us();
    SDA=1;delay_5us();
 }

 
 uchar WaitAck(void)
 {
    uchar errtime=255;  //因故障接收方无ACK 超时值为255
    SDA=1 ;delay_5us();
    SCL=1 ;delay_5us();
    while(SDA)
    {
        if (--errtime == 0)
        {
            i2c_stop();
            return 0;
        }
    }
    SCL=0;
    return 1;
 }

 
 void SendNotAck(void)
 {
    SDA=1 ;
    delay_5us();
    SCL=1 ;
    delay_5us();
    SCL=0;
 }

 
 void SendtAck(void)
 {
    SDA=0 ;
    delay_5us();
    SCL=1 ;
    delay_5us();
    SCL=0;
 }

 
 void i2c_writ2(uchar dat)
 {
    uchar i;
    for(i=0;i<8;i++)
    {
 //        SDA=1;
        if((dat&0x80)==0x00) SDA=0;
        else SDA=1;
        SCL=1;delay_5us();SCL=0;
        dat<<=1;
    }
    SDA=1;
    SCL=1;delay_5us();
    SCL=0;delay_5us();
 }

 
 unsigned char cread(uchar addr)
 {
     unsigned char i;
     i2c_start();
     i2c_writ2(Chip_ADDR);        // Write
     i2c_writ2(addr);
     i2c_start();                // Start
     i2c_writ2(CHIP_ADDR+1);        // Read
     i = i2c_rea2(0);
     i2c_stop();
     delay(10);
     return(i);
 }

 
 void cwrite(uchar addr,uchar dat)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_writ2(dat);
     i2c_stop();
     delay(30);
 }

 
 void read(uchar addr, uchar num, uchar * buf)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_start();                // Start
     i2c_writ2(CHIP_ADDR+1);        // Read
     for( ; num>0 ; num--)        // 个数
     {
         *buf++ = i2c_rea2(1);    // 读
     }
     i2c_stop();
     delay(10);
 }

 
 void write(uchar addr, uchar num,uchar * buf)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     for( ; num>0 ; num--)        // 个数
     {
         i2c_writ2(*buf++);        // 写
     }
     i2c_stop();
     delay(30);
 }

 
 uchar i2c_rea2(bit ack)
 {
     uchar i,j;
     j=0x00;
     SDA=1;
     for(i=0;i<8;i++)
     {
         SCL=1;
         j=j<<1;
         if(SDA) j|=0x01;
         SCL=0;delay_5us();
     }
     if(ack) SDA=0;
     SCL=1;delay_5us();
     SCL=0;delay_5us();
     return j;
 }

 
 void delay_5us()
 {
     uchar i;
     //for(i=0;i<2;i++){}
     for(i=0;i<4;i++)
     {
     }
 }

右侧广告
关于我们 | 广告服务 | 会员服务 | 隐私申明 | 友情链接 | 联系我们 | 法律顾问 | 网站地图 | 百方网信用评价制度 (c)2008-2025 BYF All Rights Reserved
网络标识
可信网站识