機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
HOLTEK 主I2C的代碼
HOLTEK 主I2C的代碼
 更新時(shí)間:2008-7-26 20:05:02  點(diǎn)擊數(shù):2
【字體: 字體顏色
調(diào)用的代碼
             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);

/***********************************************
     總線啟動(dòng)函數(shù)
***********************************************/
void i2c_start()
{
     SCL=1;delay_5us();
     SDA=1;delay_5us();
     SDA=0;delay_5us();delay_5us();
     SCL=0;delay_5us();
}
/***********************************************
     總線停止函數(shù)
***********************************************/
void i2c_stop()
{
     SCL=0;
     SDA=0;delay_5us();
     SCL=1;delay_5us();
     SDA=1;delay_5us();
}
/***********************************************
     I2C總線發(fā)送數(shù)據(jù)時(shí)的ACK應(yīng)答
***********************************************/
uchar WaitAck(void)
{
     uchar errtime=255;  //因故障接收方無ACK 超時(shí)值為255
     SDA=1 ;delay_5us();
     SCL=1 ;delay_5us();
     while(SDA)
     {
         if (--errtime == 0)
         {
             i2c_stop();
             return 0;
         }
     }
     SCL=0;
     return 1;
}
/***********************************************
     I2C總線接收數(shù)據(jù)時(shí)的NO ACK應(yīng)答
***********************************************/
void SendNotAck(void)
{
     SDA=1 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
}
/***********************************************
     I2C總線接收數(shù)據(jù)時(shí)的ACK應(yīng)答
***********************************************/
void SendtAck(void)
{
     SDA=0 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
}
/***********************************************
     寫1個(gè)字節(jié)的函數(shù)
***********************************************/
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();
}
/***********************************************
     讀當(dāng)前1字節(jié)數(shù)據(jù)函數(shù)
***********************************************/
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);
}
/***********************************************
     寫當(dāng)前1字節(jié)數(shù)據(jù)函數(shù)
***********************************************/
void cwrite(uchar addr,uchar dat)
{
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_writ2(dat);
     i2c_stop();
     delay(30);
}
/***********************************************
     讀數(shù)據(jù)
***********************************************/
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--)        // 個(gè)數(shù)
     {
         *buf++ = i2c_rea2(1);    // 讀
     }
     i2c_stop();
     delay(10);
}
/***********************************************
     寫數(shù)據(jù)
***********************************************/
void write(uchar addr, uchar num,uchar * buf)
{
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     for( ; num>0 ; num--)        // 個(gè)數(shù)
     {
         i2c_writ2(*buf++);        // 寫
     }
     i2c_stop();
     delay(30);
}
/***********************************************
     讀1字節(jié)函數(shù)
***********************************************/
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;
}
/***********************************************
     延時(shí)程序
***********************************************/
void delay_5us()
{
     uchar i;
     //for(i=0;i<2;i++){}
     for(i=0;i<4;i++)
     {
     }
}
  • 上一篇: 基于HT48R50A的 RS232串口示例程序
  • 下一篇: HT46R22單片機(jī)在電磁爐功率控制中的應(yīng)用
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1