亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c.c

?? 數字音頻實驗測試工程
?? C
字號:
/***************************************************
模塊說明      :I2C控制接口模塊
芯片類型      :Nios II
作    者      :柳軍勝
公    司      :杭州自由電子科技
            :http://www.freefpga.com
電   話       :0571-85084089
修    改      :
日期時間      :20060522
說    明      :本程序模塊僅提供I2C接口設備底層讀寫流程,不涉及
             具體應用芯片控制邏輯。
****************************************************/
#include <stdio.h>
#include <io.h>
#include <system.h>
#include <i2c_master.h>

static void *gBaseAddr=NULL;

/*********************************************
函數名:init_i2c
功  能:初始化I2C控制器、應用環境參數初始化設置
輸  入:外設地址
返  回: 
備  注:
      應用I2C函數前必須先調用此函數設置I2C外設基地址
      預分頻允許100K~400K
**********************************************/
int init_i2c(void *baseAddr)
{
  unsigned char uc,rdata;
  
  if(gBaseAddr==NULL)
    gBaseAddr=baseAddr;
    
  //setup prer
  IOWR(gBaseAddr , OC_I2C_PRER_LO ,0x63 );
  IOWR(gBaseAddr,  OC_I2C_PRER_HI, 0x00);
  
  //setup ctr
  IOWR(gBaseAddr , OC_I2C_CTR ,0x80 );
  
  //read_status
  //uc=IORD(gBaseAddr,OC_I2C_SR);
  
  //send stop
  IOWR(gBaseAddr,OC_I2C_TXR,0x55);
  IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR|OC_I2C_STO);
  
  return 0;
}

/*********************************************
函數名:wait_nTip_ACK
功  能:等待傳輸結束和應答
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷狀態寄存器標志位完成功能
**********************************************/
//wait transmit over and wait ACK
int wait_nTip_ACK()
{
    unsigned char uc;
    int i;
    
    if(gBaseAddr==NULL)
      return -1;
      
    i=0;
    while(1){
      //read_status TIP
      uc=IORD(gBaseAddr,OC_I2C_SR);
      if(OC_ISCLEAR(uc,OC_I2C_TIP))break;
      i++;
      if(i>10000)return -2;
    }
    
    i=0;
     while(1){
      //read_status ACK
      uc=IORD(gBaseAddr,OC_I2C_SR);
      if(OC_ISCLEAR(uc,OC_I2C_RXACK))break;
      i++;
      if(i>10000)
      {
        //I2C器件沒有應答時加入STOP發送 20060523
        IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STO); 
        return -3;
      }
    } 
    return 0;
}

/*********************************************
函數名:wait_nTip
功  能:等待傳輸結束
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷狀態寄存器標志位完成功能
**********************************************/
//wait transmit over 
int wait_nTip()
{
    unsigned char uc;
    int i;
    
    if(gBaseAddr==NULL)
      return -1;
      
    i=0;
     while(1){
      //read_status TIP
      uc=IORD(gBaseAddr,OC_I2C_SR);
      if(OC_ISCLEAR(uc,OC_I2C_TIP))break;
      i++;
      if(i>10000)return -1;
    }
    return 0;
}

/*********************************************
函數名:wait_idle
功  能:等待空閑
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷狀態寄存器標志位完成功能
**********************************************/
//wait i2c idle 
int wait_idle()
{
    unsigned char uc;
    int i;
    
    if(gBaseAddr==NULL)
      return -1;
      
    i=0;
     while(1){
      //read_status TIP
      uc=IORD(gBaseAddr,OC_I2C_SR);
      if(OC_ISCLEAR(uc,OC_I2C_BUSY))break;
      i++;
      if(i>10000)return -1;
    }
    return 0;
}

/*********************************************
函數名:start_write_waitack()
功  能:I2C啟動、寫數據、等待ACK
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int start_write_waitack(unsigned char data)
{
    int iRet;
    
    if(wait_idle()<0){
      printf("i2c control is busy\n");
      return -1;
    }
    
    IOWR(gBaseAddr,OC_I2C_TXR,data);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STA|OC_I2C_WR);
    iRet=wait_nTip_ACK();
    if(iRet<0){
      printf("1wait _nTip_ACK timeover\n");
      return -2;
    }
    
    return 0;
}

/*********************************************
函數名:start_read_waitack()
功  能:I2C啟動、寫數據、等待ACK
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int start_read_waitack(unsigned char data)
{
    int iRet;
    
    /* restart時狀態不是 IDLE 所以不需要等待idle */
    /*
      if(wait_idle()<0){
      printf("i2c control is busy\n");
      return -1;
    }
    */
    
    /* 這里寫的數據里面 R/W位為1,但是控制標志置OC_I2C_WR控制輸出從機地址 */
    IOWR(gBaseAddr,OC_I2C_TXR,data);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STA|OC_I2C_WR);
    iRet=wait_nTip_ACK();
    if(iRet<0){
      printf("1wait _nTip_ACK timeover\n");
      return -2;
    }
    
    return 0;
}

