📄 i2c.lst
字号:
C51 COMPILER V8.08 I2C 03/18/2009 21:19:05 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<ADuC841.h>
2
3 #define I2C_SCL MCO //ADUC831的I2CCON寄存器中的1位,时钟位
4 #define I2C_SDA_O MDO //ADUC831的I2CCON寄存器中的1位,数据输出
5 #define I2C_SDA_I MDI //ADUC831的I2CCON寄存器中的1位,数据输入
6 #define IO_ENABLE MDE //ADUC831的I2CCON寄存器中的1位,数据输入/输出的使能
7 #define ZLGWR 0x70 //ZLG7290的写地址
8 #define ZLGRD 0x71 //ZLG7290的读地址
9
10 /**********************************************************
11 I2C时序的延时程序
12 适用于aduc848,系统时钟为12.582912MHz时,for循环30次以上
13 ***********************************************************/
14 static void I2C_Delay()
15 {
16 1 char i;
17 1 for(i=0;i<50;i++);
18 1 }
19
20 /***********************************************************
21 函数:I2C_Start()
22 功能:产生I2C 总线的起始状态
23 说明:
24 SCL处于高电平期间,当SDA 出现下降沿时启动I2C 总线
25 不论SDA 和SCL 处于什么电平状态,本函数总能正确产生起始状态
26 本函数也可以用来产生重复起始状态
27 本函数执行后,I2C 总线处于忙状态
28 ***********************************************************/
29 static void I2C_Start()
30 {
31 1 IO_ENABLE=1;
32 1 I2C_SDA_O = 1;
33 1 I2C_Delay();
34 1 I2C_SCL = 1;
35 1 I2C_Delay();
36 1 I2C_SDA_O = 0;
37 1 I2C_Delay();
38 1 I2C_SCL = 0;
39 1 I2C_Delay();
40 1 }
41
42 /***********************************************************
43 函数:I2C_Write()
44 功能:向I2C 总线写1 个字节的数据
45 参数:
46 dat:要写到总线上的数据
47 ***********************************************************/
48 static void I2C_Write(char dat)
49 {
50 1 unsigned char t = 8;
51 1 IO_ENABLE=1;
52 1 do
53 1 {
54 2 I2C_SDA_O = (bit)(dat & 0x80);
55 2 dat <<= 1;
C51 COMPILER V8.08 I2C 03/18/2009 21:19:05 PAGE 2
56 2 I2C_SCL = 1;
57 2 I2C_Delay();
58 2 I2C_SCL = 0;
59 2 I2C_Delay();
60 2 } while ( --t != 0 );
61 1 }
62
63 /***********************************************************
64 函数:I2C_Read()
65 功能:从从机读取1 个字节的数据
66 返回:读取的一个字节数据
67 ***********************************************************/
68 static int I2C_Read()
69 {
70 1 int dat=0;
71 1 unsigned char t = 8;
72 1 do
73 1 {
74 2 I2C_SCL = 0;
75 2 I2C_Delay();
76 2 I2C_SCL = 1;
77 2 I2C_Delay();
78 2 dat <<= 1;
79 2 IO_ENABLE=0;
80 2 if ( I2C_SDA_I ) dat |= 0x01;
81 2 I2C_SCL = 0;
82 2 I2C_Delay();
83 2 } while ( --t != 0 );
84 1 return dat;
85 1 }
86
87
88 /***********************************************************
89 函数:I2C_GetAck()
90 功能:读取从机应答位
91 返回:
92 0:从机应答
93 1:从机非应答
94 说明:
95 从机在收到每个字节的数据后,要产生应答位
96 从机在收到最后1 个字节的数据后,一般要产生非应答位
97 ***********************************************************/
98 static bit I2C_GetAck()
99 {
100 1 bit ack;
101 1 IO_ENABLE=1;
102 1 I2C_SDA_O = 1;
103 1 I2C_Delay();
104 1 I2C_SCL = 1;
105 1 I2C_Delay();
106 1 IO_ENABLE=0;
107 1 ack = I2C_SDA_I;
108 1 I2C_SCL = 0;
109 1 I2C_Delay();
110 1 return ack;
111 1 }
112
113 /********************************************************
114 函数:I2C_PutAck()
115 功能:主机产生应答位或非应答位
116 参数:
117 ack=0:主机产生应答位
C51 COMPILER V8.08 I2C 03/18/2009 21:19:05 PAGE 3
118 ack=1:主机产生非应答位
119 说明:
120 主机在接收完每一个字节的数据后,都应当产生应答位
121 主机在接收完最后一个字节的数据后,应当产生非应答位
122 *********************************************************/
123 static void I2C_PutAck(bit ack)
124 {
125 1 IO_ENABLE=1;
126 1 I2C_SDA_O = ack;
127 1 I2C_Delay();
128 1 I2C_SCL = 1;
129 1 I2C_Delay();
130 1 I2C_SCL = 0;
131 1 I2C_Delay();
132 1 }
133
134 /***********************************************************
135 函数:I2C_Stop()
136 功能:产生I2C 总线的停止状态
137 说明:
138 SCL处于高电平期间,当SDA 出现上升沿时停止I2C 总线
139 不论SDA 和SCL 处于什么电平状态,本函数总能正确产生停止状态
140 本函数执行后,I2C 总线处于空闲状态
141 ***********************************************************/
142 static void I2C_Stop()
143 {
144 1 unsigned char t = 10;
145 1 IO_ENABLE=1;
146 1 I2C_SDA_O = 0;
147 1 I2C_Delay();
148 1 I2C_SCL = 1;
149 1 I2C_Delay();
150 1 I2C_SDA_O= 1;
151 1 I2C_Delay();
152 1 while ( --t != 0 ); //在下一次产生Start 之前,要加一定的延时
153 1 }
154
155 /***********************************************************
156 功能:将I2C总线置于空闲状态,即将时钟线和数据线都拉高
157 ***********************************************************/
158 static void idle()
159 {
160 1 I2C_SCL=1;
161 1 IO_ENABLE=1;
162 1 I2C_SDA_O=1;
163 1 IO_ENABLE=0;
164 1 }
165
166
167 /**********************************************************
168 函数:I2C_Init()
169 功能:I2C 总线初始化,使总线处于空闲状态
170 说明:在main()函数的开始处,通常应当要执行一次本函数
171 ***********************************************************/
172 void I2C_Init()
173 {
174 1 IO_ENABLE=1; //使能为1,则为输出;为0,则为输入
175 1 I2C_SCL = 1;
176 1 I2C_Delay();
177 1 I2C_SDA_O = 1;
178 1 I2C_Delay();
179 1 }
C51 COMPILER V8.08 I2C 03/18/2009 21:19:05 PAGE 4
180
181 /***********************************************************
182 函数:I2C_Puts()
183 功能:I2C 总线综合发送函数,向从机发送多个字节的数据
184 参数:
185 SlaveAddr:从机地址(7 位纯地址,不含读写位)
186 SubAddr:从机的子地址
187 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
188 *dat:要发送的数据
189 Size:数据的字节数
190 返回:
191 0:发送成功
192 1:在发送过程中出现异常
193 说明:
194 本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址
195 当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0
196 ***********************************************************/
197 bit I2C_Puts(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod,char *dat,unsigned int Size
-)
198 {
199 1 unsigned char i; //定义临时变量
200 1 char a[3];
201 1 if ( Size == 0 ) return 0; //检查长度
202 1 a[0] = (SlaveAddr << 1); //准备从机地址
203 1 if ( SubMod > 2 ) SubMod = 2; //检查子地址模式
204 1 switch ( SubMod ) //确定子地址
205 1 {
206 2 case 0:break;
207 2 case 1:a[1] = (char)(SubAddr);break;
208 2 case 2:a[1] = (char)(SubAddr >> 8);a[2] = (char)(SubAddr);break;
209 2 default:break;
210 2 }
211 1 a[1] = (char)(SubAddr);
212 1 SubMod++; //发送从机地址,接着发送子地址
213 1 I2C_Start();
214 1 for ( i=0; i<SubMod; i++ )
215 1 {
216 2 I2C_Write(a[i]);
217 2 if ( I2C_GetAck() )
218 2 {
219 3 I2C_Stop();idle();
220 3 return 1;
221 3 }
222 2 }
223 1 do //发送数据
224 1 {
225 2 I2C_Write(*dat++);
226 2 if ( I2C_GetAck() ) break;
227 2 } while ( --Size != 0 );
228 1 I2C_Stop(); idle(); //发送完毕,停止I2C 总线,并返回结果
229 1 if ( Size == 0 ) return 0;
230 1 else return 1;
231 1 }
232
233 /***********************************************************
234 函数:I2C_Gets()
235 功能:I2C 总线综合接收函数,接收多个字节的数据
236 参数:
237 SubAddr:从机的子地址
238 ***********************************************************/
239 int I2C_gets(unsigned char subaddr)
240 {
C51 COMPILER V8.08 I2C 03/18/2009 21:19:05 PAGE 5
241 1 int i,dat;
242 1 I2C_Start();
243 1 I2C_Write(ZLGWR);
244 1 I2C_GetAck();
245 1 I2C_Write(subaddr);
246 1 I2C_SCL=1;
247 1 for(i=0;i<2;i++){;}
248 1 I2C_SCL=0;
249 1 I2C_Stop();
250 1 for(i=0;i<5;i++){;}
251 1 I2C_Start();
252 1 I2C_Write(ZLGRD);
253 1 I2C_GetAck();
254 1 dat=I2C_Read();
255 1 I2C_PutAck(1);
256 1 I2C_Stop();
257 1 idle();
258 1 return dat;
259 1 }
260
261
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 372 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -