📄 i2c_control.lst
字号:
C51 COMPILER V7.07 I2C_CONTROL 09/26/2006 08:56:41 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE I2C_CONTROL
OBJECT MODULE PLACED IN i2c_control.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c_control.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************
2
3 COPYRIGHT (C) Himax Technologies, Inc.
4
5 File name : i2c_control.c
6
7 Description : Implement i2c relative control function
8
9 Author : Taylor
10
11 Create date :
12
13 Modifications :
14
15 *********************************************************************/
16
17 #define _I2C_CONTROL_C
18
19 /********************** Include Section *****************************/
20
21 #include "i2c_control.h"
22
23 /**************** Function Implement Section ************************/
24
25 /* ================================================================
26 Name : Init_I2C
27 Purpose : Initial I2C Bus
28 Passed : None
29 Notes : None
30 ================================================================ */
31
32 void Init_I2C(void)
33 {
34 1 ioI2cScl = 1;
35 1 ioI2cSda = 1;
36 1
37 1 }
38
39 /* ================================================================
40 Name : Start
41 Purpose : Start I2C Bus Protocol
42 Passed : None
43 Notes : None
44 ================================================================ */
45
46 void Start(void)
47 {
48 1 ioI2cSda = BIT1;
49 1 _nop_();
50 1 ioI2cScl = BIT1;
51 1 _nop_();
52 1 ioI2cSda = BIT0;
53 1 _nop_();
54 1 ioI2cScl = BIT0;
55 1 }
C51 COMPILER V7.07 I2C_CONTROL 09/26/2006 08:56:41 PAGE 2
56
57
58 /* ================================================================
59 Name : Stop
60 Purpose : Stop I2C Bus Protocol
61 Passed : None
62 Notes : None
63 ================================================================ */
64
65 void Stop(void)
66 {
67 1 ioI2cSda = BIT0;
68 1 _nop_();
69 1 ioI2cScl = BIT1;
70 1 _nop_();
71 1 ioI2cSda = BIT1;
72 1 _nop_();
73 1 }
74
75
76 /* ================================================================
77 Name : Write
78 Purpose : I2C Write one byte
79 Passed : One Byte Data or Command
80 Notes : Compare with other code, it's size is smallest !!
81 Compare Time at 0910
82 ================================================================ */
83
84 Bool Write(Byte byData)
85 {
86 1 Byte byBitPos;
87 1 Bool bAck;
88 1
89 1 byBitPos = 0x80;
90 1 while(byBitPos)
91 1 {
92 2 ioI2cScl = BIT0;
93 2 _nop_();
94 2 ioI2cSda = (byData & byBitPos) ? BIT1 : BIT0;
95 2 _nop_();
96 2 _nop_();
97 2 _nop_();
98 2 _nop_();
99 2 _nop_();
100 2 _nop_();
101 2 _nop_();
102 2 _nop_();
103 2 ioI2cScl = BIT1;
104 2 _nop_();
105 2 ioI2cScl = BIT0;
106 2 byBitPos >>= 1;
107 2 _nop_();
108 2 }
109 1 ioI2cSda = BIT1;
110 1 _nop_();
111 1 ioI2cScl = BIT1;
112 1 bAck = (ioI2cSda == BIT0) ? BIT1 :BIT0;
113 1 ioI2cScl = BIT0;
114 1 _nop_();
115 1 ioI2cSda = BIT0;
116 1 return bAck;
117 1 }
C51 COMPILER V7.07 I2C_CONTROL 09/26/2006 08:56:41 PAGE 3
118
119 /* ================================================================
120 Name : Read
121 Purpose : I2C Read One Byte
122 Passed : None
123 Notes :
124 ================================================================ */
125
126 Byte Read(void)
127 {
128 1 Byte byBitPos = 0x80;
129 1 Byte c = 0;
130 1
131 1 ioI2cSda = BIT1;
132 1 while(byBitPos)
133 1 {
134 2 ioI2cScl = BIT1;
135 2 while(ioI2cScl == BIT0);
136 2 _nop_();
137 2 if(ioI2cSda) c |= byBitPos;
138 2 ioI2cScl = BIT0;
139 2 _nop_();
140 2 byBitPos >>= 1;
141 2 }
142 1 ioI2cSda=BIT1;
143 1 _nop_();
144 1 ioI2cScl=BIT1;
145 1 _nop_();
146 1 ioI2cScl=BIT0;
147 1 _nop_();
148 1 return c;
149 1 }
150
151 /* ================================================================
152 Name : I2CWriteByte
153 Purpose : Write i2c device one byte
154 Passed : Pass I2C Device Address, subaddr & wanted-write data
155 Notes :
156 ================================================================ */
157
158 Bool I2CWriteByte(Byte device, Byte subadr0, Byte c)
159 {
160 1 Bool iAck;
161 1 Again:
162 1 Start();
163 1 iAck = Write(device | I2C_W);
164 1 if(iAck) // Iack == 1 means ack
165 1 {
166 2 iAck = Write(subadr0);
167 2 if(iAck)
168 2 {
169 3 iAck = Write(c);
170 3 }
171 2 else
172 2 goto Again;
173 2 }
174 1 else
175 1 goto Again;
176 1 Stop();
177 1 return iAck;
178 1 }
179
C51 COMPILER V7.07 I2C_CONTROL 09/26/2006 08:56:41 PAGE 4
180 /* ================================================================
181 Name : I2CWrite2Byte
182 Purpose : Write i2c Device 2 bytes command
183 Passed : Pass I2C Device Address, subaddr & wanted-write 2data
184 Notes :
185 ================================================================ */
186
187 Bool I2CWrite2Byte(Byte device, Byte subadr0, Byte c1, Byte c2)
188 {
189 1 Bool iAck;
190 1 Start();
191 1 iAck = Write(device | I2C_W);
192 1 if(iAck)
193 1 {
194 2 iAck = Write(subadr0);
195 2 if(iAck)
196 2 {
197 3 iAck = Write(c1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -