ZDBMS/output/TWI.lst

488 lines
24 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE TWI
OBJECT MODULE PLACED IN .\output\TWI.obj
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\TWI.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Load.OR
-C) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\code_c
-lassb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\TWI.lst) OBJECT(.\output\TWI.obj)
line level source
1 /********************************************************************************
2 Copyright (C), Sinowealth Electronic. Ltd.
3 Author: Sino
4 Version: V0.0
5 Date: 2020/04/26
6 History:
7 V2.0 2020/04/26 Preliminary
8 ********************************************************************************/
9 #include "Main.h"
10
11 #ifdef TWI_Hardware_Module
12
13 U8 code CRC8Table[256]=
14 { //120424-1 CRC Table
15 0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
16 0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
17 0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
18 0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
19 0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
20 0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
21 0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
22 0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
23 0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
24 0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
25 0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
26 0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
27 0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
28 0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
29 0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
30 0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3
31 };
32 /*************************************************************************************************
33 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: CRC8cal
34 * <20><> <20><>: *p<><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룻counter<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
35 * <20><><EFBFBD><EFBFBD>ֵ: <20><>
36 * <20><> <20><>: CRC8<43><38>ɢ
37 *************************************************************************************************/
38 U8 CRC8cal(U8 *p, U8 counter) //look-up table calculte CRC
39 {
40 1 U8 crc8 = 0;
41 1
42 1 for( ; counter > 0; counter--)
43 1 {
44 2 crc8 = CRC8Table[crc8^*p];
45 2 p++;
46 2 }
47 1 return(crc8);
48 1 }
49
50
51
52
53 /*************************************************************************************************
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 2
54 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: TWICheckStatus
55 * <20><> <20><>: Status<75><73><EFBFBD><EFBFBD>ǰTWI<57><49>״̬
56 * <20><><EFBFBD><EFBFBD>ֵ: <20><>
57 * <20><> <20><>: <20><><EFBFBD><EFBFBD>TWI<57>ĸ<EFBFBD><C4B8><EFBFBD>״̬<D7B4>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
58 *************************************************************************************************/
59 BOOL TWICheckStatus(U8 Status)
60 {
61 1 BOOL Result = 1;
62 1 U16 timeoutcount = 48000; //Ӳ<><D3B2>IICʱtimeoutcount<6E><74><EFBFBD><EFBFBD>100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IIC<49><43><EFBFBD><EFBFBD><E9B1A3>ԭֵ <20><><EFBFBD><EFBFBD>׼DEMO<4D><4F>
-<2D><>
63 1
64 1 while((TWICON&0x08)==0) //<2F>ȴ<EFBFBD>TWIͨѶ<CDA8><D1B6><EFBFBD><EFBFBD>
65 1 {
66 2 McuWDTClear(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
67 2 if(timeoutcount)
68 2 {
69 3 timeoutcount--;
70 3 }
71 2 else
72 2 {
73 3 break;
74 3 }
75 2 }
76 1 if((TWISTA&0xf8) != Status)
77 1 {
78 2 Result = 0; //Error
79 2 }
80 1
81 1 return Result;
82 1 }
83
84
85
86
87 /*************************************************************************************************
88 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: TwiWrite
89 * <20><> <20><>: SlaveID: Slave ID
90 WrAddr: д<><D0B4><EFBFBD><EFBFBD>ַ
91 AddrType<70><65><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȣ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1Byte<74><65>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2Bytes
92 Length<74><68> <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>CRC<52>ֽڣ<D6BD>
93 CrcFlg<6C><67> TwiͨѶ<CDA8>Ƿ<EFBFBD>֧<EFBFBD><D6A7>CRCУ<43>飬0<E9A3AC><30><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>CRC<52><43>1<EFBFBD><31>֧<EFBFBD><D6A7>CRC
94 *WrBuf<75><66> д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
95 * <20><><EFBFBD><EFBFBD>ֵ: <20><>
96 * <20><> <20><>: Twiд<69><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>AFE<46><45>֧<EFBFBD><D6A7>CRC<52><43><EFBFBD><EFBFBD>RTC<54><43>EEPROM<4F><4D><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ϊ2Bytes<65><73>
97 *************************************************************************************************/
98 BOOL TwiWrite(U8 SlaveID, U16 WrAddr, U8 AddrType, U8 Length, U8 CrcFlg, U8 xdata *WrBuf)
99 {
100 1 U8 i;
101 1 U8 TempBuf[4];
102 1 BOOL Result = 1;
103 1 U16 timeoutcount = 48000;
104 1
105 1 TempBuf[0] = SlaveID;
106 1 TempBuf[1] = (U8)WrAddr;
107 1 TempBuf[2] = *WrBuf;
108 1 TempBuf[3] = CRC8cal(TempBuf, 3);
109 1
110 1 if(Length > 0)
111 1 {
112 2 HTimeoutChk();
113 2 TWICON = 0x60; //Start
114 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10)))
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 3
115 2 {
116 3 Result = 0;
117 3 goto WrErr;
118 3 }
119 2
120 2 TWIDAT = SlaveID; //Slave<76><65>ַ
121 2 TWICON = 0x40;
122 2 if(!TWICheckStatus(0x18))
123 2 {
124 3 Result = 0;
125 3 goto WrErr;
126 3 }
127 2
128 2 if(AddrType == TWI_ADDR_2B)
129 2 {
130 3 TWIDAT = (U8)(WrAddr>>8); //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD>ַ-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPROM
131 3 TWICON = 0x40;
132 3 if(!TWICheckStatus(0x28))
133 3 {
134 4 Result = 0;
135 4 goto WrErr;
136 4 }
137 3 }
138 2
139 2 TWIDAT = (U8)WrAddr; //д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
140 2 TWICON = 0x40;
141 2 if(!TWICheckStatus(0x28))
142 2 {
143 3 Result = 0;
144 3 goto WrErr;
145 3 }
146 2
147 2 if(CrcFlg == TWI_CRC_YES) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дAFE<46>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>дһ<D0B4><D2BB><EFBFBD>ֽ<EFBFBD>+CRC
148 2 {
149 3 TWIDAT = *WrBuf; //Write Data
150 3 TWICON = 0x40;
151 3 if(!TWICheckStatus(0x28))
152 3 {
153 4 Result = 0;
154 4 goto WrErr;
155 4 }
156 3
157 3 TWIDAT = TempBuf[3]; //Write CRC
158 3 TWICON = 0x40;
159 3 if(!TWICheckStatus(0x28))
160 3 {
161 4 Result = 0;
162 4 goto WrErr;
163 4 }
164 3 }
165 2 else //дEEPROM<4F><4D>RTC
166 2 {
167 3 for(i=0; i<Length; i++)
168 3 {
169 4 TWIDAT = *WrBuf;
170 4 TWICON = 0x40;
171 4 if(!TWICheckStatus(0x28))
172 4 {
173 5 Result = 0;
174 5 goto WrErr;
175 5 }
176 4 WrBuf++;
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 4
177 4 }
178 3 }
179 2 WrErr:
180 2 TWICON = 0x50;
181 2 while((TWICON&0x10)!=0)
182 2 {
183 3 McuWDTClear(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
184 3 if(timeoutcount)
185 3 {
186 4 timeoutcount--;
187 4 }
188 3 else
189 3 {
190 4 break;
191 4 }
192 3 }
193 2 }
194 1
195 1 return Result;
196 1 }
197
198
199 /*************************************************************************************************
200 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: TwiRead
201 * <20><> <20><>: SlaveID: Slave ID
202 RdAddr: <20><>ȡ<EFBFBD><C8A1>ַ
203 AddrType<70><65><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȣ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1Byte<74><65>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2Bytes
204 Length<74><68> <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>CRC<52>ֽڣ<D6BD>
205 CrcFlg<6C><67> TwiͨѶ<CDA8>Ƿ<EFBFBD>֧<EFBFBD><D6A7>CRCУ<43>飬0<E9A3AC><30><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>CRC<52><43>1<EFBFBD><31>֧<EFBFBD><D6A7>CRC
206 *RdBuf<75><66> <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>ŵ<EFBFBD>ַ
207 * <20><><EFBFBD><EFBFBD>ֵ: <20><>
208 * <20><> <20><>: Twi<77><69>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡAFE<46><45>֧<EFBFBD><D6A7>CRC<52><43><EFBFBD><EFBFBD>RTC<54><43>EEPROM<4F><4D><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ϊ2Bytes<65><73>
209 *************************************************************************************************/
210 BOOL TwiRead(U8 SlaveID, U16 RdAddr, U8 AddrType, U8 Length, U8 CrcFlg, U8 xdata *RdBuf)
211 {
212 1 BOOL Result = 1;
213 1 U8 i;
214 1 U8 xdata TempBuf[46]; //AFEһ<45><D2BB><EFBFBD>Զ<EFBFBD>ȡ2Bytes+CRC
215 1 U8 RdCrc = 0;
216 1 U16 timeoutcount = 48000;
217 1
218 1 TempBuf[0] = SlaveID; //<2F><><EFBFBD>浽TempBuf<75><66><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Ϊ<EFBFBD>˼<EFBFBD><CBBC><EFBFBD>CRC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AFE<46><45>ȡ
219 1 TempBuf[1] = (U8)RdAddr;
220 1 //TempBuf[2] = Length;
221 1 TempBuf[2] = SlaveID | 0x01;
222 1
223 1 if(Length > 0)
224 1 {
225 2 HTimeoutChk();
226 2 TWICON = 0x60; //Start
227 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10)))
228 2 {
229 3 Result = 0;
230 3 goto RdErr;
231 3 }
232 2
233 2 TWIDAT = SlaveID; //<2F><><EFBFBD><EFBFBD>Slaveд<65><D0B4>ַ
234 2 TWICON = 0x40;
235 2 if(!TWICheckStatus(0x18))
236 2 {
237 3 Result = 0;
238 3 goto RdErr;
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 5
239 3 }
240 2
241 2 if(AddrType == TWI_ADDR_2B) //<2F><>ַΪ2Bytes
242 2 {
243 3 TWIDAT = (U8)(RdAddr>>8); //<2F><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD>ַ-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPROM
244 3 TWICON = 0x40;
245 3 if(!TWICheckStatus(0x28))
246 3 {
247 4 Result = 0;
248 4 goto RdErr;
249 4 }
250 3 }
251 2
252 2 TWIDAT = (U8)RdAddr; //<2F><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD>ַ
253 2 TWICON = 0x40;
254 2 if(!TWICheckStatus(0x28))
255 2 {
256 3 Result = 0;
257 3 goto RdErr;
258 3 }
259 2
260 2 // if(SlaveID != AFE_ID)
261 2 // {
262 2 // TWIDAT = Length; //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
263 2 // TWICON = 0x40;
264 2 // if(!TWICheckStatus(0x28))
265 2 // {
266 2 // Result = 0;
267 2 // goto RdErr;
268 2 // }
269 2 // }
270 2
271 2 TWICON = 0x60; //<2F><><EFBFBD><EFBFBD>RStart
272 2 if((!TWICheckStatus(0x08))&&(!TWICheckStatus(0x10)))
273 2 {
274 3 Result = 0;
275 3 goto RdErr;
276 3 }
277 2
278 2 TWIDAT = SlaveID|0x01; //<2F><><EFBFBD><EFBFBD>Slave<76><65><EFBFBD><EFBFBD>ַ
279 2 TWICON = 0x40;
280 2 if(!TWICheckStatus(0x40))
281 2 {
282 3 Result = 0;
283 3 goto RdErr;
284 3 }
285 2
286 2 for(i=0; i<Length; i++)
287 2 {
288 3 if((CrcFlg == TWI_CRC_NO)) //<2F><>֧<EFBFBD><D6A7>CRC
289 3 {
290 4 if(i == Length-1)
291 4 {
292 5 TWICON = 0x40; //<2F><><EFBFBD><EFBFBD>NACK<43><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ζ<EFBFBD>
293 5 TWICheckStatus(0x58);
294 5 }
295 4 else
296 4 {
297 5 TWICON = 0x44; //<2F><><EFBFBD><EFBFBD>ACK<43><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
298 5 TWICheckStatus(0x50);
299 5 }
300 4 *RdBuf = TWIDAT;
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 6
301 4 RdBuf++;
302 4 }
303 3 else //֧<><D6A7>CRC<52>ģ<EFBFBD><C4A3>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>ʱBuf
304 3 {
305 4 TWICON = 0x44; //ACK
306 4 TWICheckStatus(0x50);
307 4 TempBuf[3+i] = TWIDAT;
308 4 }
309 3 }
310 2
311 2 if(CrcFlg == TWI_CRC_YES)
312 2 {
313 3 TWICON = 0x40; //No ACK
314 3 TWICheckStatus(0x58);
315 3 RdCrc = TWIDAT;
316 3 if(RdCrc == CRC8cal(TempBuf, 3+Length))
317 3 {
318 4 for(i=0; i<Length; i++)
319 4 {
320 5 *RdBuf = TempBuf[3+i];
321 5 RdBuf++;
322 5 }
323 4 }
324 3 else
325 3 {
326 4 Result = 0;
327 4 goto RdErr;
328 4 }
329 3 }
330 2 RdErr:
331 2 TWICON = 0x50; //TWI Stop
332 2 while((TWICON&0x10)!=0)
333 2 {
334 3 McuWDTClear(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
335 3 if(timeoutcount)
336 3 {
337 4 timeoutcount--;
338 4 }
339 3 else
340 3 {
341 4 break;
342 4 }
343 3 }
344 2 }
345 1
346 1 return Result;
347 1 }
348
349
350 /*************************************************************************************************
351 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: TwiInit
352 * <20><> <20><>: FreqKHz: <20><><EFBFBD><EFBFBD>TWIͨѶƵ<D1B6><C6B5>
353 * <20><><EFBFBD><EFBFBD>ֵ: <20><>
354 * <20><> <20><>: <20><>ʼ<EFBFBD><CABC>TWI<57><49>ӳ<EFBFBD><D3B3>IO<49><4F>ͨѶƵ<D1B6>ʵ<EFBFBD>
355 //*************************************************************************************************/
356 //void TwiInit(void)
357 //{
358 // TWICR = 0x32; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>SCL--P0.5<EFBFBD><EFBFBD>SDA--P0.4
359 // TWITOUT = 0x00; //<2F>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A3AC>оƬ<D0BE>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
360 // TWIBR = (24000/TWI_FREQ_KHz-16)/2/1; //<2F><><EFBFBD>÷<EFBFBD><C3B7>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>߳<EFBFBD>ʱ<EFBFBD>жϣ<D0B6>f=fsys/(16+2*CR*TWI
-BR)=24MHz/(16+2*16*TWIBR)=**KHz
361 // TWISTA = 0x06; //16<31><36>Ƶ
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 7
362 // TWICON = 0x40; //ENTWI <20><><EFBFBD><EFBFBD>ֹ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>ʱ
363 // TWTFREE = 0xff; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
364 // TWIDAT = 0x00;
365 //}
366
367 void TwiInit(void)
368 {
369 1 TWICR = 0x32; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>SCL--P0.5<EFBFBD><EFBFBD>SDA--P0.4
370 1 TWITOUT = 0x00; //<2F>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A3AC>оƬ<D0BE>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
371 1 TWISTA = 0x00;
372 1 TWIBR = (8000/TWI_FREQ_KHz-16)/2/1; //<2F><><EFBFBD>÷<EFBFBD><C3B7>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>߳<EFBFBD>ʱ<EFBFBD>жϣ<D0B6>f=fsys/(16+2*CR*TWIBR)
-=24MHz/(16+2*16*TWIBR)=**KHz
373 1 TWISTA = 0x02; //16<31><36>Ƶ
374 1 // #if ((TWI_FREQ_KHz >= 10)&&(TWI_FREQ_KHz <= 400))
375 1 // {
376 1 // #if TWIBR1 < 256
377 1 // TWIBR = TWIBR1;
378 1 // TWISTA |= 0x06;
379 1 // #elif TWIBR2 < 256
380 1 // TWIBR = TWIBR2;
381 1 // TWISTA |= 0x04;
382 1 // #elif TWIBR3 < 256
383 1 // TWIBR = TWIBR3;
384 1 // TWISTA |= 0x02;
385 1 // #elif TWIBR4 < 256
386 1 // TWIBR = TWIBR4;
387 1 // TWISTA |= 0x00;
388 1 // #endif
389 1 // }
390 1 // #else
391 1 // {
392 1 // #error: "Please enter a number(TWI_FREQ_KHz) from 10 to 400!";
393 1 // }
394 1 //
395 1 // #endif
396 1
397 1 TWICON = 0x40; //ENTWI <20><><EFBFBD><EFBFBD>ֹ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>ʱ
398 1 TWTFREE = 0xff; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
399 1 TWIDAT = 0x00;
400 1 }
401
402
403 //void TwiInit(void)
404 //{
405 // U16 i,k;
406 // U8 j;
407 // TWICR = 0x32; //Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>SCL--P0.5<EFBFBD><EFBFBD>SDA--P0.4
408 // TWITOUT = 0x00; //<2F>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A3AC>оƬ<D0BE>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
409 // i = (24000/TWI_FREQ_KHz-16)/2; //<2F><><EFBFBD>÷<EFBFBD><C3B7>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>߳<EFBFBD>ʱ<EFBFBD>жϣ<D0B6>f=fsys/(16+2*CR*TWIBR)=24
-MHz/(16+2*16*TWIBR)=**KHz
410 // for(j=1;j<4;j++)
411 // {
412 // k =1<<(2*j-2);
413 // if(i / k <= 255)
414 // {
415 // TWIBR = i / k;
416 // switch (j)
417 // {
418 // case 1:
419 // TWISTA = 0x00;
420 // break;
421 //
C51 COMPILER V9.01 TWI 02/11/2025 15:43:04 PAGE 8
422 // case 2:
423 // TWISTA = 0x02;
424 // break;
425 //
426 // case 3:
427 // TWISTA = 0x04;
428 // break;
429 //
430 // case 4:
431 // TWISTA = 0x06;
432 // break;
433 // }
434 // goto loop;
435 // }
436 // }
437 //loop:
438 //// TWISTA = 0x06; //16<31><36>Ƶ
439 // TWICON = 0x40; //ENTWI <20><><EFBFBD><EFBFBD>ֹ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>ʱ
440 // TWTFREE = 0xff; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
441 // TWIDAT = 0x00;
442 //}
443
444 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 858 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- 72
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)