/*********************************************
函數名:write_waitack()
功  能:寫數據、等待ACK
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int write_waitack(unsigned char data)
{
    int iRet;
    
    IOWR(gBaseAddr,OC_I2C_TXR,data);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR);
    iRet=wait_nTip_ACK();
    if(iRet<0){
      printf("1wait _nTip_ACK timeover\n");
      return -2;
    }
    
    return 0;
}

/*********************************************
函數名:write_waitack_stop()
功  能:寫數據、等待ACK、發送STOP
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int write_waitack_stop(unsigned char data)
{
    int iRet;
  
    IOWR(gBaseAddr,OC_I2C_TXR,data);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR|OC_I2C_STO);
    iRet=wait_nTip_ACK();
    if(iRet<0){
      printf("1wait _nTip_ACK timeover\n");
      return -2;
    }
    
    return 0;
}

/*********************************************
函數名:read_sendack()
功  能:讀數據、發送ACK
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int read_sendack(unsigned char *data)
{
    int iRet;
  
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_RD|OC_I2C_ACK); 
    iRet=wait_nTip();
    if(iRet<0)
      return -1;
    
    *data=IORD(gBaseAddr,OC_I2C_RXR);
    return 0; 
}

/*********************************************
函數名:read_sendack_stop()
功  能:讀數據、發送ACK、STOP
輸  入:外設地址
返  回: 0 成功 <0失敗
備  注:
      判斷I2C狀態寄存器標志位完成功能
**********************************************/
int read_sendack_stop(unsigned char *data)
{
    int iRet;
  
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_RD|OC_I2C_ACK|OC_I2C_STO); 
    iRet=wait_nTip();
    if(iRet<0)
      return -1;
    
    *data=IORD(gBaseAddr,OC_I2C_RXR);
    return 0; 
}



/*********************************************
函數名:read_I2c_EEprom
功  能:讀EEPROM
輸  入:外設地址,設備地址,字節地址
返  回: 讀取的數據
備  注:
**********************************************/
unsigned char read_I2C_EEprom(unsigned char slaveAddr,unsigned char addr)
{
    unsigned char rdata;
      
    //write chip addr and write bit
    IOWR(gBaseAddr,OC_I2C_TXR,slaveAddr);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STA|OC_I2C_WR);
    wait_nTip_ACK();
    
    //write eeprom addr 
    IOWR(gBaseAddr,OC_I2C_TXR,addr);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR);
    wait_nTip_ACK();
    
    //write chip addr and read bit
    IOWR(gBaseAddr,OC_I2C_TXR,slaveAddr|0x01);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STA|OC_I2C_WR);
    wait_nTip_ACK();
    
    //read eeprom data
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_RD|OC_I2C_STO|OC_I2C_ACK); 
    wait_nTip();
    
    rdata=IORD(gBaseAddr,OC_I2C_RXR);    
    return rdata;
  }

