This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-AM261:使用 memcpy 从外部闪存读取的示例

Guru**** 2463330 points
Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1474514/lp-am261-example-for-using-memcpy-to-read-from-external-flash

器件型号:LP-AM261
主题中讨论的其他器件:SysConfig

工具与软件:

你(们)好

我需要使用 memcpy 为我的应用程序读取和写入外部闪存。  您能给我提供一个示例吗、在该示例中、我可以看到实现此功能所需的配置吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    感谢您的提问。


    您能告诉我们使用的是哪个闪存器件型号吗? 为了快速入门、我们 mcu_plus_sdk_am261x_10_00_01_10中使用 ospi_flash_io 示例

    路径:C:\ti\mcu_plus_sdk_am261x_10_00_01_10\examples\drivers\ospi\ospi_flash_io



    谢谢、此致、
    Rijohn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我使用板载闪存、即 IS25WX064

    AM261的 Flashio 示例不使用 memcpy 直接读取闪存内容。  
    ospi_flash_io.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请查看以下示例。 我正在尝试使用 memcpy 来读取闪存。 它进入中止处理程序。  我还定义了区域。  

    在我的应用程序中,我需要使用 memcpy 来读取闪存,我正在闪存 IO 示例中尝试此操作。 我对 FLASH Read 语句进行了注释、并尝试使用 memcpy 读取。  

    ospi_flash_io.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    对于延迟、我们深表歉意。

    抱歉、我给出了 am263px MCU_PLUS_SDK 路径、而不是 AM261x 路径

    正确的路径: C:\ti\mcu_plus_sdk_am261x_10_00_01_10\examples\drivers\ospi\ospi_flash_io

    此外、
    请在此路径 C:\ti\mcu_plus_sdk_am261x_10_00_01_10\source\sysconfig\board\.meta\flash 中添加以下附加的 SysConfig 文件
    e2e.ti.com/.../IS25WX064.json

    另外、在 flash_am261x.syscfg 文件中、请确保  defaultFlashConfigLP 和  getDefaultFlashName else 部分将 IS25WX064闪存作为输入。

     


    完成这些步骤后、导入 ospi_flash_io 示例、并验证在 ospi_flash_io 示例中查看 example.sysconfig 文件中的默认值。



    此致、
    Rijohn



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    删除工程并重新导入后、闪存名称不变、但器件 ID 改变




    以下是在 json 中进行的更改  

    我将闪存名称手动更改为 IS25WX064并构建了工程。 生成的代码如下。  

    /*
     * FLASH
     */
    /* FLASH Object - initialized during Flash_open() */
    Flash_NorOspiObject gFlashObject_IS25WX064;
    
    /* FLASH Driver handles - opened during Board_flashOpen() */
    Flash_Handle gFlashHandle[CONFIG_FLASH_NUM_INSTANCES];
    
    /* FLASH Attrs */
    Flash_Attrs gFlashAttrs_IS25WX064 =
    {
        .flashName = "IS25WX064",
        .deviceId = 0x5B17,
        .manufacturerId = 0x9D,
        .flashSize = 8388608,
        .blockCount = 64,
        .blockSize = 131072,
        .pageCount = 512,
        .pageSize = 256,
        .sectorCount = 2048,
        .sectorSize = 4096,
        .phyTuningOffset = 8388608/2,
    };
    
    /* FLASH DevConfig */
    Flash_DevConfig gFlashDevCfg_IS25WX064 =
    {
        .cmdExtType = OSPI_CMD_EXT_TYPE_REPEAT,
        .enable4BAddr = TRUE,
        .addrByteSupport = 1,
        .fourByteAddrEnSeq = 0,
        .cmdWren = 0x06,
        .cmdRdsr = 0x05,
        .srWip = (1 << 0),
        .srWel = (1 << 1),
        .xspiWipRdCmd = 0x05,
        .xspiWipReg = 0x00000000,
        .xspiWipBit = (1 << 0),
        .resetType = 0x30,
        .eraseCfg = {
            .blockSize = 131072,
            .sectorSize = 4096,
            .cmdBlockErase3B = 0xD8,
            .cmdBlockErase4B = 0xDC,
            .cmdSectorErase3B = 0x20,
            .cmdSectorErase4B = 0x21,
            .cmdChipErase = 0xC7,
        },
        .idCfg = {
            .cmd = 0x9F, /* Constant */
            .numBytes = 3,
            .dummy4 = 0,
            .dummy8 = 8,
            .addrSize = 0
        },
        .protocolCfg = {
            .protocol = FLASH_CFG_PROTO_8D_8D_8D,
            .isDtr = TRUE,
            .cmdRd = 0x7C,
            .cmdWr = 0x84,
            .modeClksCmd = 0,
            .modeClksRd = 0,
            .dummyClksCmd = 16,
            .dummyClksRd = 16,
            .enableType = 0,
            .enableSeq = 0x00,
            .protoCfg = {
                .isAddrReg = TRUE,
                .cmdRegRd = 0x85,
                .cmdRegWr = 0x81,
                .cfgReg = 0,
                .shift = 0,
                .mask = 0xff,
                .cfgRegBitP = 231,
            },
            .strDtrCfg = {
                .isAddrReg = TRUE,
                .cmdRegRd = 0x85,
                .cmdRegWr = 0x81,
                .cfgReg = 0x00000000,
                .shift = 255,
                .mask = 255,
                .cfgRegBitP = 0,
            },
            .dummyCfg = {
                .isAddrReg = TRUE,
                .cmdRegRd = 0x85,
                .cmdRegWr = 0x81,
                .cfgReg = 1,
                .shift = 0,
                .mask = 0xFF,
                .cfgRegBitP = 16,
            },
        },
        .flashWriteTimeout = 120,
        .flashBusyTimeout = 72000000,
    };
    
    /* FLASH Config */
    Flash_Config gFlashConfig[CONFIG_FLASH_NUM_INSTANCES] =
    {
        {
            .attrs = &gFlashAttrs_IS25WX064,
            .fxns = &gFlashNorOspiFxns,
            .skipHwInit = FALSE,
            .devConfig = &gFlashDevCfg_IS25WX064,
            .object = (void *)&gFlashObject_IS25WX064,
            .rwOffset = 0,
        },
    };
    

    在示例项目(闪存 IO)中进行下述更改并运行代码时、我仍将进入 abort 处理程序。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    感谢您的答复。

    您能解释一下为什么给我注释掉了吗?
    您是否可以尝试取消注释并运行它?

    此致、
    Rijohn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我之所以这么做、是因为在我的应用程序中、我需要使用 memcpy 来读取闪存。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    我这样做是因为在我的应用程序中、我需要使用 memcpy 来读取闪存

    您能否检查是否在 OSPI 的 SysConfig 设置中启用了 DMA?
    如果是、请将其禁用。 也像 以前一样恢复驱动程序。 如果 未启用 DMA、则驱动程序本身使用 memcpy。

    此致、
    Rijohn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    如果我取消注释该代码、那么它使用 Flash_READ API 工作、但在我的应用程序代码(更高层)中、我们使用来自闪存的 memcpy 到 cpy 数据、因此我只能使用 memcpy 语句。  


    无论 DMA 是启用还是禁用、memcpy 语句都不起作用...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    请参阅以下代码/步骤来使 memcopy 正常工作:

    1.使用 ospi_io 示例

    // status = Flash_READ (gFlashHandle[CONFIG_FLASH0]、offset、gOspiRxBuf、APP_OSPI_DATA_SIZE);
    状态= OSPI_enableDacMode (gOspiHandle[0]);
    uint8_t * pSrc =(uint8_t *)(0x60200000);
    uint8_t * pDst =(uint8_t *) gOspiRxBuf_cpy;
    memcpy (pDst、pSrc、0x800);

    我们已经对此进行了测试、它正在工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请参阅缓冲器比较:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题是、我在  OSPI_enableDacMode 中传递了错误的句柄。  

    谢谢