📄 24c04.lst
字号:
283 3 return ERR_ILLEGAL_ADD;
284 3 }
285 2 else if (0 != (uiAddRead >> 8))
286 2 {
287 3 Send8Bit(ADD_WRITE_24C04 | 0x02);
288 3 }
289 2 else
290 2 {
291 3 Send8Bit(ADD_WRITE_24C04);
292 3 }
293 2 g_FlagWaiting24C04Ack = 1;
294 2 }while (ReadAck());
295 1
296 1 Send8Bit(uiAddRead);
297 1 ReadAck();
298 1
299 1 g_ucTimer24C04Ack = WAIT_ACK_TIME;
300 1 g_FlagWaiting24C04Ack = 0;
301 1 do
302 1 {
303 2 I2CStart();
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 6
304 2 if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
305 2 {
306 3 I2CStop();
307 3 return ERR_TIME_OV;
308 3 }
309 2
310 2 //判断地址范围,不再判断是否超出24C04范围,只判断要选第一页还是第二页
311 2 if (0 != (uiAddRead >> 8))
312 2 {
313 3 Send8Bit(ADD_READ_24C04 | 0x02);
314 3 }
315 2 else
316 2 {
317 3 Send8Bit(ADD_READ_24C04);
318 3 }
319 2 g_FlagWaiting24C04Ack = 1;
320 2 }while (ReadAck());
321 1
322 1 ucDataRead = Recev8Bit();
323 1 I2CStop();
324 1 return ucDataRead;
325 1 }
326
327 /*******************************************************************************
328 * 函数名称: unsigned char PageWrite(unsigned char const idata *pucDataWrt,
329 * unsigned int uiAddStart_PgWr,
330 * unsigned char ucLength_PgWr);
331 * 功能描述: 将 pucDataWrt 所指数据,写入地址 uiAddStart 到
332 * 地址uiAddStart + length 之间的区域
333 * 输入参数: pucDataWrt所指的 length 个字节
334 * 输出参数: 无
335 * 返 回 值: 成功写入的字节数。
336 *******************************************************************************/
337 unsigned char PageWrite(unsigned char const idata *pucDataWrt, unsigned int uiAddStart_PgWr,
338 unsigned char ucLength_PgWr)
339 {
340 1 unsigned char ucWrtCount = 0;
341 1
342 1 while (ucLength_PgWr--)
343 1 {
344 2 if ((0 == ucWrtCount) || (0 == uiAddStart_PgWr%16))
345 2 {
346 3 g_ucTimer24C04Ack = WAIT_ACK_TIME;
347 3 g_FlagWaiting24C04Ack = 0;
348 3 I2CStop();
349 3 do
350 3 {
351 4 //等待大于10ms,停止等待,返回成功写入字节数
352 4 if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
353 4 {
354 5 I2CStop();
355 5 return ucWrtCount;
356 5 }
357 4 I2CStart();
358 4 if (0 != (uiAddStart_PgWr >> 9))
359 4 {
360 5 I2CStop();
361 5 return ucWrtCount;
362 5 }
363 4 else if (0 != (uiAddStart_PgWr >> 8))
364 4 {
365 5 Send8Bit(ADD_WRITE_24C04 | 0x02);
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 7
366 5 }
367 4 else
368 4 {
369 5 Send8Bit(ADD_WRITE_24C04);
370 5 }
371 4 g_FlagWaiting24C04Ack = 1;
372 4 }while (ReadAck());
373 3 Send8Bit(uiAddStart_PgWr);
374 3 ReadAck();
375 3 }
376 2 Send8Bit(*pucDataWrt++);
377 2 ReadAck();
378 2 ucWrtCount++;
379 2 uiAddStart_PgWr++;
380 2 }
381 1 I2CStop();
382 1 return ucWrtCount;
383 1 }
384
385 /*******************************************************************************
386 * 函数名称: unsigned char PageFill(unsigned char const idata ucDataPgFill,
387 * unsigned int uiAddStart_Fill,
388 * unsigned char ucLengthFill);
389 * 功能描述: 将数据 ucDataPgFill,写入地址 uiAddStart_Fill 到
390 * uiAddStart_Fill + ucLengthFill 之间的区域
391 * 输入参数: pucDataWrt所指的 length 个字节
392 * 输出参数: 无
393 * 返 回 值: 成功写入的字节数。
394 *******************************************************************************/
395 unsigned char PageFill(unsigned char const idata ucDataPgFill, unsigned int uiAddStart_Fill,
396 unsigned char ucLengthFill)
397 {
398 1 unsigned char ucFillCount = 0;
399 1
400 1 while (ucLengthFill--)
401 1 {
402 2 if ((0 == ucFillCount) || (0 == uiAddStart_Fill%16))
403 2 {
404 3 g_ucTimer24C04Ack = WAIT_ACK_TIME;
405 3 g_FlagWaiting24C04Ack = 0;
406 3 I2CStop();
407 3 do
408 3 {
409 4 //等待大于10ms,停止等待,返回成功写入字节数
410 4 if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
411 4 {
412 5 I2CStop();
413 5 return ucFillCount;
414 5 }
415 4 I2CStart();
416 4 if (0 != (uiAddStart_Fill >> 9))
417 4 {
418 5 I2CStop();
419 5 return ucFillCount;
420 5 }
421 4 else if (0 != (uiAddStart_Fill >> 8))
422 4 {
423 5 Send8Bit(ADD_WRITE_24C04 | 0x02);
424 5 }
425 4 else
426 4 {
427 5 Send8Bit(ADD_WRITE_24C04);
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 8
428 5 }
429 4 g_FlagWaiting24C04Ack = 1;
430 4 }while (ReadAck());
431 3 Send8Bit(uiAddStart_Fill);
432 3 ReadAck();
433 3 }
434 2 Send8Bit(ucDataPgFill);
435 2 ReadAck();
436 2 ucFillCount++;
437 2 uiAddStart_Fill++;
438 2 }
439 1 I2CStop();
440 1 return ucFillCount;
441 1 }
442 /*******************************************************************************
443 * 函数名称: void SendAck(void);
444 * 功能描述: 发送I2C的应答位
445 * 输入参数: 无
446 * 输出参数: 无
447 * 返 回 值: 无
448 * 其他说明: 连续读数需要发送应答位
449 * 修改日期 版 本 号 修 改 人 修改内容
450 *******************************************************************************/
451 #ifdef USE_SEQ_RD
void SendAck(void)
{
//SCL = 0;
_nop_();
SDA = 0;
_nop_();
SCL = 1;
SCL = 0;
SDA = 1;
}
/*******************************************************************************
* 函数名称: bit SeqRead(unsigned int uiAddStart_SqRd,
* unsigned char ucLength_SqRd,
* unsigned char *pucDataStr);
* 功能描述: 从地址 uiAddStart起读出 length 个数据,存入 pucDataStr所指空间
* 输入参数: uiAddStart, 要读取24C04的起始地址
* 输出参数: pucDataStr所指空间,为读出数据
* 返 回 值: 成功读出的字节数。
*******************************************************************************/
bit SeqRead(unsigned int uiAddStart_SqRd, unsigned char ucLength_SqRd,
unsigned char *pucDataStr)
{
unsigned char ucRdCount;
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
do
{
if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ERR_TIME_OV;
}
I2CStart();
//判断地址范围,是否超出24C04范围,要选第一页还是第二页
if (0 != (uiAddStart_SqRd >> 9))
{
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 9
I2CStop();
return ERR_ILLEGAL_ADD;
}
else if (0 != (uiAddStart_SqRd >> 8))
{
Send8Bit(ADD_WRITE_24C04 | 0x02);
}
else
{
Send8Bit(ADD_WRITE_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
Send8Bit(uiAddStart_SqRd);
ReadAck();
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
do
{
if ((g_FlagWaiting24C04Ack) && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ERR_TIME_OV;
}
I2CStart();
//判断地址范围,不再判断是否超出24C04范围,只判断要选第一页还是第二页
if (0 != (uiAddStart_SqRd >> 8))
{
Send8Bit(ADD_READ_24C04 | 0x02);
}
else
{
Send8Bit(ADD_READ_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
ucRdCount = 0;
while (ucLength_SqRd--)
{
if (512 <= uiAddStart_SqRd)
{
I2CStop();
return ERR_ADD_OV;
}
else
{
uiAddStart_SqRd++;
}
*pucDataStr = Recev8Bit();
/*ES = 0; //
TI = 0;
SBUF = Recev8Bit();
while (!TI);
TI = 0;
ES = 1;*/
pucDataStr++;
//ucRdCount++; //not used
SendAck();
}
I2CStop();
C51 COMPILER V8.02 24C04 05/18/2008 16:43:11 PAGE 10
return RD_SUCC_RTN;
}
#endif //#ifdef USE_SEQ_RD
555
556 #endif //#ifndef AT24C04_H
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 488 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 1
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- 3
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -