|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
求助關于GPIO的IOPIN問題 |
| 作者:fengboy 欄目:MCU技術 |
我想用LPC2114.html">LPC2114來模擬I2C總線(雖然LPC2114.html">LPC2114有自帶的接口,不過這種模擬還是有普遍意義). LPC2114的GPIO在應用中要么是輸入,要么是輸出,同時既是輸入又是輸出是不能的. 這就遇到一個問題,I2C中有應答機制,也就是說SDA是雙向的,它同時發(fā)送信號,又要接收來自器件的應答信號,這怎么模擬? 我的想法是: 發(fā)送數(shù)據(jù)是設置模擬的SDA端口(比如P0.24)為GPIO,方向為輸出; 在接收數(shù)據(jù)或判斷應答信號時把SDA端口(比如P0.24)的方向設置為輸入,讀取IOPIN. 是不是要這樣來回切換I/O口的方向. 還有一個問題就是對IOPIN寄存器的理解.手冊中是這么說的, IOPIN:GPIO引腳寄存器,不管方向和模式如何設定,引腳的當前狀態(tài)都可以從該寄存器中讀數(shù). 如果果真是這樣的話,我引腳設置成輸出,外面輸入信號,我不用切換狀態(tài),直接從IOPIN讀端口狀態(tài)不就可以拉嗎? 如果這樣的話,端口不是能拉雙向的拉嗎,同時既是輸入又是輸出. 希望大家?guī)臀医饣?謝謝 下面是我模擬I2C的關鍵程序,運行發(fā)現(xiàn)出錯. #define SDA 1<<24 //p0.24 作為輸出 #define SDA1 0x00000000 //p0.24 作為輸出 #define SCL 1<<25 //p0.25 作為輸出 void Delay1(uint16 x) { for(;x>0;x--); } void Start_I2c() { IO0SET=SDA; /*發(fā)送起始條件的數(shù)據(jù)信號*/ IO0SET=SCL; Delay1(1000); /*起始條件建立時間大于4.7us,延時*/ IO0CLR=SDA; /*發(fā)送起始信號*/ Delay1(1000); /* 起始條件鎖定時間大于4μs*/ IO0CLR=SCL; /*鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) */ Delay1(1000); } void Stop_I2c() { IO0CLR=SDA; IO0CLR=SCL; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/ Delay1(1000); /*發(fā)送結(jié)束條件的時鐘信號*/ IO0SET=SCL; /*結(jié)束條件建立時間大于4μs*/ Delay1(1000); IO0SET=SDA; /*發(fā)送I2C總線結(jié)束信號*/ Delay1(1000); } /******************************************************************* 字節(jié)數(shù)據(jù)傳送函數(shù) 函數(shù)原型: void SendByte(uint8 c); 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應答,并對 此狀態(tài)位進行操作.(不應答或非應答都使ack=0 假) 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應答或損壞。 ********************************************************************/ void SendByte(uint8 c) { uint8 BitCnt; uint32 i; CHAR s[40]; for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數(shù)據(jù)長度為8位*/ { if((c<<BitCnt)&0x80)IO0SET=SDA; /*判斷發(fā)送位*/ else IO0CLR=SDA; Delay1(1000); IO0SET=SCL; /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/ Delay1(1000); /*保證時鐘高電平周期大于4μs*/ IO0CLR=SCL; /*保證時鐘低電平周期大于4.7μs*/ Delay1(1000); } IO0SET=SDA; /*8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位*/ Delay1(1000); IO0SET=SCL; //產(chǎn)生第9個時鐘 IO0DIR=SDA1|SCL; //切換SDA方向 while(IO0PIN&SDA) { i++; if(i>2000) break; } if(i>2000) {sprintf(s,"NO ACK!,ERROR!"); SendPCStr(40,20,s,0x30);ack=0; } else {sprintf(s,"OK!"); SendPCStr(40,20,s,0x30);ack=1;} /*判斷是否接收到應答信號*/ IO0CLR=SCL; IO0DIR=SDA|SCL; Delay1(1000); } uint8 ISendByte(uint8 sla,uint8 c) { Start_I2c(); /*啟動總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack==0)return(0); SendByte(c); /*發(fā)送數(shù)據(jù)*/ if(ack==0)return(0); Stop_I2c(); /*結(jié)束總線*/ return(1); } main函數(shù)初始化后運行ISendByte(0xa0,0x55),發(fā)現(xiàn)總是顯示NO ACK!ERROR!說明程序有問題.fclk=4*11.0592;Delay1(1000)這個延遲肯定是大于4.7us的.不知道什么問題,時序我看拉沒問題啊. * - 本貼最后修改時間:2007-4-29 19:10:15 修改者:fengboy |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |