📄 i2c.lst
字号:
C51 COMPILER V6.23a I2C 04/10/2007 16:25:31 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: e:\mcs51\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /***********************************************************************************
2 程序名称:标准80C51单片机I/O模拟I2C总线的主机程序
3 版本信息:Copyright (c) 2006,广州周立功单片机发展有限公司
4 All rights reserved.
5 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的
6 ***********************************************************************************/
7
8
9 #include "I2C.h"
10
11 /***********************************************************************************
12 函数:I2C_Delay()
13 功能:延时,模拟I2C总线专用
14 ***********************************************************************************/
15 void I2C_Delay()
16 {
17 1 unsigned char t = I2C_DELAY_VALUE;
18 1 while ( --t != 0 );
19 1 }
20
21
22 /***********************************************************************************
23 函数:I2C_Init()
24 功能:I2C总线初始化,使总线处于空闲状态
25 ***********************************************************************************/
26 void I2C_Init()
27 {
28 1 I2C_SCL = 1;
29 1 I2C_Delay();
30 1 I2C_SDA = 1;
31 1 I2C_Delay();
32 1 }
33
34
35 /***********************************************************************************
36 函数:I2C_Start()
37 功能:产生I2C总线的起始条件(Start Condition)
38 说明:按照I2C总线协议的规定,SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
39 本函数执行后,I2C总线处于忙状态
40 本函数也可以用来产生重复起始条件
41 ***********************************************************************************/
42 void I2C_Start()
43 {
44 1 I2C_SDA = 1;
45 1 I2C_Delay();
46 1 I2C_SCL = 1;
47 1 I2C_Delay();
48 1 I2C_SDA = 0;
49 1 I2C_Delay();
50 1 I2C_SCL = 0;
51 1 I2C_Delay();
52 1 }
53
54
55 /***********************************************************************************
C51 COMPILER V6.23a I2C 04/10/2007 16:25:31 PAGE 2
56 函数:I2C_Write()
57 功能:向I2C总线写1个字节的数据
58 参数:dat是要写到总线上的数据
59 ***********************************************************************************/
60 void I2C_Write(unsigned char dat)
61 {
62 1 unsigned char t = 8;
63 1 do
64 1 {
65 2 I2C_SDA = (bit)(dat & 0x80);
66 2 dat <<= 1;
67 2 I2C_SCL = 1;
68 2 I2C_Delay();
69 2 I2C_SCL = 0;
70 2 I2C_Delay();
71 2 } while ( --t != 0 );
72 1 }
73
74
75 /***********************************************************************************
76 函数:I2C_Read()
77 功能:从从机读取1个字节的数据
78 返回:读取的1个字节数据
79 ***********************************************************************************/
80 unsigned char I2C_Read()
81 {
82 1 unsigned char dat;
83 1 unsigned char t = 8;
84 1 I2C_SDA = 1; //在读取数据之前,先要把SDA拉高
85 1 do
86 1 {
87 2 I2C_SCL = 1;
88 2 I2C_Delay();
89 2 dat <<= 1;
90 2 if ( I2C_SDA ) dat |= 0x01;
91 2 I2C_SCL = 0;
92 2 I2C_Delay();
93 2 } while ( --t != 0 );
94 1 return dat;
95 1 }
96
97
98 /***********************************************************************************
99 函数:I2C_GetAck()
100 功能:读取从机应答位
101 返回:0-从机应答
102 1-从机非应答
103 说明:从机在收到每一个字节的数据后,要产生应答位
104 从机在收到最后一个字节的数据后,一般要产生非应答位
105 ***********************************************************************************/
106 bit I2C_GetAck()
107 {
108 1 bit ack;
109 1 I2C_SDA = 1;
110 1 I2C_Delay();
111 1 I2C_SCL = 1;
112 1 I2C_Delay();
113 1 ack = I2C_SDA;
114 1 I2C_SCL = 0;
115 1 I2C_Delay();
116 1 return ack;
117 1 }
C51 COMPILER V6.23a I2C 04/10/2007 16:25:31 PAGE 3
118
119
120 /***********************************************************************************
121 函数:I2C_PutAck()
122 功能:主机产生应答位或非应答位
123 参数:ack=0,主机产生应答位
124 ack=1,主机产生非应答位
125 说明:主机在接收完每一个字节的数据后,都应当产生应答位
126 主机在接收完最后一个字节的数据后,应当产生非应答位
127 ***********************************************************************************/
128 void I2C_PutAck(bit ack)
129 {
130 1 I2C_SDA = ack;
131 1 I2C_Delay();
132 1 I2C_SCL = 1;
133 1 I2C_Delay();
134 1 I2C_SCL = 0;
135 1 I2C_Delay();
136 1 }
137
138
139 /***********************************************************************************
140 函数:I2C_Stop()
141 功能:产生I2C总线的停止状态
142 说明:按照I2C总线协议的规定,SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
143 本函数执行后,I2C总线处于空闲状态
144 ***********************************************************************************/
145 void I2C_Stop()
146 {
147 1 unsigned int t = I2C_STOP_WAIT_VALUE;
148 1 I2C_SDA = 0;
149 1 I2C_Delay();
150 1 I2C_SCL = 1;
151 1 I2C_Delay();
152 1 I2C_SDA = 1;
153 1 I2C_Delay();
154 1 while ( --t != 0 ); //视具体情况,在下一次产生Start之前加一定的延时
155 1 }
156
157
158 /***********************************************************************************
159 函数:I2C_Puts()
160 功能:主机通过I2C总线向从机发送多个字节的数据
161 参数:SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
162 SubAddr:从机的子地址
163 Size:数据的字节数
164 *dat:要发送的数据
165 返回:0:发送成功
166 1:在发送过程中出现异常
167 ***********************************************************************************/
168 bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
169 {
170 1 //检查长度
171 1 if ( Size == 0 ) return 0;
172 1 //确保从机地址最低位是0
173 1 SlaveAddr &= 0xFE;
174 1 //启动I2C总线
175 1 I2C_Start();
176 1 //发送从机地址
177 1 I2C_Write(SlaveAddr);
178 1 if ( I2C_GetAck() )
179 1 {
C51 COMPILER V6.23a I2C 04/10/2007 16:25:31 PAGE 4
180 2 I2C_Stop();
181 2 return 1;
182 2 }
183 1 //发送子地址
184 1 I2C_Write(SubAddr);
185 1 if ( I2C_GetAck() )
186 1 {
187 2 I2C_Stop();
188 2 return 1;
189 2 }
190 1 //发送数据
191 1 do
192 1 {
193 2 I2C_Write(*dat++);
194 2 if ( I2C_GetAck() )
195 2 {
196 3 I2C_Stop();
197 3 return 1;
198 3 }
199 2 } while ( --Size != 0 );
200 1 //发送完毕,停止I2C总线,并返回结果
201 1 I2C_Stop();
202 1 return 0;
203 1 }
204
205 /*
206 函数:I2C_Gets()
207 功能:主机通过I2C总线从从机接收多个字节的数据
208 参数:
209 SlaveAddr:从机地址(高7位是从机地址,最低位是读标志1)
210 SubAddr:从机的子地址
211 Size:数据的字节数
212 *dat:保存接收到的数据
213 返回:
214 0:接收成功
215 1:在接收过程中出现异常
216 */
217 bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
218 {
219 1 //检查长度
220 1 if ( Size == 0 ) return 0;
221 1 //确保从机地址最低位是0
222 1 SlaveAddr &= 0xFE; //确保最低位是0
223 1 //启动I2C总线
224 1 I2C_Start();
225 1 //发送从机地址
226 1 I2C_Write(SlaveAddr);
227 1 if ( I2C_GetAck() )
228 1 {
229 2 I2C_Stop();
230 2 return 1;
231 2 }
232 1 //发送子地址
233 1 I2C_Write(SubAddr);
234 1 if ( I2C_GetAck() )
235 1 {
236 2 I2C_Stop();
237 2 return 1;
238 2 }
239 1 //发送重复起始条件
240 1 I2C_Start();
241 1 //发送从机地址
C51 COMPILER V6.23a I2C 04/10/2007 16:25:31 PAGE 5
242 1 SlaveAddr |= 0x01;
243 1 I2C_Write(SlaveAddr);
244 1 if ( I2C_GetAck() )
245 1 {
246 2 I2C_Stop();
247 2 return 1;
248 2 }
249 1 //接收数据
250 1 for (;;)
251 1 {
252 2 *dat++ = I2C_Read();
253 2 if ( --Size == 0 )
254 2 {
255 3 I2C_PutAck(1);
256 3 break;
257 3 }
258 2 I2C_PutAck(0);
259 2 }
260 1 //接收完毕,停止I2C总线,并返回结果
261 1 I2C_Stop();
262 1 return 0;
263 1 }
264
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 313 ----
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 + -