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

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

?? vi2c.c

?? ZLG的EASYARM8962開發板Keil實驗例程
?? C
字號:
/********************************************************************
  		LM3S101單片機模擬I2C軟件包(V1.1)
    文件名:VI2C_LM3S101.C
    相關文件:VI2C_LM3S101.H
    功能說明:本模擬I2C軟件包包含了I2C操作的底層函數,如發送數據及接收
數據,應答位發送,并提供了幾個直接面對器件的操作函數,它很方便的與用戶程
序連接并擴展.....  
    注意:函數是采用軟件延時的方法產生SCL脈沖,故對高晶振頻率要作 一定的
修改....(本軟件包對應于處理器采用6MHz的外部晶振。)
********************************************************************/
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_gpio.h"
#include "interrupt.h"
#include "gpio.h"

// 宏定義
#ifndef  uchar
#define  uchar unsigned char
#endif

#ifndef  uint 	 
#define  uint  unsigned int
#endif

void delay(uint no)
{
    for(; no; no--);
}

// I2C引腳的定義。
#define SDA  GPIO_PIN_3         //模擬I2C數據傳送位
#define SCL  GPIO_PIN_2         //模擬I2C時鐘控制位

int ack;	                //應答標志位ack

/*******************************************************************
                     起動總線函數               
函數原型: void  Start_I2c();  
功能:     啟動I2C總線,即發送I2C起始條件
          起始條件為:在SCL線是高電平時,SDA線由高電平向低電平切換   
********************************************************************/
void Start_I2c()
{
  //發送起始條件的數據信號
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;   // SDA = 1;
  delay(6);
  //發送起始條件的時鐘信號
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;   // SCL = 1;
  delay(30);    	        //起始條件建立時間大于4.7us,延時
  //發送起始信號
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = ~SDA;   // SDA = 0;
  delay(30);    	        //起始條件鎖定時間大于4.7us
  //鉗住I2C總線,準備發送或接收數據 
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL;   // SCL = 0;
  delay(12);
}

/*******************************************************************
                       結束總線函數               
函數原型: void  Stop_I2c();  
功能:     結束I2C總線,即發送I2C結束條件.
          停止條件為:在SCL線是高電平時,SDA線由低電平向高電平切換  
********************************************************************/
void Stop_I2c()
{
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = ~SDA;  	        //發送結束條件的數據信號
  delay(6);   	        
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;  	        //發送結束條件的時鐘信號
  delay(30);               //結束條件建立時間大于4μs
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;  	        //發送I2C總線結束信號
  delay(24);
}


/*******************************************************************
                 字節數據發送函數               
函數原型: void  SendByte(uchar c);
功能:     將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
          此狀態位進行操作.(不應答或非應答都使ack=0)     
     	  發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
********************************************************************/
void  SendByte(uchar c)
{
 uchar BitCnt;
 
 //要傳送的數據長度為8位,
 for(BitCnt=0;BitCnt<8;BitCnt++)  
   {
     //判斷發送位  
     if((c<<BitCnt)&0x80)   
       {
        HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;   
       }
       else  
         {
          HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = ~SDA;
         }
        
     delay(6);
     HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;      //置時鐘線為高,通知被控器開始接收數據位
     delay(30);                                                     //保證時鐘高電平周期大于4μs
     HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL; 
   }
    
  delay(12);
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;         //8位發送完后釋放數據線,準備接收應答位
  delay(12);
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;
  delay(18);
  if(!HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))))                  //判斷是否接收到應答信號
       ack=0;
      else 
       ack=1;

  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL;
  delay(12);
}

