📄 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 + -