您现在的位置是:首页 >生活 > 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、  }

本文到此讲解完毕了,希望对大家有帮助。