/*********************************************
函數名:write_I2c_EEprom
功  能:寫EEPROM
輸  入:外設地址,設備地址,字節地址
返  回: 
備  注:
**********************************************/
unsigned char write_I2C_EEprom(unsigned char slaveAddr,unsigned char addr,unsigned char data)
{
    unsigned char rdata;
    unsigned char rc;
    
    if(wait_idle()<0){
      printf("i2c control is busy\n");
      return 0;
    }
    
    //write chip addr and write bit
    IOWR(gBaseAddr,OC_I2C_TXR,slaveAddr);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_STA|OC_I2C_WR);
    printf("w1\n");
    rc=wait_nTip_ACK();
    
    //write eeprom addr 
    IOWR(gBaseAddr,OC_I2C_TXR,addr);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR);
    printf("w2\n");
    rc=wait_nTip_ACK();
    
    //write data 
    IOWR(gBaseAddr,OC_I2C_TXR,data);
    IOWR(gBaseAddr,OC_I2C_CR, OC_I2C_WR|OC_I2C_STO);
    printf("w3\n");
    rc=wait_nTip_ACK();
       
    return data;
  }
  
  /*********************************************
函數名:I2c_write_byte
功  能:I2C寫字節
輸  入:設備地址,寄存器地址,數據
返  回: 
      -1  寫器件地址錯誤
      -2  寫寄存器地址錯誤
      -3  寫數據錯誤
      0   成功
備  注:通過I2C控制總線寫字節
**********************************************/
int I2C_write_byte(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 data)
{
    alt_u8 uc;
    int iRet;
    
    uc=slaveAddr & 0xfe;   
    iRet=start_write_waitack(uc);
    if(iRet<0)
      return -1;
    
    //write sub address
    iRet=write_waitack(sub_address);
    if(iRet<0)
      return -2;  
       
    //write data 
    iRet=write_waitack_stop(data);
    if(iRet<0)
      return -3;
       
    return 0;
  }
  
