|
|||||||||||
| 技術(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è)比較另類的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 于 2005/6/15 7:08:00 發(fā)布:
wq 如果遇到一個(gè)地址為16位的設(shè)備和一個(gè)8位的設(shè)備,是否接受函數(shù)和發(fā)送函數(shù)必須分別寫成不同的兩個(gè)程序?因?yàn)榍耙环N設(shè)備需要送兩次地址,后一種設(shè)備只需要送一次地址 所謂的16地址也是因?yàn)榭臻g地址>255,有的便把高8位放到控制字中傳輸,有的便放在和低8位地址一起傳輸,可以判斷24CXX的類型來編 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |