《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > HOLTEK 主I2C的源程序代碼

HOLTEK 主I2C的源程序代碼

2009-01-14
關鍵詞: Holtek 源代碼

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();
 }

 /***********************************************
     讀當前1字節數據函數
 ***********************************************/
 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);
 }

 /***********************************************
     寫當前1字節數據函數
 ***********************************************/
 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);
 }

 /***********************************************
     讀1字節函數
 ***********************************************/
 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++)
     {
     }
 }

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 欧美在线视频一区在线观看 | 三级黄色毛片视频 | 欧美一级h| 97影院理伦在线观看 | 国产丝袜在线播放 | 国产成 人 综合 亚洲网 | 日日躁夜夜躁狠狠天天 | 66j8影院xxxx深夜| 欧美精品成人 | 亚洲视频你懂的 | 国产麻豆视频 | 久久久午夜视频 | 亚洲三级视频在线 | 黄黄的网站 | 日日干干 | 国产精品免费视频一区一 | 久久亚洲国产成人影院 | 日本香蕉一区二区三区 | 成人影视频 | 国产成人综合久久综合 | 免费黄网在线 | 欧美14一15sex性h| 美女综合网 | 亚洲一区色 | 免看一级a毛片一片成人不卡 | 九九九九精品视频在线播放 | 国产一卡2卡3卡四卡精品网站 | 五月天综合激情网 | 欧美日在线观看 | 美国十次狠狠色综合 | 五月激情婷婷网 | 午夜免费福利 | 国产成人亚洲毛片 | 天堂网在线看 | 黄色一级黄色 | 亚洲日韩中文字幕 | 又黄又爽的成人免费视频播放 | 中文字幕一区二区在线观看 | 成人啪精品视频免费网站 | 免费人成在线看 | 欧洲一级视频 |