📄 eeprom.c
字号:
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 + -