U32 EED_Write(U16 address, U8* data_buf, U16 len)
{
U32 ret = EED_OK;
U16 PageRemainLen = 0;
if((address < EED_ADDRESS_SIZE) && (len != 0x00u) && (data_buf != NULL))
{
if((DSPI_Get_State(DSPI_EEPROM) == DSPI_STATE_IDLE) && (EED_state == EED_IDLE))
{
data_addr = address;
data_ptr = data_buf;
data_length = len;
EED_state = EED_WRITE;
(void)DSPI_Send_Byte(DSPI_EEPROM,EED_INSTRUCTION_WREN,FALSE);
(void)DSPI_Send_Byte(DSPI_EEPROM,EED_INSTRUCTION_WRITE,TRUE);
(void)DSPI_Send_Byte(DSPI_EEPROM,(U8)((data_addr & 0xFF00u) >> 0x08u),TRUE);
(void)DSPI_Send_Byte(DSPI_EEPROM,(U8)(data_addr & 0xFFu),TRUE);
PageRemainLen = EED_PAGE_SIZE - (data_addr & (EED_PAGE_SIZE - 1));
if(data_length > PageRemainLen)
{
(void)DSPI_Send_Data(DSPI_EEPROM, data_ptr, PageRemainLen);
data_addr += PageRemainLen;
data_ptr += PageRemainLen;
data_length -= PageRemainLen;
}
else
{
(void)DSPI_Send_Data(DSPI_EEPROM, data_ptr, data_length);
data_length = 0;
}
}
else
{
ret = EED_BUSY;
}
}
else
{
ret = EED_ERR;
}
return(ret);
}
问:EEPROM写入的时候 剩余页pageremainlen的大小是怎么算的?
答:EEPROM一次只能写一个page的内容,所以一次写入的数据要按page边界对齐。 举例来说,如果page大小是16字节,那么地址0-15是第一个page, 地址16-31是第二个page。假设写入的起始地址data_addr = 17 = 00x11, 那么当前的page从地址17开始,还可以写入15个字节, 也就是0x11~0x1F. 这里PageRemainLen=15.
PageRemainLen = EED_PAGE_SIZE - (data_addr & (EED_PAGE_SIZE - 1));
问: 如果数据大于页的剩余地址 数据地址加pageremainlen是什么意思?
答:问的是这段代码的意思吧?
if(data_length > PageRemainLen)
{
(void)DSPI_Send_Data(DSPI_EEPROM, data_ptr, PageRemainLen);
data_addr += PageRemainLen;
data_ptr += PageRemainLen;
data_length -= PageRemainLen;
}
这里应该是完成当前页的写入(DSPI_Send_Data)之后,将待写入的数据地址、数据指针和数据长度这几个变量做修改,以准备下一次写入剩余数据的操作。这是因为本次只写了PageRemainLen长度的数据,而没有写入全部数据。
剩余页pageremainlen的大小是怎么算的 :
PageRemainLen = EED_PAGE_SIZE - (data_addr & (EED_PAGE_SIZE - 1));
当前页的大小-数据当前还需要多大(最多就是一页的大小)
数据地址加pageremainlen是什么意思:这个就是表示数据已经保存到的位置,每次保存一页的大小,已保存地址就增加一页的
数据地址加pageremainlen是什么意思