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

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

求助關于GPIO的IOPIN問題

作者:fengboy 欄目:MCU技術
求助關于GPIO的IOPIN問題
我想用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

參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
外部數(shù)據(jù)存儲器的用法
急尋LCD驅(qū)動的超低功耗8位MCU
大家?guī)兔Α胘tag調(diào)試外部flash出現(xiàn)錯誤
913 問題
求助周公
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


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