微控梦想

搜索:
您的位置: 首页 > 单片机 > » 正文

HOLTEK主I2C的源程序代码

时间:   来源:嵌入网   作者:佚名   阅读:

HOLTEK 主I2C的源程序代码

调用的代码
             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();
 }

 /***********************************************
     I2C总线发送数据时的ACK应答
 ***********************************************/
 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;
 }

 /***********************************************
     I2C总线接收数据时的NO ACK应答
 ***********************************************/
 void SendNotAck(void)
 {
     SDA=1 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
 }

 /***********************************************
     I2C总线接收数据时的ACK应答
 ***********************************************/
 void SendtAck(void)
 {
     SDA=0 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
 }

 /***********************************************
     写1个字节的函数
 ***********************************************/
 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();
 }
------------ ---------- ----------- ---------- --------- -------- ------- ------ ----- ---- --- -- -  -  -