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.

[参考译文] AM2434:GPMC 使用两个 CS 信号

Guru**** 2839510 points

Other Parts Discussed in Thread: SYSCONFIG, AM2434

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1632836/am2434-gpmc-use-two-cs-signals

器件型号: AM2434
主题中讨论的其他器件: SysConfig

您好:

 

我们将 2 个 CS 信号连接到 GPMC:

GPMC0_CSN0 和 GPMC0_CSN1

 

在 SysConfig 中、我找不到使用 GPMC0_CSN1 信号配置另一个 GPMC 的选项

image.png

是否有任何有关如何配置具有 2 个 CS 信号的 GPMC 的示例或应用手册?

谢谢、

Sergei Pilipenko

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

    您好 Sergei、

    感谢您的查询。

    下面是一个 E2E 主题、用于警告当 AM64x GPMC 控制器使用多条 CS 线路(添加多个闪存)时可能会对可靠性/性能产生影响。

    GPMC 存储器大小和已使用芯片选择数量 的约束。请考虑此主题的以下摘录:

      

    在 SysConfig 中、我找不到使用 GPMC0_CSN1 信号配置另一个 GPMC 的选项

    答:请考虑 AM2434 SoC集成了一个 GPMC 控制器。 AM2434 SysConfig 闪存工具中不能添加其他 GPMC。

    SysConfig 中有关 GPMC 限制的 E2E 主题 — 总线宽度,片选数量,实例数量  

    如果这样回答了您的问题、请告诉我。

    谢谢

    此致

    Anastas Yordanov

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

    您好:

    根据:

    SysConfig 中有关 GPMC 限制的 E2E 主题 — 总线宽度,片选数量,实例数量  

    SDK  09.02.00 中应支持多个 CS、  

    我们使用 PSRAM 与 FPGA 和我们正在使用的 SDK 进行通信  ind_comms_sdk_am243x_11_00_00_13。

    此版本是否支持多个 CS?

    谢谢、

    Sergei Pilipenko

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

    嗨、Sergei、

    感谢您的注释。

    我将邀请我们的硬件和软件 GPMC 专家 Marc 和 Anil 回答。

    请预计可能会延迟响应。

    谢谢

    此致、

    Anastas Yordanov

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

    您好 Sergei、


    MCU+ SDK 通过 SysConfig 一次仅支持一个 GPMC 芯片选择。

    SysConfig 工具可为单个 GPMC 实例生成配置、并且仅对一个片选线路 (CS0、CS1、CS2 或 CS3 - USER) 进行编程
    可选,但每个工程仅一个)。

    SDK SysConfig 工具不支持同时使用两条芯片选择线(例如,CS0 用于一个存储器接口、CS1 用于第二个存储器接口)、因此需要对生成的文件进行手动代码更改。
    硬件支持这一点—AM243X GPMC0 有四个独立的片选 (CS0–CS3)、每个都有自己独立的时序、地址窗口和配置寄存器。 驱动程序源代码也通过 chipSel 参数为其提供支持。 只有 SysConfig 层和生成的配置代码仅限于单个实例。


    逐步手动更改:  

    必要条件:
    -从一个有效的单 CS GPMC 工程开始(例如 AM64x EVM 的 GPMC_FLASH_IO 示例,为 CS0 配置)
    -配置用于 CS0 的 SysConfig、配置了 CS0 设备设置
    -运行一次 Sysconfig 生成基本文件,然后将下面的更改应用于生成的文件


    更改 1:ti_drivers_config.h

    查找:
    #define CONFIG_GPMC_NUM_Instances (1U)
    更改为:
    #define CONFIG_GPMC_NUM_Instances (2U)

    更改 2:TI_drivers_config.c - GPMC_HwAttrs

    生成的 gGpmcAttrs[]数组有一个用于 CS0 的条目。 为 CS1 添加第二个条目。 这两个条目共享相同的 gpmcBaseAddr(相同的物理控制器)、但在 chipSelBaseAddr 和时序方面有所不同。

    静态 GPMC_HwAttrs gGpmcAttrs[CONFIG_GPMC_NUM_INM_实例]=

    /*实例 0—CS0、第一个存储器接口*/

    .gpmcBaseAddr = CSL_GPMC0_CFG_BASE、
    .dataBaseAddr = CSL_GPMC0_DATA_BASE、
    .elmBaseAddr = CSL_ELM0_BASE、
    .inputClkFreq = 1333333U、
    .intrNum = CSLR_R5FSS0_CORE0_INTR_GPMC0_GPMC_SINTERRUPT_0、
    .intriority = 4U、
    .chipSelBaseAddr = 0x50000000U、/* CS0 窗口:0x50000000–0x50FFFFFF (16MB)*/
    .chipSelAddrSize = GPMC_CS_MASK_ADDR_SIZE_16MB、
    .clkDivider = CSL_GPMC_CONFIG1_GPMCFCLKDIVIDER_DIVBY1、
    .waitPinNum = CSL_GPMC_CONFIG1_WAITPINSELECT_W0、
    .addrDataMux = CSL_GPMC_CONFIG1_MUXADDDATA_NONMUX、
    .timeLatency = CSL_GPMC_CONFIG1_TIMEPARAGRANULARITY_X1、
    .waitPinPol = CSL_GPMC_CONFIG_WAIT0PINPOLARITY_W0ACTIVEL、
    .timingParams ={/* CS0 设备计时—来自现有生成的配置*/}、
    .dmaRestrictedRegions = gGpmcDmaRestrictRegions、
    }、
    /*实例 1—CS1、第二个存储器接口*/

    .gpmcBaseAddr = CSL_GPMC0_CFG_BASE、/*相同的控制器*/
    .dataBaseAddr = CSL_GPMC0_DATA_BASE、
    .elmBaseAddr = CSL_ELM0_BASE、
    .inputClkFreq = 1333333U、
    .intrNum = CSLR_R5FSS0_CORE0_INTR_GPMC0_GPMC_SINTERRUPT_0、
    .intriority = 4U、
    .chipSelBaseAddr = 0x51000000U、/* CS1 窗口:0x51000000–0x51FFFFFF (16MB)*/
    .chipSelAddrSize = GPMC_CS_MASK_ADDR_SIZE_16MB、
    .clkDivider = CSL_GPMC_CONFIG1_GPMCFCLKDIVIDER_DIVBY1、
    .waitPinNum = CSL_GPMC_CONFIG1_WAITPINSELECT_W0、
    .addrDataMux = CSL_GPMC_CONFIG1_MUXADDDATA_NONMUX、
    .timeLatency = CSL_GPMC_CONFIG1_TIMEPARAGRANULARITY_X1、
    .waitPinPol = CSL_GPMC_CONFIG_WAIT0PINPOLARITY_W0ACTIVEL、
    .timingParams =

    /*设置时序值以匹配第二个器件 (FPGA/NOR/PSRAM)*/
    .csOnTime = 0U、
    .csdOffTime = 6U、
    .csWrOffTime = 6U、
    .advOnTime = 0U、
    .advRdOffTime = 4U、
    .advWrOffTime = 4U、
    .advAadMuxOnTime = 0U、
    .advAadMuxRdOffTime = 0U、
    .advAadMuxWrOffTime = 0U、
    .weOnTtime = 0U、
    .weOffTime = 3U、
    .oeOnTime = 1U、
    .oeOffTime = 4U、
    .oeAadMuxOnTime = 0U、
    .oeAadMuxOffTime = 0U、
    .pageBurstAccess = 0U、
    .rdAccessTime = 4U、
    .wrAcessTime = 6U、
    .rdCycleTime = 6U、
    .wrCycleTime = 6U、
    .wrDataOnMuxBusTime = 0U、
    .cycle2CycleDelay = 0U、
    .busTurnAroundTime = 0U、
    .cycleDelaySameChipSel = CSL_GPMC_CONFIG6_CYCLE2CYCLESAMECSEN_NOC2CDELAY、
    .cycleDelayDiffChipSel = CSL_GPMC_CONFIG6_CYCLE2CYCLEDIFFCSEN_NOC2CDELAY、
    }、
    .dmaRestrictedRegions = gGpmcDmaRestrictRegions、
    }、
    };

    注意:CS0 和 CS1 chipSelBaseAddr 不得重叠。 在使用 GPMC_CS_MASK_ADDR_SIZE_16MB 时、CS0 占用 0x50000000–0x50FFFFFF、CS1 占用 0x51000000–0x51FFFFFF。 两者都位于现有的 GPMC MPU 区域内 — 无需额外的 MPU 区域(请参阅下面的更改 4)。


    更改 3:TI_drivers_config.c - GPMC_PARAMS

    将第二个条目添加到 gGpmcParams[]:

    GPMC_PARAMS gGpmcParams[CONFIG_GPMC_NUM_Instances]=

    /*实例 0—CS0 */

    .gpmcDmaChIndex = 0、/* CS0 的 DMA 通道索引*/
    .devType = CSL_GPMC_CONFIG1_DEVICETYPE_NANDLIKE、/*或 NORLIKE—匹配 CS0 器件*/
    .devSize = CSL_GPMC_CONFIG1_devicesize_EIGHTBITS、
    .chipSel = GPMC_CHIP_SELECT_CS0、
    .intriEnable = false、
    .dmaEnable = true、
    .transferMode = GPMC_TRANSFER_MODE_BLOCKING、
    .memDevice = GPMC_MEM_TYPE_NAND、
    }、
    /*实例 1—CS1 */

    .gpmcDmaChIndex =–1、/*–1 =无 DMA;如果 CS1 也需要 DMA */、则设置为 1
    .devType = CSL_GPMC_CONFIG1_DEVICETYPE_NORLIKE、/*与您的 CS1 器件类型匹配*/
    .devSize = CSL_GPMC_CONFIG1_devicesize_SIXTEENBITS、
    .chipSel = GPMC_CHIP_SELECT_CS1、/*←这是关键字段*/
    .intriEnable = false、
    .dmaEnable = false、
    .transferMode = GPMC_TRANSFER_MODE_BLOCKING、
    .memDevice = GPMC_MEM_TYPE_NORLIKE、
    }、
    };

    ——
    更改 4:TI_pinmux_config.c—添加 GPMC0_CSN1 引脚

    SysConfig 仅生成 GPMC0_CSn0 引脚多路复用条目。 您必须手动添加 GPMC0_CSn1。

    在 gPinMuxMainDomainCfg[]数组中、在现有 GPMC 条目之后添加:

    /* GPMC0_CSn1—手动添加以支持 CS1 */

    PIN_GPMC0_CSN1、
    (PIN_MODE (0)| PIN_PULL_DISABLE | PIN_SLEW_RATE_LOW)
    }、


    更改 5:MPU 区域—无需更改

    SysConfig 配置的现有 GPMC MPU 区域为:


    更改 6:应用程序代码

    在 Drivers_open() 之后、两个 GPMC 句柄可供使用:

    /*在 ti_drivers_open_close.c 中、Drivers_open () 打开所有 CONFIG_GPMC_NUM_Instances 实例*/

    extern GPMC_HANDle gGpmcHandle[CONFIG_GPMC_NUM_INSTANDS];

    GPMC_HANDle hCS0 = gGpmcHandle[0];/* CS0—第一个存储器接口*/
    GPMC_HANDle hCS1 = gGpmcHandle[1];/* CS1—第二个存储器接口*/

    对于直接存储器映射访问(类似 NOR /FPGA):
    /* 0x50000000 处 CS0 器件*/
    Volatile uint16_t *cS0Mem =(volatile uint16_t *) 0x50000000U;

    /* CS1 器件地址为 0x51000000 */
    Volatile uint16_t *cs1Mem =(volatile uint16_t *) 0x51000000U;

    在每个实例的 GPMC_OPEN () 期间、驱动器分别对 CS0 的 GPMC_CONFIG7 (0) 和 CS1 的 GPMC_CONFIG7 (1) 进行编程。 两个实例都打开后、两个 CS 窗口同时处于活动状态。


    重要注意事项:  

    1. SysConfig 重新生成会覆盖手动更改
    每次在 SysConfig 中点击“Generate"或“或使用 SysConfig CLI 重新编译时、ti_drivers_config.h、ti_drivers_config.c 和 ti_pinmux_config.c 都会被覆盖。 您对这些文件的手动更改将丢失。 用于处理此问题的选项:
    -将生成的文件复制到单独的自定义/目录,重命名它们,并在构建中包含自定义副本,而不是生成的副本
    -在初始生成后,完全停止对这些文件使用 Sysconfig

    2.每个设备的定时参数
    CS0 和 CS1 可以具有完全独立的时序寄存器。 将 gGpmcAttrs[1]中的 timingParams 设置为适合您的 CS1 器件的值。 请勿盲目复制 CS0 时序—第二个器件可能具有不同的设置/保持和访问时间要求。

    3.中断共享
    两个 CS 实例共享同一个 GPMC 中断线路 (CSLR_R5FSS0_CORE0_INTR_GPMC0_GPMC_SINTERRUPT_0)。 SDK 每个 GPMC_OPEN () 调用只注册一个中断处理程序。 如果两个实例都使用中断模式、第二个 GPMC_OPEN () 将尝试重新注册相同的中断、并且将失败。 对于两个实例中的至少一个或两个实例、keep intrEnable = false。 请改用轮询或 DMA 传输模式。

    4.等待引脚共享
    GPMC WAIT0 和 WAIT1 信号在所有片选之间共享。 如果 CS1 器件使用与 CS0 不同的等待引脚行为、请在 CS1 GPMC_HwAttrs 中相应地配置 waitPinNum 和 waitPinPol。 如果两个器件使用同一个极性冲突的 WAIT 引脚、则不能同时使用这些引脚。

    5. CS 开关之间的周期间延迟
    当 GPMC 从一个活动 CS 切换到另一个活动 CS 时、timingParams 中的 cycle2CycleDelay 和 cycleDelayDiffChipSel 字段控制 CS 总线间的周转时间。 如果设备在共享总线上的 CS 转换之间需要死区时间、请将 cycleDelayDiffChipSel 设置为非零值。

    此致、

    Anil.