• 您現在的位置是:首頁 >生活 > 2023-12-17 08:54:14 來源:

    I2C協議時序圖(i2c協議)

    導讀 大家好,我是小夏,我來為大家解答以上問題。I2C協議時序圖,i2c協議很多人還不知道,現在讓我們一起來看看吧!1、void delay_scl()2、 ...

    大家好,我是小夏,我來為大家解答以上問題。I2C協議時序圖,i2c協議很多人還不知道,現在讓我們一起來看看吧!

    1、void delay_scl()

    2、  {

    3、  unsigned data i=10;

    4、  do

    5、  {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

    6、  }

    7、  while(--i);

    8、  }

    9、  void delay(unsigned char data k)//精確延時k*0.1us

    10、  {

    11、  unsigned char data i=250;

    12、  do{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//執行一個nop為1個時鐘周期

    13、  while(--i);}

    14、  while(--k);//執行一個while為2個時鐘周期

    15、  }

    16、  void i2c_init() //I2C的初始化:SDA和SCL都為高電平

    17、  {

    18、  sda=1;

    19、  delay_scl();

    20、  scl=1;

    21、  delay_scl();

    22、  }

    23、  void i2c_start() //開始信號

    24、  {

    25、  i2c_init();

    26、  sda=0;

    27、  delay_scl();

    28、  }

    29、  void i2c_stop() //停止信號

    30、  {

    31、  sda=0;

    32、  delay_scl();

    33、  scl=1;

    34、  delay_scl();

    35、  sda=1;

    36、  delay_scl();

    37、  }

    38、  void i2c_response() //應答信號

    39、  {

    40、  unsigned char xdata i;

    41、  scl=1;

    42、  delay_scl();

    43、  while((sda==1)&&(i<250))i++;

    44、  scl=0;

    45、  delay_scl();

    46、  }

    47、  void i2cwrite_byte(unsigned char data dat) //寫1個字節

    48、  {unsigned char xdata i,temp;

    49、  temp=dat;

    50、  for(i=0;i<8;i++)

    51、  {

    52、  temp=temp<<1;

    53、  scl=0;

    54、  delay_scl();

    55、  sda=CY;

    56、  delay_scl();

    57、  scl=1;

    58、  delay_scl();

    59、  }

    60、  scl=0;

    61、  delay_scl();

    62、  sda=1;

    63、  delay_scl();

    64、  }

    65、  unsigned char i2cread_byte() //讀1個字節

    66、  {

    67、  unsigned char xdata i,k;

    68、  scl=0;

    69、  delay_scl();

    70、  sda=1;

    71、  delay_scl();

    72、  for(i=0;i<8;i++)

    73、  {

    74、  scl=1;

    75、  delay_scl();

    76、  k=(k<<1)|sda;

    77、  scl=0;

    78、  delay_scl();

    79、  }

    80、  return k;

    81、  }

    82、  void i2cwrite_add(unsigned char data address,unsigned char data dat) //寫數據,1個字節地址位,1個字節數據

    83、  {

    84、  i2c_start();

    85、  i2cwrite_byte(0xEE); // 16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"0"表示向設備寫入。

    86、  i2c_response();

    87、  i2cwrite_byte(address); //寫地址

    88、  i2c_response();

    89、  i2cwrite_byte(dat); //寫數據

    90、  i2c_response();

    91、  i2c_stop();

    92、  delay(100); //收到stop命令后,需twr時間來寫數據,此期間不接收任何信息

    93、  }

    94、  unsigned char I2Cread_add(unsigned char data address) //讀數據,1個字節地址位,函數返回數據值

    95、  {

    96、  unsigned char xdata dat;

    97、  i2c_start();

    98、  i2cwrite_byte(0xEE); //16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"0"表示向設備寫入。

    99、  i2c_response();

    100、  i2cwrite_byte(address); //向設備寫入需要查找的地址(移動設備內指針)

    101、  i2c_response();

    102、  i2c_start(); //刷新,再次查找設備

    103、  i2cwrite_byte(0xEF); // 16進制Oxa0轉成8bit二進制數:前7位是設備號,末位"1"表示從設備讀取。

    104、  i2c_response();

    105、  dat=i2cread_byte(); //讀取數據

    106、  i2c_stop(); //讀完后主機返回"非應答"(高電平),并直接發出終止信號

    107、  delay(10);

    108、  return dat;

    109、  }

    本文到此講解完畢了,希望對大家有幫助。

  • 成人app