/*********************************************
函數名:I2c_read_byte
功  能:I2C讀字節
輸  入:設備地址,字節地址,讀數據指針
返  回: 
      -1  寫器件地址錯誤
      -2  寫寄存器地址錯誤
      -3  寫數據錯誤
      0   成功
備  注:通過I2C控制總線寫PCF8563控制寄存器
       使用了I2C庫的相關函數。
**********************************************/
int I2C_read_byte(alt_u8 slaveAddr,alt_u8 sub_address,alt_u8 *pData)
{
    alt_u8 uc;
    int iRet;
    
    //start
    uc=slaveAddr &0xfe;   
    iRet=start_write_waitack(uc);
    if(iRet<0)
      return -1;
    
    //write sub address
    iRet=write_waitack(sub_address);
    if(iRet<0)
      return -2;  
       
    //restart 
    uc=slaveAddr | 0x01;
    iRet=start_read_waitack(uc);
    if(iRet<0)
      return -3;
    
    // read data and stop  
    iRet=read_sendack_stop(pData);
    if(iRet<0)
      return -4;
         
    return 0;
}
  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线一区二区视频| 婷婷国产在线综合| 亚洲综合免费观看高清在线观看| 中文字幕欧美日韩一区| 国产欧美日韩不卡免费| 午夜成人免费视频| 95精品视频在线| 久久久蜜桃精品| 日本aⅴ亚洲精品中文乱码| 色94色欧美sute亚洲线路一久| 精品对白一区国产伦| 午夜久久久久久| 日本高清成人免费播放| 国产色爱av资源综合区| 国产自产视频一区二区三区| 欧美乱妇20p| 一区二区三区四区中文字幕| 成人综合婷婷国产精品久久蜜臀 | 精品剧情在线观看| 亚洲成av人片在线观看无码| 一本到一区二区三区| 国产精品传媒入口麻豆| 国产91高潮流白浆在线麻豆 | 色婷婷国产精品综合在线观看| 久久理论电影网| 久久精品久久精品| 91麻豆精品国产91久久久| 亚洲成人动漫av| 欧美日韩不卡视频| 亚洲国产成人av| 欧美日韩日本视频| 日韩激情中文字幕| 在线播放日韩导航| 日本视频中文字幕一区二区三区| 欧美精品精品一区| 日本欧美一区二区在线观看| 欧美日韩国产综合久久| 亚洲高清不卡在线| 91精品国产综合久久久久久漫画 | 欧美va亚洲va国产综合| 久久精品国产亚洲aⅴ| 亚洲精品一区二区三区四区高清| 美女在线视频一区| 久久久久久久久免费| 成人av先锋影音| 亚洲桃色在线一区| 欧美色综合久久| 免费久久99精品国产| 久久久91精品国产一区二区精品| 成人激情av网| 亚洲国产精品久久艾草纯爱| 在线播放一区二区三区| 激情图区综合网| 亚洲欧美影音先锋| 欧美日韩不卡在线| 国产经典欧美精品| 亚洲精品乱码久久久久久日本蜜臀| 欧美日韩精品一区二区三区四区 | 狂野欧美性猛交blacked| 国产亚洲欧美在线| 在线观看亚洲精品视频| 日本不卡一区二区三区| 久久日韩粉嫩一区二区三区| www.欧美日韩| 日本不卡在线视频| 中文字幕亚洲一区二区av在线| 欧美亚洲动漫制服丝袜| 美女一区二区久久| 成人免费一区二区三区视频| 5858s免费视频成人| 国产精品99久久久久久宅男| 亚洲自拍另类综合| 久久久美女艺术照精彩视频福利播放| 91亚洲精品久久久蜜桃网站| 日本一不卡视频| 亚洲欧洲制服丝袜| 久久综合久久综合亚洲| 欧美日韩一区精品| 波多野结衣精品在线| 久久99精品久久久久久| 一区二区三区四区视频精品免费 | 欧美精品vⅰdeose4hd| 成人丝袜高跟foot| 青青草一区二区三区| 亚洲精品高清视频在线观看| 久久久久久久综合| 555www色欧美视频| 色婷婷激情久久| 成人精品视频一区| 九九国产精品视频| 亚洲高清一区二区三区| 国产精品卡一卡二| 久久午夜免费电影| 精品美女在线播放| 欧美一区二区黄色| 日本道免费精品一区二区三区| 国产精品一级在线| 久久国产精品无码网站| 日本最新不卡在线| 婷婷丁香激情综合| 亚洲成av人片一区二区三区| 亚洲人吸女人奶水| 日韩一区中文字幕| 国产三级精品三级在线专区| 亚洲精品一线二线三线| 日韩欧美国产麻豆| 欧美大片日本大片免费观看| 5566中文字幕一区二区电影 | 欧美aaaaa成人免费观看视频| 亚洲精品网站在线观看| 亚洲精品大片www| 一区二区三区欧美亚洲| 亚洲另类在线视频| 亚洲国产精品自拍| 午夜久久电影网| 蜜臀国产一区二区三区在线播放| 首页综合国产亚洲丝袜| 日韩精品电影在线观看| 日本一区中文字幕| 国产精一区二区三区| 国产成a人亚洲精品| 成人在线一区二区三区| 99在线精品视频| 色综合久久99| 欧美久久一二三四区| 91麻豆精品国产91久久久| 日韩欧美国产系列| 久久精品人人爽人人爽| 中文字幕一区二区视频| 一区二区三区高清不卡| 午夜精品福利视频网站| 久久成人羞羞网站| 成人精品亚洲人成在线| 欧美系列日韩一区| 日韩三级在线观看| 国产精品人人做人人爽人人添| 亚洲日本va午夜在线影院| 亚洲制服丝袜av| 久久综合综合久久综合| 风间由美一区二区三区在线观看| 91免费视频网址| 91.com视频| 国产日韩欧美精品电影三级在线| 亚洲欧美色图小说| 免费观看在线综合| av亚洲精华国产精华精华| 欧美系列在线观看| 国产午夜精品在线观看| 亚洲一区日韩精品中文字幕| 精品一区二区三区免费| 91热门视频在线观看| 欧美一区二视频| 国产精品拍天天在线| 日本系列欧美系列| 9l国产精品久久久久麻豆| 欧美一区二区三区色| 中文字幕中文在线不卡住| 日韩成人一级大片| 91在线视频播放地址| 欧美zozo另类异族| 亚瑟在线精品视频| 粉嫩av一区二区三区| 日韩亚洲国产中文字幕欧美| 亚洲欧洲性图库| 狠狠色丁香久久婷婷综合_中| 日本久久一区二区三区| 久久亚洲春色中文字幕久久久| 亚洲一区二区偷拍精品| 成人免费看视频| 久久综合九色综合97婷婷 | 一区二区在线观看视频在线观看| 男女视频一区二区| 日本韩国欧美三级| 国产精品国产三级国产普通话三级| 蜜臀av性久久久久蜜臀aⅴ四虎| 色综合久久久久综合体桃花网| 久久免费电影网| 久久国产免费看| 日韩一区二区三区视频| 亚洲一本大道在线| 91国偷自产一区二区三区成为亚洲经典| 精品少妇一区二区三区日产乱码 | 欧美成人伊人久久综合网| 亚洲国产精品自拍| 色婷婷av一区二区三区gif| 中文字幕免费观看一区| 极品少妇一区二区三区精品视频| 91精品蜜臀在线一区尤物| 午夜精品福利久久久| 欧美日韩中文国产| 亚洲高清视频在线| 欧美日韩三级视频| 舔着乳尖日韩一区| 欧美精品乱码久久久久久| 午夜精品久久久久影视| 欧美日韩精品一区二区三区蜜桃| 亚洲国产cao| 欧美一区二区三区性视频| 日韩二区三区四区| 日韩三级免费观看|