?? 24c04.c
字號:
//判斷地址范圍,是否超出24C04范圍,要選第一頁還是第二頁
if (0 != (uiAddRead >> 9))
{
I2CStop();
return ERR_ILLEGAL_ADD;
}
else if (0 != (uiAddRead >> 8))
{
Send8Bit(ADD_WRITE_24C04 | 0x02);
}
else
{
Send8Bit(ADD_WRITE_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
Send8Bit(uiAddRead);
ReadAck();
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
do
{
I2CStart();
if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ERR_TIME_OV;
}
//判斷地址范圍,不再判斷是否超出24C04范圍,只判斷要選第一頁還是第二頁
if (0 != (uiAddRead >> 8))
{
Send8Bit(ADD_READ_24C04 | 0x02);
}
else
{
Send8Bit(ADD_READ_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
ucDataRead = Recev8Bit();
I2CStop();
return ucDataRead;
}
/*******************************************************************************
* 函數名稱: unsigned char PageWrite(unsigned char const idata *pucDataWrt,
* unsigned int uiAddStart_PgWr,
* unsigned char ucLength_PgWr);
* 功能描述: 將 pucDataWrt 所指數據,寫入地址 uiAddStart 到
* 地址uiAddStart + length 之間的區域
* 輸入參數: pucDataWrt所指的 length 個字節
* 輸出參數: 無
* 返 回 值: 成功寫入的字節數。
*******************************************************************************/
unsigned char PageWrite(unsigned char const idata *pucDataWrt, unsigned int uiAddStart_PgWr,
unsigned char ucLength_PgWr)
{
unsigned char ucWrtCount = 0;
while (ucLength_PgWr--)
{
if ((0 == ucWrtCount) || (0 == uiAddStart_PgWr%16))
{
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
I2CStop();
do
{
//等待大于10ms,停止等待,返回成功寫入字節數
if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ucWrtCount;
}
I2CStart();
if (0 != (uiAddStart_PgWr >> 9))
{
I2CStop();
return ucWrtCount;
}
else if (0 != (uiAddStart_PgWr >> 8))
{
Send8Bit(ADD_WRITE_24C04 | 0x02);
}
else
{
Send8Bit(ADD_WRITE_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
Send8Bit(uiAddStart_PgWr);
ReadAck();
}
Send8Bit(*pucDataWrt++);
ReadAck();
ucWrtCount++;
uiAddStart_PgWr++;
}
I2CStop();
return ucWrtCount;
}
/*******************************************************************************
* 函數名稱: unsigned char PageFill(unsigned char const idata ucDataPgFill,
* unsigned int uiAddStart_Fill,
* unsigned char ucLengthFill);
* 功能描述: 將數據 ucDataPgFill,寫入地址 uiAddStart_Fill 到
* uiAddStart_Fill + ucLengthFill 之間的區域
* 輸入參數: pucDataWrt所指的 length 個字節
* 輸出參數: 無
* 返 回 值: 成功寫入的字節數。
*******************************************************************************/
unsigned char PageFill(unsigned char const idata ucDataPgFill, unsigned int uiAddStart_Fill,
unsigned char ucLengthFill)
{
unsigned char ucFillCount = 0;
while (ucLengthFill--)
{
if ((0 == ucFillCount) || (0 == uiAddStart_Fill%16))
{
g_ucTimer24C04Ack = WAIT_ACK_TIME;
g_FlagWaiting24C04Ack = 0;
I2CStop();
do
{
//等待大于10ms,停止等待,返回成功寫入字節數
if (g_FlagWaiting24C04Ack && (0 == g_ucTimer24C04Ack))
{
I2CStop();
return ucFillCount;
}
I2CStart();
if (0 != (uiAddStart_Fill >> 9))
{
I2CStop();
return ucFillCount;
}
else if (0 != (uiAddStart_Fill >> 8))
{
Send8Bit(ADD_WRITE_24C04 | 0x02);
}
else
{
Send8Bit(ADD_WRITE_24C04);
}
g_FlagWaiting24C04Ack = 1;
}while (ReadAck());
Send8Bit(uiAddStart_Fill);
ReadAck();
}
Send8Bit(ucDataPgFill);
ReadAck();
ucFillCount++;
uiAddStart_Fill++;
}
I2CStop();
return ucFillCount;
}
/*******************************************************************************
* 函數名稱: void SendAck(void);
* 功能描述: 發送I2C的應答位
* 輸入參數: 無
* 輸出參數: 無
* 返 回 值: 無
* 其他說明: 連續讀數需要發送應答位
* 修改日期 版 本 號 修 改 人 修改內容
*******************************************************************************/
#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))
{
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();
return RD_SUCC_RTN;
}
#endif //#ifdef USE_SEQ_RD
#endif //#ifndef AT24C04_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -