主题中讨论的其他器件:SysConfig
工具与软件:
你(们)好
我需要使用 memcpy 为我的应用程序读取和写入外部闪存。 您能给我提供一个示例吗、在该示例中、我可以看到实现此功能所需的配置吗?
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.
尊敬的 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 读取。
尊敬的 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:
我这样做是因为在我的应用程序中、我需要使用 memcpy 来读取闪存
您能否检查是否在 OSPI 的 SysConfig 设置中启用了 DMA?
如果是、请将其禁用。 也像 以前一样恢复驱动程序。 如果 未启用 DMA、则驱动程序本身使用 memcpy。
此致、
Rijohn
尊敬的 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);
我们已经对此进行了测试、它正在工作。