您現在的位置是:首頁 >生活 > 2023-12-17 08:54:14 來源:
I2C協議時序圖(i2c協議)
大家好,我是小夏,我來為大家解答以上問題。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、 }
本文到此講解完畢了,希望對大家有幫助。