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

📄 eeprom.c

📁 easyARM8962 EEPROM读写操作源码
💻 C
📖 第 1 页 / 共 2 页
字号:
static volatile unsigned long g_ulState = STATE_IDLE;

/*********************************************************************************************************
** Function name:      I2C_ISR
** Descriptions:       I2C中断服务程序。
** input parameters:   无
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void I2C_ISR(void)          					
{
    I2CMasterIntClear (I2C_MASTER_BASE);                                /*  清除I2C中断                 */
    switch ( g_ulState ) {                                              /*  根据当前状态执行相关操作    */

    case STATE_IDLE:                                                    /*  空闲状态                    */
        break;

    case STATE_WRITE_NEXT:                                              /*  写下一个数据                */
        I2CMasterDataPut (I2C_MASTER_BASE, *g_pucData++);               /*  将下一个字节写入数据寄存器  */
        g_ulCount--;
        I2CMasterControl (I2C_MASTER_BASE,
                          I2C_MASTER_CMD_BURST_SEND_CONT);              /*  继续执行块写操作            */
        if (g_ulCount == 1) {                                           /*  如果只剩下一个字节,则将下一
		                                                                    个状态设置为最终写状态      */
            g_ulState = STATE_WRITE_FINAL;
        }
        break;

    case STATE_WRITE_FINAL:                                             /*  写最后一个数据              */
        I2CMasterDataPut (I2C_MASTER_BASE, *g_pucData++);               /*  写最后的字节到数据寄存器    */
        g_ulCount--;
        I2CMasterControl (I2C_MASTER_BASE,                              /*  完成块写                    */
                          I2C_MASTER_CMD_BURST_SEND_FINISH);
        g_ulState = STATE_IDLE;                                         /*  下一个状态为等待块写完成状态*/
        break;

    case STATE_WAIT_ACK:                                                /*  等待应答信号                */
        if (I2CMasterErr (I2C_MASTER_BASE) == I2C_MASTER_ERR_NONE) {    /*  判断前一次读操作是否有错误  */
            I2CMasterDataGet (I2C_MASTER_BASE);                         /*  读取接收到的数据            */
            g_ulState = STATE_IDLE;                                     /*  如果没有错误,进入空闲状态  */
            break;
        }

    case STATE_SEND_ACK:                                                /*  返回一个应答信号,以指示读操
	                                                                        作已经完成                  */
        I2CMasterSlaveAddrSet (I2C_MASTER_BASE, CSI24c02, true);        /*  设置I2C主机为接收模式       */
        I2CMasterControl (I2C_MASTER_BASE, 
                          I2C_MASTER_CMD_SINGLE_RECEIVE);               /*  进行单字节读操作            */
        g_ulState = STATE_WAIT_ACK;                                     /*  等待ACK信号                 */
        break;

    case STATE_READ_ONE:                                                /*  读取一个字节的数据          */
        I2CMasterSlaveAddrSet (I2C_MASTER_BASE, CSI24c02, true);        /*  设置I2C主机为接收模式       */
        I2CMasterControl (I2C_MASTER_BASE, 
                          I2C_MASTER_CMD_SINGLE_RECEIVE);               /*  进行单字节读操作            */
        g_ulState = STATE_READ_WAIT;                                    /*  下一个状态机将为等待最终读状
		                                                                    态                          */
        break;

    case STATE_READ_FIRST:                                              /*  读取字符串的首数据          */
        I2CMasterSlaveAddrSet(I2C_MASTER_BASE, CSI24c02, true);         /*  设置I2C主机为接收模式       */
        I2CMasterControl(I2C_MASTER_BASE,                               /*  开始接收块                  */
                         I2C_MASTER_CMD_BURST_RECEIVE_START);
        g_ulState = STATE_READ_NEXT;                                    /*  下一个状态为块读取中状态    */
        break;

    case STATE_READ_NEXT:                                               /*  读取下一个数据              */
        *g_pucData++ = I2CMasterDataGet (I2C_MASTER_BASE);              /*  读取接收到的字符            */
        g_ulCount--;
        I2CMasterControl (I2C_MASTER_BASE,                              /*  继续块读取操作              */
                          I2C_MASTER_CMD_BURST_RECEIVE_CONT);
        if (g_ulCount == 2) {                                           /*  如果仅剩下两个字节,下一状态
		                                                                    将为快读取结束状态          */
            g_ulState = STATE_READ_FINAL;
        }
        break;

    case STATE_READ_FINAL:                                              /*  块读取结束状态              */
        *g_pucData++ = I2CMasterDataGet (I2C_MASTER_BASE);              /*  读取接收到的字符            */
        g_ulCount--;
        I2CMasterControl (I2C_MASTER_BASE,                              /*  完成块读取操作              */
                          I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
        g_ulState = STATE_READ_WAIT;                                    /*  下一个状态为等待块读取最终状
		                                                                    态                          */
        break;                                                          /*  此状态已完成                */

    case STATE_READ_WAIT:                                               /*  读字节或者读块的最终状态    */
        *g_pucData++  = I2CMasterDataGet (I2C_MASTER_BASE);             /*  读取接收到的字符            */
        g_ulCount--;
        g_ulState = STATE_IDLE;                                         /*  设置状态机为空闲            */
        break;                                                          /*  此状态已完成                */
    }
    /*  I2CMasterIntClear(I2C_MASTER_BASE);  */
}

