?? i2c.lst
字號:
C51 COMPILER V7.09 I2C 10/14/2004 15:45:56 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*****************************************************************/
2 /**Objective:IIC Module **/
3 /*****************************************************************/
4 /**Auther :Seal Luo **/
5 /**Date :2004-04-06 **/
6 /**CopyRight:C*Core 2004 **/
7 /*****************************************************************/
8 #include "IICReg.h"
9
10 extern void Delayms(uint16 uiTime);
11
12 /*--
13 Function:Generate a start signal on I2C bus
14 Input:Mode 0:slave 1:master
15 return void
16 --*/
17 void I2C_Start(UCHAR8 ucMode,UCHAR8 ucFistAddr)
18 {
19 1 UCHAR8 ucReg;
20 1
21 1 /* Slave mode */
22 1 if(ucMode == SLAVE_MODE)
23 1 {
24 2 /* enable control */
25 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
26 2 ucReg |=0x01;
27 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
28 2 Delayms(10);
29 2
30 2 /* enable interrupt */
31 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
32 2 ucReg |=0x02;
33 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
34 2
35 2 }
36 1
37 1 /*Master Mode */
38 1 if(ucMode == MASTER_MODE)
39 1 {
40 2
41 2 /* enable control */
42 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
43 2
44 2 ucReg |=0x01;
45 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
46 2
47 2 Delayms(10);
48 2 /* enable interrupt */
49 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
50 2
51 2 ucReg |=0x02;
52 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
53 2
54 2
55 2 /* config I2CSA */
C51 COMPILER V7.09 I2C 10/14/2004 15:45:56 PAGE 2
56 2 ucReg = SLAVE_ADDRESS;
57 2 write_port_byte( I2C_BASE_ADDRESS + I2C_SLAVE_ADDRESS_REG , ucReg);
58 2
59 2 /*config I2CCP */
60 2 ucReg = CLOCK_PRESCALER;
61 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CLOCK_PRESCALAR_REG , ucReg);
62 2 /* write slave address */
63 2 ucReg = ucFistAddr;
64 2
65 2 write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucReg);
66 2
67 2 /* check bus whether IDLE */
68 2
69 2 do
70 2 {
71 3 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
72 3
73 3 }while((ucReg>>3)==1);
74 2
75 2 /* change MSMODE 1 to 0 */
76 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
77 2
78 2 ucReg |= 0x04;
79 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
80 2
81 2 }
82 1
83 1 }
84
85
86 /*--
87 Function:I2C Check ACK
88 Input: void
89 Return:1->no receive ACK 2->receive ACK 4->receive AACK
90
91 --*/
92 UCHAR8 I2C_Check_ACK(void)
93 {
94 1 UCHAR8 bRet = 0x01;
95 1 UCHAR8 ucReg;
96 1 /* read status register */
97 1 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
98 1
99 1 if((ucReg & 0x01)==0x01)
100 1 {
101 2 bRet <<=1;
102 2 }
103 1 if((ucReg & 0x02)==0x02)
104 1 {
105 2 bRet <<=2;
106 2 }
107 1
108 1 return bRet;
109 1
110 1 }
111
112
113 /*--
114 Function:I2C generate a stop signal
115 Input: void
116 Return:void
117
C51 COMPILER V7.09 I2C 10/14/2004 15:45:56 PAGE 3
118 --*/
119 void I2C_Stop(void)
120 {
121 1 UCHAR8 ucReg;
122 1 /* change MSMODE 1 to 0 */
123 1 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
124 1 ucReg &= 0xfb;
125 1 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
126 1
127 1
128 1 }
129
130
131
132 /*--
133 Function:I2C write data to slave
134 Input:
135
136 --*/
137 void I2C_Write(UCHAR8 ucFistAddr,UCHAR8 ucData[],uint16 uiLength)
138 {
139 1 UCHAR8 ucReg;
140 1 uint16 i;
141 1 ucFistAddr &= 0xfe;
142 1 /* send start signal */
143 1 I2C_Start(MASTER_MODE,ucFistAddr);
144 1
145 1 do
146 1 {
147 2 /* read status register */
148 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
149 2 if((ucReg & I2C_AACK)!=0 )
150 2 goto Exit;
151 2
152 2 }while((ucReg & I2C_TF) != I2C_TF);
153 1
154 1
155 1 /* check whether receive ack */
156 1 for(i=0;i<uiLength;i++)
157 1 {
158 2
159 2 write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucData[i]);
160 2 do
161 2 {
162 3 /* read status register */
163 3 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
164 3 if((ucReg & I2C_AACK)!=0 )
165 3 goto Exit;
166 3
167 3 }while((ucReg & I2C_TF) != I2C_TF);
168 2 }
169 1
170 1 Exit:
171 1 /* send stop signal */
172 1 I2C_Stop();
173 1
174 1
175 1 }
176
177
178 /*--
179 Function:I2C read data from slave
C51 COMPILER V7.09 I2C 10/14/2004 15:45:56 PAGE 4
180 Input:
181
182 --*/
183 void I2C_Read(UCHAR8 ucFistAddr,UCHAR8 ucLength)
184 {
185 1 UCHAR8 ucReg,tmp;
186 1 uint16 i;
187 1
188 1 ucFistAddr |= 0x01;
189 1 /* send start signal */
190 1 I2C_Start(MASTER_MODE,ucFistAddr);
191 1
192 1 do
193 1 {
194 2 /* read status register */
195 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
196 2 if((ucReg & I2C_AACK)!=0 )
197 2 goto Exit;
198 2
199 2 }while((ucReg & I2C_RC)!=I2C_RC );
200 1
201 1 /* read control register */
202 1 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
203 1
204 1 if(ucLength>1)
205 1 ucReg |= 0x08;
206 1 else
207 1 {
208 2 ucReg &= 0xf7;
209 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
210 2 do
211 2 {
212 3 /* read status register */
213 3 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
214 3
215 3 }while((ucReg & I2C_TF)!= I2C_TF);
216 2
217 2 // pI2cBuf[0] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
218 2 tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
219 2 write_port_byte(PMC_DATA_REG,tmp);
220 2 goto Exit;
221 2 }
222 1 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
223 1 /* check whether receive ack */
224 1 for(i=0;i<ucLength;i++)
225 1 {
226 2
227 2 do
228 2 {
229 3 /* read status register */
230 3 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
231 3
232 3
233 3 }while((ucReg & I2C_TF)!= I2C_TF);
234 2
235 2 /*read data form bus when tf = 1 */
236 2 // pI2cBuf[i] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
237 2 tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
238 2 write_port_byte(PMC_DATA_REG,tmp);//Write data into PMC port
239 2
240 2 /* read status register */
241 2 ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
C51 COMPILER V7.09 I2C 10/14/2004 15:45:56 PAGE 5
242 2
243 2 if(i== ucLength -1)
244 2 goto Exit;
245 2 if(i == (ucLength - 2))
246 2 ucReg &= 0xf7;
247 2 else
248 2 ucReg |= 0x08;
249 2 write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
250 2
251 2
252 2 }
253 1
254 1 Exit:
255 1 /* send stop signal */
256 1 I2C_Stop();
257 1 }
258
259
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 392 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -