久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

基于單片機的AT2402的I2C總線讀寫驅動程序

作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月17日   【字體:

 //此部分為AT2402的驅動程序使用I2C總線連接

#include<Function.h>
 
//AT2402的功能函數
 
//                    向有子地址器件發送多字節數據函數              
//函數原型: bit  ISendStr(UCHAR sla,UCHAR suba,ucahr /s,UCHAR no); 
//功能:     從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
//         地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
//          如果返回1表示操作成功,否則操作有誤。
//注意:    使用前必須已結束總線。
 
bit ISendStr(unsigned char  sla,unsigned char  suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;
 
   Start_I2c();               //啟動總線//
   SendByte(sla);             //發送器件地址//
   if(ack==0)return(0);
   SendByte(suba);            //發送器件子地址//
   if(ack==0)return(0);       //此處表示內部ROM地址
 
   for(i=0;i<no;i++)          //叢機向主機發送數據
   {  
     SendByte(*s);            //發送數據//
     if(ack==0)return(0);
     s++;
   }
   Stop_I2c();                //結束總線//
 
   return(1);
}
 
//                    向有子地址器件讀取多字節數據函數              
//函數原型: bit  RecndStr(UCHAR sla,UCHAR suba,ucahr /s,UCHAR no); 
//功能:     從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
//         地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
//           如果返回1表示操作成功,否則操作有誤。
//注意:    使用前必須已結束總線。
bit IRcvStr(unsigned char  sla,unsigned char  suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;
 
   Start_I2c();                  //啟動總線//
   SendByte(sla);                //發送器件地址//
   if(ack==0)return(0);
   SendByte(suba);               //發送器件子地址//
   if(ack==0)return(0);         //此處表示內部ROM地址
 
   Start_I2c();                 //重新啟動總線//
   SendByte(sla+1);           //表示由主機處讀取數據
   if(ack==0)return(0);
   for(i=0;i<no-1;i++)
   {  
     /s=RcvByte();               //發送數據//
      Ack_I2c(0);                //發送就答位// 
     s++;
   }
   /s=RcvByte();
   Ack_I2c(1);                   //發送非應位//
   Stop_I2c();                   //結束總線//
   return(1);
}
 
啟動,停止,字節發送及應答位的程序參考:
 
I2C總線的驅動程序
//此部分為I2C總線的驅動程序/
 
#include<reg52.h>
#include <intrins.h>
#include <I2C.H>
 
#define  NOP()   _nop_()   // 定義空指令
 
#define  _Nop()  _nop_()   //定義空指令 
sbit     SCL=P2^0;       //I2C  時鐘
sbit     SDA=P2^1;       //I2C  數據
bit ack;                 //應答標志位/  
 
  //                起動總線函數  起動總線函數              
//函數原型: void  Start_I2c(); 
//功能:     啟動I2C總線,即發送I2C起始條件. 
void Start_I2c()
{
  SDA=1;         //發送起始條件的數據信號 
 
 _Nop();
  SCL=1;
  _Nop();        //起始條件建立時間大于4.7us,延時 
 
 _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;         //發送起始信號
  _Nop();        // 起始條件鎖定時間大于4μs
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;       //鉗住I2C總線,準備發送或接收數據
  _Nop();
  _Nop();
}
 
 //                     結束總線函數              
//函數原型: void  Stop_I2c(); 
//功能:     結束I2C總線,即發送I2C結束條件. 
void Stop_I2c()
{
  SDA=0;      //發送結束條件的數據信號
  _Nop();       //發送結束條件的時鐘信號
  SCL=1;      //結束條件建立時間大于4μs
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;      //發送I2C總線結束信號
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
 
//                字節數據發送函數              
//函數原型: void  SendByte(UCHAR c);
//功能:     將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
 //         此狀態位進行操作.(不應答或非應答都使ack=0)    
//           發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
void  SendByte(unsigned char  c)
{
 unsigned char  BitCnt;
 
 for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數據長度為8位
    {
     if((c<<BitCnt)&0x80)SDA=1;   //判斷發送位
       else  SDA=0;               
     _Nop();
     SCL=1;               //置時鐘線為高,通知被控器開始接收數據位
      _Nop();
      _Nop();             //保證時鐘高電平周期大于4μs
      _Nop();
      _Nop();
      _Nop();        
     SCL=0;
    }
   
    _Nop();
    _Nop();
    SDA=1;                //8位發送完后釋放數據線,準備接收應答位
    _Nop();
    _Nop();  
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;    
       else ack=1;        //判斷是否接收到應答信號
    SCL=0;
    _Nop();
    _Nop();
}
 
//                 字節數據接收函數              
//函數原型: UCHAR  RcvByte();
//功能:        用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
  //        發完后請用應答函數應答從機。    
unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
 
  retc=0;
  SDA=1;                     //置數據線為輸入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();          
        SCL=0;                  //置時鐘線為低,準備接收數據位
        _Nop();
        _Nop();                 //時鐘低電平周期大于4.7μs
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  //置時鐘線為高使數據線上數據有效
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  //讀數據位,接收的數據位放入retc中
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}
 
//                應答子函數
//函數原型:  void Ack_I2c(bit a);
//功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
void Ack_I2c(bit a)
{
 
  if(a==0)SDA=0;              //在此發出應答或非應答信號
 
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();     
  SCL=1;
  _Nop();
  _Nop();                    //時鐘低電平周期大于4μs
 
  _Nop();
  _Nop();
  _Nop(); 
  SCL=0;                     //清時鐘線,鉗住I2C總線以便繼續接收
  _Nop();
  _Nop();   
}
 
 
關閉窗口
主站蜘蛛池模板: 久久久高清 | 欧美大片久久久 | 欧美一级淫片007 | 欧美日韩精品影院 | 午夜免费观看体验区 | 中文字幕高清一区 | 99精品欧美一区二区蜜桃免费 | 欧美日韩视频在线播放 | 国产精品久久久久久久久久妇女 | 在线一区二区三区 | 国产精品theporn | 欧美精品被 | 精品九九久久 | 国产成人福利在线观看 | 国内精品久久久久久久 | 奇米超碰在线 | 男女羞羞视频在线免费观看 | 欧美videosex性极品hd | 久久中文一区二区 | 精品在线一区二区 | 在线欧美亚洲 | 成人欧美一区二区三区黑人孕妇 | www久久国产| 97人人澡人人爽91综合色 | 日韩欧美在线播放 | 久久99这里只有精品 | 九九久久久久久 | 日韩精品亚洲专区在线观看 | 欧美激情在线精品一区二区三区 | 国产中文字幕在线 | 亚洲一区二区在线视频 | 欧美性猛交一区二区三区精品 | 国产精品一区二区不卡 | 孕妇一级毛片 | 国产成人99久久亚洲综合精品 | a视频在线 | 91久久久久久久久 | 精品国产18久久久久久二百 | 国产亚洲成av人在线观看导航 | 在线中文字幕视频 | 日韩在线国产精品 |