📄 i2c.lst
字号:
168 SubAddr:从机的子地址
169 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
170 *dat:要发送的数据
171 Size:数据的字节数
172 返回:
173 0:发送成功
174 1:在发送过程中出现异常
175 说明:
176 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
177 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
178 -------------------------------------------------------------*/
179 bit I2C_Puts
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 4
180 (
181 unsigned char SlaveAddr,
182 unsigned int SubAddr,
183 unsigned char SubMod,
184 char *dat,
185 unsigned int Size
186 )
187 {
188 1 //定义临时变量
189 1 unsigned char i;
190 1 char a[3];
191 1 //检查长度
192 1 if ( Size == 0 ) return 0;
193 1 //准备从机地址
194 1 a[0] = (SlaveAddr << 1); //0x38 * 2 = 0x70;
195 1 //检查子地址模式
196 1 if ( SubMod > 2 ) SubMod = 2;
197 1 //确定子地址
198 1 switch ( SubMod )
199 1 {
200 2 case 0:
201 2 break;
202 2 case 1:
203 2 a[1] = (char)(SubAddr);
204 2 break;
205 2 case 2:
206 2 a[1] = (char)(SubAddr >> 8);
207 2 a[2] = (char)(SubAddr);
208 2 break;
209 2 default:
210 2 break;
211 2 }
212 1 //发送从机地址,接着发送子地址(如果有子地址的话)
213 1 SubMod++;
214 1 I2C_Start();
215 1 for ( i=0; i<SubMod; i++ )
216 1 {
217 2 I2C_Write(a[i]);
218 2 if ( I2C_GetAck() ) ///1 表示非应答;0 应答
219 2 {
220 3 I2C_Stop();
221 3 return 1;
222 3 }
223 2 }
224 1 //发送数据
225 1 do
226 1 {
227 2 I2C_Write(*dat++);
228 2 if ( I2C_GetAck() ) break;
229 2 } while ( --Size != 0 );
230 1 //发送完毕,停止I2C总线,并返回结果
231 1 I2C_Stop();
232 1 if ( Size == 0 )
233 1 {
234 2 return 0;
235 2 }
236 1 else
237 1 {
238 2 return 1;
239 2 }
240 1 }
241
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 5
242 /*-------------------------------------------------------------
243 函数:I2C_Gets()
244 功能:I2C总线综合接收函数,从从机接收多个字节的数据
245 参数:
246 SlaveAddr:从机地址(7位纯地址,不含读写位)
247 SubAddr:从机的子地址
248 SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
249 *dat:保存接收到的数据
250 Size:数据的字节数
251 返回:
252 0:接收成功
253 1:在接收过程中出现异常
254 说明:
255 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
256 当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
257 -------------------------------------------------------------*/
258 bit I2C_Gets
259 (
260 unsigned char SlaveAddr,
261 unsigned int SubAddr,
262 unsigned char SubMod,
263 char *dat,
264 unsigned int Size
265 )
266 {
267 1 //定义临时变量
268 1 unsigned char i;
269 1 char a[3];
270 1 //检查长度
271 1 if ( Size == 0 ) return 0;
272 1 //准备从机地址
273 1 a[0] = (SlaveAddr << 1);
274 1 //检查子地址模式
275 1 if ( SubMod > 2 ) SubMod = 2;
276 1 //如果是有子地址的从机,则要先发送从机地址和子地址
277 1 if ( SubMod != 0 )
278 1 {
279 2 //确定子地址
280 2 if ( SubMod == 1 )
281 2 {
282 3 a[1] = (char)(SubAddr);
283 3 }
284 2 else
285 2 {
286 3 a[1] = (char)(SubAddr >> 8);
287 3 a[2] = (char)(SubAddr);
288 3 }
289 2 //发送从机地址,接着发送子地址
290 2 SubMod++;
291 2 I2C_Start();
292 2 for ( i=0; i<SubMod; i++ )
293 2 {
294 3 I2C_Write(a[i]);
295 3 if ( I2C_GetAck() )
296 3 {
297 4 I2C_Stop();
298 4 return 1;
299 4 }
300 3 }
301 2 }
302 1 //这里的I2C_Start()对于有子地址的从机是重复起始状态
303 1 //对于无子地址的从机则是正常的起始状态
C51 COMPILER V8.05a I2C 01/11/2008 12:42:15 PAGE 6
304 1 I2C_Start();
305 1 //发送从机地址
306 1 I2C_Write(a[0]+1);
307 1 if ( I2C_GetAck() )
308 1 {
309 2 I2C_Stop();
310 2 return 1;
311 2 }
312 1 //接收数据
313 1 for (;;)
314 1 {
315 2 *dat++ = I2C_Read();
316 2 if ( --Size == 0 )
317 2 {
318 3 I2C_PutAck(1);
319 3 break;
320 3 }
321 2 I2C_PutAck(0);
322 2 }
323 1 //接收完毕,停止I2C总线,并返回结果
324 1 I2C_Stop();
325 1 return 0;
326 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 449 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 24
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 + -