/*******************************************************************
                 字節數據接收函數               
函數原型: uchar  RcvByte();
功能:  	  用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
          發完后請用應答函數應答從機。  
********************************************************************/	
uchar  RcvByte()
{
  uchar retc;
  uchar BitCnt;
  
  retc=0; 
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;         
  GPIODirModeSet(GPIO_PORTB_BASE, SDA,GPIO_DIR_MODE_IN);             //置數據線為輸入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
    {
     delay(6);           
     HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL;     //置時鐘線為低,準備接收數據位
     delay(30);                                                      //時鐘低電平周期大于4.7μ
     HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;      //置時鐘線為高使數據線上數據有效
     delay(12);
     retc=retc<<1;

     if(HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))))         //讀數據位,接收的數據位放入retc中 
         retc=retc+1;
 
     delay(12);
    }
  GPIODirModeSet(GPIO_PORTB_BASE, SDA,GPIO_DIR_MODE_OUT);            // 置數據線為輸出方式
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL;    
  delay(12);
  return(retc);
}

/********************************************************************
                     應答子函數
函數原型:  void Ack_I2c(bit a);
功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
********************************************************************/
void Ack_I2c(int a)
{
  if(a==0)
     HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = ~SDA;     //在此發出應答或非應答信號 
    else 
      HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SDA << 2))) = SDA;

  delay(18);
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = SCL;
  delay(30);                                                         //時鐘低電平周期大于4μs  
  HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (SCL << 2))) = ~SCL;        //清時鐘線,鉗住I2C總線以便繼續接收
  delay(12);
}

/*******************************************************************
                 用戶接口函數                                   
*******************************************************************/


