闻方 2022-04-21 09:30 采纳率: 60%
浏览 37
已结题

EEPROM写入的时候 剩余页pageremainlen的大小是怎么算的 如果数据大于页的剩余地址 数据地址加pageremainlen是什么意思

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);

}

  • 写回答

2条回答 默认 最新

  • bobhuang 2022-04-21 11:38
    关注

    问: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长度的数据,而没有写入全部数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 修改了问题 4月21日
  • 创建了问题 4月21日

悬赏问题

  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件