/*********************************************************************************************************
** Function name:      EEPROMWrite
** Descriptions:       EEPROM写操作
** input parameters:   a: 待发送的数据。
**                     ulOffset: 器件的子地址。 
**                     ulCount: 待发送数据的个数。 
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void EEPROMWrite (unsigned char *pucData,
                  unsigned long ulOffset,
				  unsigned long ulCount)
{
    g_pucData = pucData;                                                /*  将要写入的数据存入缓冲区    */
    g_ulCount = ulCount;
    if (ulCount != 1) {                                                 /* 根据将要写的字节数设定中断
	                                                                       状态机的下一状态             */
        g_ulState = STATE_WRITE_NEXT;
    }
    else {
        g_ulState = STATE_WRITE_FINAL;
    }
    I2CMasterSlaveAddrSet (I2C_MASTER_BASE, CSI24c02 , false);          /*  设置从地址,准备发送数据    */
    I2CMasterDataPut (I2C_MASTER_BASE, ulOffset);                       /*  将写地址发送到数据寄存器    */
    I2CMasterControl (I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);/*  开始循环写字节操作,写该地址
	                                                                        作为第一个地址              */
    while ( g_ulState != STATE_IDLE ) {                                 /*  等待I2C为空闲状态           */
    }
}

/*********************************************************************************************************
** Function name:      EEPROMRead
** Descriptions:       EEPROM读操作 
** input parameters:   a: 读取的数据。 
**                     ulOffset: 器件的子地址。 
**                     ulCount: 读取数据的个数。 
** output parameters:  无
** Returned value:     无   
*********************************************************************************************************/
void  EEPROMRead (unsigned char *pucData,
                  unsigned long ulOffset,
				  unsigned long ulCount)
{
    g_pucData = pucData;                                                /*  设置读缓冲                  */
    g_ulCount = ulCount;
    if (ulCount == 1) {                                                 /*  根据将要读的字节数设定下一步
	                                                                        将要进行的操作              */
        g_ulState = STATE_READ_ONE;
    }
    else {
        g_ulState = STATE_READ_FIRST;
    }
    I2CMasterSlaveAddrSet (I2C_MASTER_BASE, CSI24c02 , false);          /*  获取EEPROM中的地址设置      */
    I2CMasterDataPut (I2C_MASTER_BASE, ulOffset);                       /*  将目的地址发送到数据寄存器  */
    I2CMasterControl (I2C_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND);     /*  执行单字节发送操作,仅写入地
	                                                                        址                          */
    while ( g_ulState != STATE_IDLE ) {                                 /*  等待I2C空闲                 */
    }
}
/*********************************************************************************************************
 END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -