📄 i2c.lst
字号:
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\output\i2c.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\output\i2c.
-lst) OBJECT(.\output\i2c.obj)
stmt level source
1 /*
2 **********************************************************************************************
3 * Project: T8Lib
4 * File: i2c.c
5 * Contents:
6 * The i2c module c file
7 * use GPIO to control SDA and SCL, communicate with T8
8 * $Date: 10/13/05 Michal T8R01LIB v0.1 initial
9 * $Date: 11/29/05 Michal T8R01LIB v0.2 test finish both 51 and MCF5249
10 * $Date: 11/30/05 Michal T8R01LIB v0.3 make lib OK on MCF5249
11 * $Date: 12/01/05 Michal T8R01LIB v0.4 Add HW_IIC ,HW_SPI macro
12 * $Date: 12/02/05 Michal T8R01LIB v0.5 Add function below
13 * static void DoXX(BYTE* out ,BYTE* in,BYTE len,BOOL mode)
14 * static BOOL DoComunication(BYTE* array, BYTE len,BOOL mode)
15 *
16
17 *
18 * Moidfy some *Cmd Fuction and Reply() function
19 * $Date: 12/05/05 Michal T8R02LIB v0.1 Add errcode1 to identify T8 off i2c bus state
20 * $Date: 12/29/05 Michal T8R02LIB v0.2
21 Modify InitezT8(BOOL mode ) to BOOL InitezT8Lib(BOOL ComMod,BYTE I2cSlvAdr,BOOL I2cIsHigh,B
-YTE SpiCLkMod,WORD SpiRate,BYTE *key);
22 void I2c_Init( ); void I2c_Sel( BYTE SlvAdr, BOOL isHigh) to void I2c_Init(BYTE
- SlvAdr, BOOL isHigh);
23 void Spi_Init();BOOL Spi_ClkSel(BYTE mode, WORD rate); To void Spi_Init(BYTE m
-ode, WORD rate);
24 Delete void SpiClkSelOpr(BYTE mode, WORD rate) ;
25 void I2c_Sel( BYTE SlvAdr, BOOL isHigh);
26 void SetXXKey(BYTE* key);
27 * $Date: 12/29/05 Michal T8R02LIB v0.5 test communiction at 400khz speed is OK
28 * Copyright (c) 2005 Fameg, Inc. All rights reserved
29 ***********************************************************************************************
30 */
31
32 #include "ezT8.h"
33 #include "I2c.h"
34
35
36 #if SW_IIC
37
38
39 static BOOL iHighMode;
40 BYTE BusSlvAdr=0xEA; //default I2c bus slave address for communiction
41
42 static void Stop_I2c();
43 static void Ack_I2c(BOOL a);
44 static BYTE I2cRcvByte();
45
46
47 //Pin operation
48 #if 1
49 void WritePinSCL(){SCL=1; }
50
51 void ClearPinSCL(){SCL=0;}
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 2
52
53 void setSDAin(){}
54 void setSDAout(){}
55
56 void WritePinSDA(){SDA=1;}
57 void ClearPinSDA(){SDA=0;}
58
59 BOOL ReadPinSDA(){return(SDA);}
60 void InitReadAck(){SDA=1;}
61 //Delay
62 void Delay_0_5us(unsigned char cnt)
63 {
64 1 // unsigned char ct=1;
65 1 while(cnt--)
66 1 {
67 2 // while(ct--);
68 2 // asm("nop");
69 2 // ct=1;
70 2 }
71 1 }
72
73 #else
#define WritePinSCL() SCL=1
#define ClearPinSCL() SCL=0
#define setSDAin() /##/
#define setSDAout()/##/
#define WritePinSDA() SDA=1
#define ClearPinSDA() SDA=0
#define ReadPinSDA() SDA
#define InitReadAck() SDA
//Delay
BYTE delay;
// #define Delay_0_5us(cnt) //{/*delay =cnt ;while(delay--);*/} /##/
void Delay_0_5us(unsigned char cnt)
{
// unsigned char ct=1;
// while(cnt--)
// {
// while(ct--);
// asm("nop");
// ct=1;
// }
}
#endif
102
103 void I2c_Init(BYTE SlvAdr,BOOL isHigh)
104 {
105 1 /* SDA */
106 1 iHighMode=isHigh;
107 1 BusSlvAdr=SlvAdr;
108 1 Stop_I2c();
109 1 }
110
111
112 /*void I2c_Sel( BYTE SlvAdr,BOOL isHigh)
113 {
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 3
114 iHighMode=isHigh;
115 BusSlvAdr=SlvAdr;
116 }*/
117
118 /*******************************************************************
119 起动总线函数
120 函数原型: void Start_I2c();
121 功能: 启动I2C总线,即发送I2C起始条件.
122
123 ********************************************************************/
124 void Start_I2c()
125 {
126 1 setSDAout();
127 1 WritePinSDA();
128 1 Delay_0_5us(10) ; /*发送结束条件的时钟信号*/
129 1 WritePinSCL();
130 1 Delay_0_5us(10); /*起始条件建立时间大于4.7us,延时*/
131 1
132 1 ClearPinSDA(); /*发送起始信号*/
133 1 Delay_0_5us(10); /* 起始条件锁定时间大于4μs*/
134 1
135 1 ClearPinSCL(); /*钳住I2C总线,准备发送或接收数据 */
136 1 // Delay_0_5us(2);
137 1 }
138
139
140 /*******************************************************************
141 结束总线函数
142 函数原型: void Stop_I2c();
143 功能: 结束I2C总线,即发送I2C结束条件.
144
145 ********************************************************************/
146 static void Stop_I2c()
147 {
148 1 setSDAout();
149 1 ClearPinSDA(); /*发送结束条件的数据信号*/
150 1 Delay_0_5us(10) ; /*发送结束条件的时钟信号*/
151 1 WritePinSCL(); /*结束条件建立时间大于4μs*/
152 1 Delay_0_5us(10);
153 1 WritePinSDA(); /*发送I2C总线结束信号*/
154 1 Delay_0_5us(10);
155 1 }
156
157
158
159
160 /*******************************************************************
161 字节数据传送函数
162 函数原型: void I2cSendByte(BYTE c);
163 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
164 此状态位进行操作.(不应答或非应答都使ack=0 假)
165 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
166 ********************************************************************/
167 BOOL I2cSendByte(BYTE c)
168 {
169 1 BYTE BitCnt;
170 1 BOOL t,ack;
171 1
172 1 setSDAout();
173 1 for(BitCnt=0x80;BitCnt!=0;BitCnt=BitCnt>>1) /*要传送的数据长度为8位*/
174 1 {
175 2
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 4
176 2 if(iHighMode==true)
177 2 Delay_0_5us(1);
178 2 else
179 2 Delay_0_5us(4);
180 2
181 2 if(c&BitCnt)
182 2 {
183 3 // t=SDA;
184 3 WritePinSDA(); /*判断发送位*/
185 3 }
186 2 else
187 2 ClearPinSDA();
188 2
189 2 if(iHighMode)
190 2 Delay_0_5us(1);
191 2 else
192 2 Delay_0_5us(4);
193 2
194 2
195 2 // t=SCL;
196 2 WritePinSCL();/*置时钟线为高,通知被控器开始接收数据位*/
197 2
198 2 if(iHighMode) /*保证时钟高电平周期大于4μs*/
199 2 {
200 3 Delay_0_5us(1);
201 3 Delay_0_5us(1);
202 3 }
203 2 else
204 2 {
205 3 Delay_0_5us(4);
206 3 Delay_0_5us(4);
207 3 }
208 2 ClearPinSCL();
209 2 // InitReadAck(); //11.22 add
210 2 } //9 clocks
211 1
212 1
213 1 /* if(iHighMode)
214 1 {
215 1 Delay_0_5us(1);
216 1 }
217 1 else
218 1 {
219 1 Delay_0_5us(4);
220 1 }*/
221 1 //WritePinSDA
222 1 InitReadAck();
223 1
224 1 if(iHighMode)
225 1 {
226 2 Delay_0_5us(1);
227 2 Delay_0_5us(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -