为了实现与程序的兼容性、我需要先处理从 I2C EEPROM 接收到的每个字节、然后再保存它们。 我无法保存它们并稍后进行处理。
我已经研究了 EEPROM 轮询示例并 找到了 以下接收器函数:
uint16_t I2C_ControllerReceiver(struct I2CHandle *I2C_Params)
{
uint16_t status;
uint16_t attemptCount;
uint32_t base = I2C_Params->base;
I2C_disableFIFO(base);
I2C_enableFIFO(base);
status = I2C_TransmittargetAddress_ControlBytes(I2C_Params);
if(status)
{
return status;
}
uint16_t numofSixteenByte = (I2C_Params->NumOfDataBytes) / I2C_FIFO_LEVEL;
uint16_t remainingBytes = (I2C_Params->NumOfDataBytes) % I2C_FIFO_LEVEL;
I2C_setConfig(base, (I2C_CONTROLLER_RECEIVE_MODE|I2C_REPEAT_MODE));
I2C_sendStartCondition(base);
uint16_t i,count = 0,buff_pos=0;
while(count < numofSixteenByte)
{
status = handleNACK(base);
if(status)
{
return status;
}
count++;
attemptCount = 1;
while(!(I2C_getRxFIFOStatus(base) == I2C_FIFO_RXFULL) && attemptCount <= 9 * (I2C_FIFO_RXFULL + 2U))
{
DEVICE_DELAY_US(I2C_Params->Delay_us);
attemptCount++;
}
for(i=0; i<I2C_FIFO_LEVEL; i++)
{
I2C_Params->pRX_MsgBuffer[buff_pos++] = I2C_getData(base);
}
}
attemptCount = 1;
while(!(I2C_getRxFIFOStatus(base) == remainingBytes) && attemptCount <= 9 * (remainingBytes + 2U))
{
DEVICE_DELAY_US(I2C_Params->Delay_us);
attemptCount++;
}
I2C_sendStopCondition(base);
for(i=0; i<remainingBytes; i++)
{
I2C_Params->pRX_MsgBuffer[buff_pos++] = I2C_getData(base);
}
status = handleNACK(base);
if(status)
{
return status;
}
I2C_disableFIFO(base);
attemptCount = 1;
while(I2C_getStopConditionStatus(base) && attemptCount <= 3U);
{
DEVICE_DELAY_US(I2C_Params->Delay_us);
attemptCount++;
}
return SUCCESS;
}
运行得很好、唯一的问题是它会继续询问字节、直到达到 stopCondition、并且几乎总是如此、我从这个函数中得到的字节比要求的字节数多1个。
我想问的是、我是否可以设置我要接收的字节量、并确保遵守这一点。
可表示为:
I2C_setConfig (base、(I2C_CONTROL_RECEIVE_MODE));
I2C_setDataCount (base、nRxBytes);
但无法正常工作。
我要问的另一个问题是 、我是否可以决定何时接收下一个字节。 为了说明、我需要获取1个字节、对其进行处理、然后获取另一个字节等。
我不需要任何中断或特殊的东西。 轮询每个 Rx 字节。