📄 twowire.lst
字号:
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TWOWIRE
OBJECT MODULE PLACED IN F:\T100_C~1\HUI_CH~1\铁将军\SIMULA~2\TWOWIRE.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\T100_C~1\HUI_CH~1\铁将军\SIMULA~2\TWOWIRE.C DB SB OE
stmt level source
1 //---------------------------------------------------------------------------
2 // Terawins Inc. Company Confidential Strictly Private
3 //
4 // $Archive: $
5 // $Revision: 1.9 $
6 // $Author: jwang $
7 // $Date: 2002/07/08 22:34:39 $
8 //
9 // --------------------------------------------------------------------------
10 // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
11 // --------------------------------------------------------------------------
12 // Copyright 2002 (c) Terawins Inc.
13 // --------------------------------------------------------------------------
14
15 #include "reg51.h"
16 #include <intrins.h>
17 #include "common.h"
18 #include "System.h"
19 #include "TW101Reg.h"
20 #include "TwoWire.h"
21 #include "Tuner.h"
22 #define TW_SLOW_SPEED
23 //----------------------------------------
24 // S_Condition for TWD protocol
25 //----------------------------------------
26 #if defined(TW_SLOW_SPEED)
27 void StartCondition(void)
28 {
29 1 uCHAR ix;
30 1 uCHAR cTWtrytime=0;
31 1 EA=0;
32 1 while(++cTWtrytime)
33 1 {
34 2 Set_SDA_High;
35 2 Set_SCL_High; /* make sure two line is release */
36 2 for(ix = 0; ix < TWD_LONG_TIME; ix++)
37 2 { }; /* Delay 12us */
38 2
39 2 Set_SDA_Low;
40 2 for(ix = 0; ix < TWD_LONG_TIME; ix++)
41 2 { }; /* Delay 12us */
42 2
43 2 if((SCL_High)&&(SDA_Low))
44 2 break;
45 2 }
46 1
47 1 for(ix = 0; ix < TWD_SHORT_TIME; ix++)
48 1 { }; /* Delay 12us */
49 1 }
50
51 //----------------------------------------
52 // P_Condition for TWD protocol
53 //----------------------------------------
54 void StopCondition(void)
55 {
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 2
56 1 uCHAR ix;
57 1 uCHAR cTWtrytime=0;
58 1
59 1 Set_SDA_Low;
60 1 Set_SCL_High;
61 1 for(ix = 0; ix < TWD_SHORT_TIME; ix++)
62 1 { }; /* delay 12us */
63 1
64 1 while(SCL_Low && ++cTWtrytime)
65 1 { };
66 1
67 1 for(ix = 0; ix < TWD_SHORT_TIME; ix++)
68 1 { }; /* delay 12us */
69 1
70 1 Set_SDA_High;
71 1 for(ix = 0; ix < TWD_SHORT_TIME; ix++)
72 1 { }; /* delay 12us */
73 1 EA=1;
74 1 }
75
76 //--------------------------------------------------
77 // Send_Byte
78 // Send a byte to master with a acknowledge bit
79 //--------------------------------------------------
80 uCHAR Send_Byte(uCHAR cData)
81 {
82 1 uCHAR ix, j, cAcknowledge;
83 1 uCHAR cTWtrytime=0;
84 1
85 1 cAcknowledge = 0;
86 1
87 1 for(ix = 0; ix < 8; ix++)
88 1 {
89 2 Set_SCL_Low;
90 2 for(j = 0; j < TWD_SHORT_TIME; j++)
91 2 { };
92 2
93 2 if(cData&0x80)Set_SDA_High;
94 2 else Set_SDA_Low;
95 2 cData<<=1;
96 2
97 2 for(j = 0; j < TWD_SHORT_TIME; j++)
98 2 { };
99 2
100 2 Set_SCL_High;
101 2 while(SCL_Low && ++cTWtrytime)
102 2 { };
103 2
104 2 for(j = 0; j < TWD_SHORT_TIME; j++)
105 2 { };
106 2 }
107 1 for(j = 0; j < TWD_SHORT_TIME; j++)
108 1 { };
109 1
110 1 Set_SCL_Low;
111 1 for(j = 0; j < TWD_SHORT_TIME; j++)
112 1 { };
113 1
114 1 Set_SDA_High; /* release data line for acknowledge */
115 1 for(j = 0; j < TWD_SHORT_TIME; j++)
116 1 { };
117 1
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 3
118 1 Set_SCL_High; /* Send a clock for Acknowledge */
119 1 while(SCL_Low)
120 1 { };
121 1 for(j = 0; j < TWD_SHORT_TIME; j++)
122 1 { };
123 1
124 1 if(SDA_High) cAcknowledge = 1; /* No Acknowledge */
125 1 Set_SCL_Low; /* Finish Acknoledge */
126 1 for(j = 0; j < TWD_SHORT_TIME; j++)
127 1 { };
128 1
129 1 return(cAcknowledge);
130 1 }
131
132 //--------------------------------------------------
133 // Read_Byte
134 // Read a byte from master with a acknowledge bit
135 //--------------------------------------------------
136 uCHAR Read_Byte(uCHAR cNum)
137 {
138 1 uCHAR ix, j;
139 1 uCHAR cRetval=0;
140 1
141 1 for(ix=0;ix<8;ix++){
142 2 Set_SCL_High;
143 2 while(SCL_Low){};
144 2 for(j=0;j<TWD_SHORT_TIME;j++){};
145 2 cRetval = (SDA_High)? (cRetval|(1<<(7-ix))):cRetval ; /* MSB First */
146 2 Set_SCL_Low;
147 2 }
148 1
149 1 if(cNum==1)
150 1 Set_SDA_High;
151 1 else
152 1 Set_SDA_Low;
153 1 //SDA = (cNum==1) 1:0;
154 1 Set_SCL_High;
155 1 while(SCL_Low){};
156 1 for(j = 0; j < TWD_SHORT_TIME; j++)
157 1 { };
158 1
159 1 Set_SCL_Low;
160 1
161 1 Set_SDA_High;
162 1 for(j = 0; j < TWD_SHORT_TIME; j++)
163 1 { };
164 1
165 1 return cRetval;
166 1 }
167
168 #else
// for fast Two Wire Bus Speed
void StartCondition(void)
{
// uCHAR ix;
uCHAR cTWtrytime=0;
while(++cTWtrytime)
{
Set_SDA_High;
Set_SCL_High; /* make sure two line is release */
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 4
Set_SDA_Low;
if((SCL_High)&&(SDA_Low))
break;
}
}
//----------------------------------------
// P_Condition for TWD protocol
//----------------------------------------
void StopCondition(void)
{
// uCHAR ix;
uCHAR cTWtrytime=0;
Set_SDA_Low;
Set_SCL_High;
Set_SDA_High;
}
//--------------------------------------------------
// Send_Byte
// Send a byte to master with a acknowledge bit
//--------------------------------------------------
uCHAR Send_Byte(uCHAR cData)
{
uCHAR ix;
uCHAR cAcknowledge;
uCHAR cTWtrytime=0;
cAcknowledge = 0;
for(ix = 0; ix < 8; ix++)
{
Set_SCL_Low;
// (cData&(1<<(7-ix)))?(Set_SDA_High):(Set_SDA_Low); /* MSB First */
if(cData&0x80)Set_SDA_High;
else Set_SDA_Low;
cData<<=1;
Set_SCL_High;
}
Set_SCL_Low;
Set_SDA_High; /* release data line for acknowledge */
Set_SCL_High; /* Send a clock for Acknowledge */
if(SDA_High) cAcknowledge = 1; /* No Acknowledge */
Set_SCL_Low; /* Finish Acknoledge */
return(cAcknowledge);
}
//--------------------------------------------------
// Read_Byte
// Read a byte from master with a acknowledge bit
//--------------------------------------------------
uCHAR Read_Byte(void)
{
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 5
uCHAR ix, j;
uCHAR cRetval;
uCHAR cTWtrytime=0;
// cRetval = 0;
Set_SDA_High;
for(ix = 0; ix < 8; ix++)
{
Set_SCL_Low;
for(j = 0; j < TWD_SHORT_TIME; j++)
{ };
Set_SCL_High;
while(SCL_Low)
{ };
for(j = 0; j < TWD_SHORT_TIME; j++)
{ };
cRetval<<=1;
if(SDA_High) cRetval++;
}
for(j = 0; j < TWD_SHORT_TIME; j++)
{ };
Set_SCL_Low;
for(j = 0; j < TWD_SHORT_TIME; j++)
{ };
return cRetval;
}
#endif
278
279 //--------------------------------------------------
280 // Write Byte to Device
281 //--------------------------------------------------
282
283 //--------------------------------------------------
284 // Read Byte to Device
285 //--------------------------------------------------
286 uCHAR I2CReadByte(uCHAR cDevAddr, uCHAR cReg)
287 {
288 1 uCHAR cResult = 0;
289 1
290 1
291 1 /* write reg offset */
292 1 StartCondition();
293 1 if(Send_Byte(cDevAddr))
294 1 return 0; // Write address
295 1 if(Send_Byte(cReg))
296 1 return 0;
297 1
298 1 /* read data */
299 1 StartCondition();
300 1 if (Send_Byte(cDevAddr | 0x01)) // Read address
301 1 return 0;
302 1 cResult = Read_Byte(1);
303 1
C51 COMPILER V7.06 TWOWIRE 06/16/2005 10:05:38 PAGE 6
304 1 StopCondition();
305 1 return cResult;
306 1 }
307
308
309 uCHAR I2CWriteByte(uCHAR cDevAddr, uCHAR cReg, uCHAR cData)
310 {
311 1
312 1
313 1 /* start condition */
314 1 StartCondition();
315 1 cDevAddr &= 0xFE; // Force WRITE address
316 1 /* send device ID and write data */
317 1 if(!Send_Byte(cDevAddr))
318 1 {
319 2 if(!Send_Byte(cReg))
320 2 {
321 3 if(!Send_Byte(cData))
322 3 {
323 4 StopCondition();
324 4 return(0); /* success */
325 4 }
326 3 }
327 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -