音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

這里有一個(gè)利用7位地址格式讀寫方法寫的i2c程序

作者:雷風(fēng) 欄目:單片機(jī)
這里有一個(gè)利用7位地址格式讀寫方法寫的i2c程序
這里有一個(gè)比較另類的i2c程序,注意看接受和發(fā)送函數(shù)

應(yīng)該說用在一些情況下是有道理的
如果哪位看出錯(cuò)誤請不吝指教
注意看接受和發(fā)送函數(shù)主函數(shù)(最下面),利用了協(xié)議中7位地址格式的用法,也就是說能夠兼容總線上尋址位數(shù)大于8位的設(shè)備(例如16位)

順便請教一個(gè)問題,就是傳統(tǒng)的i2c總線讀寫方法,如果遇到一個(gè)地址為16位的設(shè)備和一個(gè)8位的設(shè)備,是否接受函數(shù)和發(fā)送函數(shù)必須分別寫成不同的兩個(gè)程序?
因?yàn)榍耙环N設(shè)備需要送兩次地址,后一種設(shè)備只需要送一次地址


/**********************************************************
I2C主機(jī)總線驅(qū)動程序。不含仲裁程序,只允許總線上有從設(shè)備。
速率5Kbit/s。
全部子程序以SCL=0,SDA=1結(jié)束。
**********************************************************/


#include<nsys.h>
#define SCL P1_3
#define SDA P1_4


#define SPD 10  //速率設(shè)置。 10=5kbit/s


/********************************************
I2C總線初始化
********************************************/
void initI2C()   
    {
     SCL=0;
     SDA=1;
    }

/********************************************
主機(jī)開始標(biāo)志位生成子程序
********************************************/         
void I2C_START()
    {
     SDA=1;
     SCL=1;
     delay(SPD/2);
     SDA=0;
     delay(SPD/2);
     SCL=0;
     delay(SPD/2);                                   子程序
     SDA=1;
     delay(SPD/2);
       
    }

/********************************************
主機(jī)停止標(biāo)志位生成子程序
********************************************/           
void I2C_STOP()
    {
     SDA=0;
     SCL=1;
     delay(SPD/2);
     SDA=1;
     delay(SPD/2);
     SCL=0;
     delay(SPD);
    }

/*******************************************
主機(jī)應(yīng)答位生成子程序
bit ack:1-應(yīng)答 0-不應(yīng)答
*******************************************/           
void I2C_ACK(bit ack)//ack: 1-ack 0-do not ack
{
SCL=0;
SDA=~ack;
delay(SPD/2);
SCL=1;
delay(SPD);
SCL=0;
delay(SPD/2);
SDA=1;
delay(SPD/2);
}

/*******************************************
主機(jī)傳輸數(shù)據(jù)位生成子程序
unsigned CHAR tx:待傳輸?shù)淖止?jié)
*******************************************/          
void I2C_TXDATA(unsigned CHAR tx)
    {
     unsigned CHAR i;
     unsigned CHAR tmp=0x80;    
     for (i=0;i<8;i++)
     {
       SCL=0;
       delay(SPD/2);
       if (tx&tmp)     //該位為1送SDA=1
          SDA=1;
       else            //該位為0送SDA=0
          SDA=0;
       tmp=tmp>>1;
       delay(SPD/2);
       SCL=1;
       delay(SPD);
       SCL=0;
     }
     delay(SPD/2);
     SDA=1;
     delay(SPD/2);
    }

/******************************************
主機(jī)接收數(shù)據(jù)位子程序
返回:接收的字節(jié)
******************************************/          
unsigned CHAR I2C_RXDATA()
    {
     unsigned CHAR tmp=0x01;
     unsigned CHAR i;
     unsigned CHAR rx=0;
     SCL=0;
     SDA=1;
     for (i=0;i<8;i++)
     {
       SCL=1;
       rx=rx<<1;       //接收一位后左移一位
       delay(SPD/2);
       rx=rx|SDA;      //接收
       delay(SPD/2);
       SCL=0;
       delay(SPD);
     }
     SCL=0;
     SDA=1;
    }

/*******************************************
主機(jī)傳輸子程序
不帶停止位
從設(shè)備無響應(yīng)自動從重傳
unsigned CHAR *tx:待傳輸?shù)臄?shù)組指針
unsigned CHAR num:待傳輸?shù)淖止?jié)個(gè)數(shù)
unsigned CHAR target:目標(biāo)設(shè)備地址
*******************************************/
void I2C_TX(unsigned CHAR data *tx,unsigned CHAR num,unsigned CHAR target )
    {
     while(1)
      {
       unsigned CHAR tmp;
       I2C_START();           //開始位設(shè)立
       I2C_TXDATA(target);    //傳輸目標(biāo)地址
       SCL=1;
       delay(SPD/2);
       if (SDA) continue;     //無響應(yīng)重傳
       delay(SPD/2);
       SCL=0;
    
       for(tmp=0;tmp<num;tmp++)  //傳輸數(shù)據(jù)位
        {
         I2C_TXDATA(*(tx+tmp));
         SCL=1;
         delay(SPD/2);
         if (SDA) break;         //無響應(yīng)重傳
         delay(SPD/2);
         SCL=0;
         delay(SPD/2);
         if (tmp==num-1)
           {
            SDA=1;
            return;
    
        &
2樓: >>參與討論
eleven11
wq
如果遇到一個(gè)地址為16位的設(shè)備和一個(gè)8位的設(shè)備,是否接受函數(shù)和發(fā)送函數(shù)必須分別寫成不同的兩個(gè)程序?因?yàn)榍耙环N設(shè)備需要送兩次地址,后一種設(shè)備只需要送一次地址

所謂的16地址也是因?yàn)榭臻g地址>255,有的便把高8位放到控制字中傳輸,有的便放在和低8位地址一起傳輸,可以判斷24CXX的類型來編



參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
USB芯片選擇
at89s52與at89c51
請大俠推薦一款顯示簡單,顏色明亮的液晶顯示器,多謝!
本群偏軟:MCS-51單片機(jī)(1893281)誠征群主兩名,歡迎高手加入
用keil編譯delay延時(shí)程序的疑問
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號