/*******************************************************************
                 向無子地址器件發送字節數據函數               
函數原型: uchar  ISendByte(uchar sla,uchar c);  
功能:     從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
          如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar ISendByte(uchar sla,uchar c)
{
  Start_I2c();          //啟動總線
  SendByte(sla);        //發送器件地址
  if(ack==0)
     return(0);

  SendByte(c);          //發送數據
  if(ack==0)            
     return(0);

  Stop_I2c();           //結束總線 
  return(1);
}

/*******************************************************************
                    向有子地址器件發送多字節數據函數               
函數原型: uchar  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
功能:     從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
          地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
          如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
  uchar i;

  Start_I2c();          //啟動總線
  SendByte(sla);        //發送器件地址
  if(ack==0)           
    return(0);

  SendByte(suba);       //發送器件子地址
  if(ack==0)
    return(0);

  for(i=0;i<no;i++)
    {   
     SendByte(*s);      //發送數據
     if(ack==0)
       return(0);
     s++;
    } 
  Stop_I2c();           //結束總線
  return(1);
}


/*******************************************************************
                    向無子地址器件發送多字節數據函數               
函數原型: uchar  ISendStrExt(uchar sla,uchar *s,uchar no);  
功能:     從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
          地址sla,發送內容是s指向的內容,發送no個字節。
          如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar ISendStrExt(uchar sla,uchar *s,uchar no)
{
  uchar i;

  Start_I2c();          //啟動總線
  SendByte(sla);        //發送器件地址
  if(ack==0)
    return(0);

  for(i=0;i<no;i++)
    {   
     SendByte(*s);      //發送數據
     if(ack==0)
       return(0);
     s++;
    } 
  Stop_I2c();           //結束總線 
  return(1);
}

/*******************************************************************
                    向無子地址器件讀取一字節數據函數               
函數原型: uchar  IRcvByte(uchar sla,ucahr *c);  
功能:     從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
          址sla,返回值在c.
          如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar IRcvByte(uchar sla,uchar *c)
{
  Start_I2c();          //啟動總線
  SendByte(sla+1);      //發送器件地址
  if(ack==0)
     return(0);

  *c=RcvByte();         //接收數據
  Ack_I2c(1);           //接收完,發送非應答位,結束總線
  Stop_I2c();           //結束總線 
  return(1);
}


/*******************************************************************
                    向有子地址器件讀取多字節數據函數               
函數原型: uchar  ISendStr(uchar sla,uchar suba,uchar *s,uchar no);  
功能:     從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
          地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
           如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
  uchar i;

  Start_I2c();          //啟動總線
  SendByte(sla);        //發送器件地址
  if(ack==0)
     return(0);

  SendByte(suba);       //發送器件子地址
  if(ack==0)
     return(0);



  Start_I2c();		//重新啟動總線
  SendByte(sla+1);
  if(ack==0)
     return(0);




  for(i=0;i<no-1;i++)   //先接收前(no-1)字節
   {   
     *s=RcvByte();      //接收數據
     Ack_I2c(0);        //還未接收完,發送應答位  
     s++;
   } 
   *s=RcvByte();        //接收第no字節
   Ack_I2c(1);          //接收完,發送非應答位
   Stop_I2c();          //結束總線 
   return(1);
}

/*******************************************************************
                    向無子地址器件讀取多字節數據函數               
函數原型: uchar  ISendStrExt(uchar sla,uchar *s,uchar no);  
功能:     從啟動總線到發送地址,讀數據,結束總線的全過程.
          從器件地址sla,讀出的內容放入s指向的存儲區,
          讀no個字節。如果返回1表示操作成功,否則操作有誤。
注意:    使用前必須已結束總線。
********************************************************************/
uchar IRcvStrExt(uchar sla,uchar *s,uchar no)
{
  uchar i;

  Start_I2c();
  SendByte(sla+1);	//R/W選擇位,為1時為讀, 為0 時為寫
  if(ack==0)return(0);

  for(i=0;i<no-1;i++)   //先接收前(no-1)個字節
   {   
     *s=RcvByte();      //接收數據
     Ack_I2c(0);        //未讀取完,發送應答位  
     s++;
   } 
   *s=RcvByte();        //接收第no字節
   Ack_I2c(1);          //接收完,發送非應答位
   Stop_I2c();          //結束總線 
   return(1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美男女性生活在线直播观看| 欧美性受极品xxxx喷水| 最新国产成人在线观看| 99精品欧美一区二区三区小说| 国产亚洲欧美中文| 在线免费不卡电影| 极品少妇xxxx精品少妇偷拍| 国产精品不卡一区二区三区| 欧美卡1卡2卡| 国产麻豆精品在线| 一区二区免费在线| 欧美va亚洲va| 色网站国产精品| 免费成人在线视频观看| 国产精品色一区二区三区| 欧美三区在线观看| 麻豆精品国产传媒mv男同| 中文字幕不卡的av| 日韩一卡二卡三卡四卡| 成人免费毛片嘿嘿连载视频| 亚洲午夜久久久久久久久久久 | 色综合天天综合狠狠| 亚洲.国产.中文慕字在线| 久久久久国产精品麻豆ai换脸| 欧美色图一区二区三区| 成熟亚洲日本毛茸茸凸凹| 日韩av一区二区在线影视| 亚洲欧美激情插| 久久这里只精品最新地址| 欧美色视频在线观看| 日韩成人午夜精品| 亚洲久本草在线中文字幕| 久久无码av三级| 欧美一区二区免费视频| 91蝌蚪porny九色| 福利一区二区在线| 国产中文字幕一区| 日韩专区中文字幕一区二区| 亚洲欧美一区二区在线观看| 精品国产三级a在线观看| 欧美系列日韩一区| 91麻豆精东视频| 国产综合久久久久久久久久久久 | 国产精品色呦呦| 欧美mv日韩mv| 欧美高清视频www夜色资源网| 色综合中文字幕| 99国产精品久久久久久久久久| 国产精品888| 精品一区二区三区在线观看| 美日韩一区二区| 丝袜美腿成人在线| 亚洲国产精品麻豆| 亚洲中国最大av网站| 亚洲另类中文字| 久久精品网站免费观看| 欧美v日韩v国产v| 精品视频一区 二区 三区| 91搞黄在线观看| 日本韩国一区二区| 精品视频资源站| 欧美日韩精品二区第二页| 欧美系列一区二区| 欧美人妇做爰xxxⅹ性高电影 | av电影在线不卡| 国产白丝精品91爽爽久久| 国产精品资源网站| 国产精品1区2区| 国产jizzjizz一区二区| 国产宾馆实践打屁股91| av亚洲产国偷v产偷v自拍| av一本久道久久综合久久鬼色| 九色porny丨国产精品| 国产一区二区0| 国产不卡免费视频| 99久久久久久| 欧美私人免费视频| 欧美日韩成人在线| 日韩欧美一级精品久久| 欧美xxxxx裸体时装秀| 日本一区二区视频在线| 国产精品高潮呻吟| 亚洲一级电影视频| 日韩高清在线观看| 激情综合五月婷婷| 成人av电影在线观看| 欧美中文一区二区三区| 欧美一区二区精品在线| 国产亚洲美州欧州综合国| 国产精品进线69影院| 亚洲欧美激情视频在线观看一区二区三区| 国产精品入口麻豆原神| 一区二区高清免费观看影视大全| 日本亚洲最大的色成网站www| 国产主播一区二区| 一本久久a久久精品亚洲| 欧美人妇做爰xxxⅹ性高电影| 久久亚洲免费视频| 一二三区精品视频| 久久99精品网久久| av资源网一区| 欧美日韩高清一区| 国产欧美一区二区三区在线看蜜臀 | 麻豆精品在线看| 国产99久久久久| 91天堂素人约啪| 欧美一区二区三区四区在线观看| 国产三级精品在线| 国产精品传媒在线| 日韩极品在线观看| youjizz久久| 日韩一区二区三区视频在线观看| 欧美高清在线一区| 日本成人在线网站| www.日韩大片| 一本到一区二区三区| 国产不卡视频一区| 色老头久久综合| 国产三级精品三级| 国产尤物一区二区| 成人黄色777网| 精品国产乱码久久久久久图片| 1000精品久久久久久久久| 日本欧美久久久久免费播放网| av在线一区二区| 不卡电影一区二区三区| 欧美日韩高清影院| 国产精品久久久久久一区二区三区| 天堂资源在线中文精品| 成人午夜在线播放| 精品久久久久99| 午夜视频久久久久久| 粉嫩一区二区三区性色av| 日韩一区二区麻豆国产| 亚洲国产日日夜夜| 91在线观看免费视频| 久久综合狠狠综合久久激情| 日韩福利视频网| 欧美日韩中文国产| 洋洋成人永久网站入口| 成人美女视频在线观看18| 3d动漫精品啪啪一区二区竹菊| 亚洲三级在线免费| 不卡一二三区首页| 欧美国产一区视频在线观看| 精品在线播放午夜| 日韩午夜在线播放| 欧美aaaaaa午夜精品| 欧美日韩精品欧美日韩精品| 亚洲综合色区另类av| 91影院在线免费观看| 中文字幕在线播放不卡一区| 韩国中文字幕2020精品| 日韩欧美在线影院| 日本欧洲一区二区| 久久综合狠狠综合久久激情| 国产丶欧美丶日本不卡视频| 国产精品激情偷乱一区二区∴| 日本精品一区二区三区高清 | 亚洲欧美日韩系列| 欧美系列日韩一区| 青草国产精品久久久久久| 精品国产乱码久久| 成人性生交大片免费| 一区二区三区在线观看视频| 911国产精品| 国产精品一线二线三线| 亚洲欧美在线aaa| 欧美久久久久免费| 国产综合色产在线精品| 亚洲欧洲日韩在线| 欧美日韩小视频| 国产一区日韩二区欧美三区| 亚洲手机成人高清视频| 欧美另类videos死尸| 国产成人鲁色资源国产91色综| 日韩理论片网站| 日韩视频免费观看高清完整版在线观看| 国内精品伊人久久久久av影院| 中文字幕一区二区三区在线不卡| 欧美日韩精品是欧美日韩精品| 国产一区91精品张津瑜| 亚洲乱码国产乱码精品精98午夜| 欧美刺激脚交jootjob| 91麻豆成人久久精品二区三区| 日韩va亚洲va欧美va久久| 国产精品无圣光一区二区| 欧美亚洲一区二区在线| 国产乱码字幕精品高清av| 一区二区三区四区激情| 久久久久久久久99精品| 欧美日韩中文一区| 成人精品免费视频| 久久99国内精品| 亚洲自拍偷拍图区| 国产精品久久久久久户外露出| 日韩一区二区在线观看视频| 在线精品视频小说1| 粉嫩嫩av羞羞动漫久久久| 日本sm残虐另类|