⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c04.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
        //判断地址范围,是否超出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 + -