大家好,我是小科,我来为大家解答以上问题。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、 }
本文到此讲解完毕了,希望对大家有帮助。