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