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.

[参考译文] AM6442:带有 PSRAM 的 GPMC 数据中止

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1340013/am6442-gpmc-data-abort-with-psram

器件型号:AM6442

您好!

我们有一款带有 AM6442.A PSRAM (MRAM)的定制电路板、通过16位 GPMC 异步非多路复用数据/地址连接。

我根据代码部分基于 AM26xx PSRAM GPMC 示例、部分基于 AM64xx NAND 闪存示例。

很遗憾、当尝试从 PSRAM 中读取时、我收到数据中止错误。 对于我的生命,我不知道这个问题。

我收到同步外部中止:

而 GPMC 的 ERRORNOTSUPPADD 错误:

我假设 BASEADDRESS 配置错误、但这是由 GPMC 驱动程序"自动"完成的:

下面是我的代码片段:

/* GPMC attributes */
static GPMC_HwAttrs gGpmcAttrs[CONFIG_GPMC_NUM_INSTANCES] =
{
    {
        .gpmcBaseAddr         = CSL_GPMC0_CFG_BASE,
        .dataBaseAddr         = CSL_GPMC0_DATA_BASE,
        .inputClkFreq         = 133333333U,
        .intrNum              = CSLR_R5FSS0_CORE0_INTR_GPMC0_GPMC_SINTERRUPT_0,
        .intrPriority         = 4U,
        .chipSelBaseAddr      = CSL_GPMC0_DATA_BASE,
        .chipSelAddrSize      = GPMC_CS_MASK_ADDR_SIZE_16MB,
        .clkDivider           = CSL_GPMC_CONFIG1_GPMCFCLKDIVIDER_DIVBY4,
        .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         =
        {
            .csOnTime               =   GPMC_PSRAM_CS_ON_TIME,
            .csRdOffTime            =   GPMC_PSRAM_CS_RD_OFF_TIME,
            .csWrOffTime            =   GPMC_PSRAM_CS_WR_OFF_TIME,
            .advOnTime              =   GPMC_PSRAM_ADV_ON_TIME,
            .advRdOffTime           =   GPMC_PSRAM_ADV_RD_OFF_TIME,
            .advWrOffTime           =   GPMC_PSRAM_ADV_WR_OFF_TIME,
            .advAadMuxOnTime        =   GPMC_PSRAM_ADV_AADMUX_ON_TIME,
            .advAadMuxRdOffTime     =   GPMC_PSRAM_ADV_AADMUX_RD_OFF_TIME,
            .advAadMuxWrOffTime     =   GPMC_PSRAM_ADV_AADMUX_WR_OFF_TIME,
            .weOnTtime              =   GPMC_PSRAM_WE_ON_TIME,
            .weOffTime              =   GPMC_PSRAM_WE_OFF_TIME,
            .oeOnTime               =   GPMC_PSRAM_OE_ON_TIME,
            .oeOffTime              =   GPMC_PSRAM_OE_OFF_TIME,
            .oeAadMuxOnTime         =   GPMC_PSRAM_OE_AADMUX_ON_TIME,
            .oeAadMuxOffTime        =   GPMC_PSRAM_OE_AADMUX_OFF_TIME,
            .pageBurstAccess        =   GPMC_PSRAM_PAGEBURST_ACCESS_TIME,
            .rdAccessTime           =   GPMC_PSRAM_RD_ACCESS_TIME,
            .wrAcessTime            =   GPMC_PSRAM_WR_ACCESS_TIME,
            .rdCycleTime            =   GPMC_PSRAM_RD_CYCLE_TIME,
            .wrCycleTime            =   GPMC_PSRAM_WR_CYCLE_TIME,
            .wrDataOnMuxBusTime     =   GPMC_PSRAM_ADMUX_DATA_VALID,
            .cycle2CycleDelay       =   GPMC_PSRAM_C2C_DELAY,
            .cycleDelaySameChipSel  =   CSL_GPMC_CONFIG6_CYCLE2CYCLESAMECSEN_NOC2CDELAY,
            .cycleDelayDiffChipSel  =   CSL_GPMC_CONFIG6_CYCLE2CYCLEDIFFCSEN_NOC2CDELAY,
            .busTurnAroundTime      =   GPMC_PSRAM_BRST_TAROUND_TIME,
        },
        .readType               =   CSL_GPMC_CONFIG1_READTYPE_RDASYNC,
        .csExDelay              =   CSL_GPMC_CONFIG2_CSEXTRADELAY_NOTDELAYED,
        .accessType             =   CSL_GPMC_CONFIG1_READMULTIPLE_RDSINGLE,
    },
};

/* GPMC Driver Parameters */
GPMC_Params gGpmcParams[CONFIG_GPMC_NUM_INSTANCES] =
{
    {
        .gpmcDmaChIndex = -1,
        .devType                =   CSL_GPMC_CONFIG1_DEVICETYPE_NORLIKE,
        .devSize                =   CSL_GPMC_CONFIG1_DEVICESIZE_SIXTEENBITS,
        .chipSel                =   GPMC_CHIP_SELECT_CS0,
        .intrEnable             =   FALSE,
        .dmaEnable              =   FALSE,
        .transferMode           =   GPMC_TRANSFER_MODE_BLOCKING,
        .transferCallBckFunc    =   NULL,
        .memDevice              =   GPMC_MEM_TYPE_PSRAM,
    },
};

int32_t mram_gpmcRead (uint32_t offset, uint8_t *buf, uint32_t len)
{
    int32_t status = SystemP_SUCCESS;
    uint32_t size =  len;

    /*if(offset + len > config->attrs->psramSize)
    {
        status = SystemP_FAILURE;
    }*/
    uint32_t baseAddress = GPMC_DATA_BASE_ADDRESS;

    volatile uint16_t *pSrc = (volatile uint16_t *)(offset+baseAddress);
    volatile uint16_t *pDst = (volatile uint16_t *)buf;
    uint32_t  remain = size & 0x1;

    if (remain != 0U)
    {
        size = size - remain + 2U;
    }

    while (size != 0U)
    {
        *pDst = *pSrc;
        pSrc++;
        pDst++;
        size -= 2U;
    }

    return status;
}

我非常感谢您的支持。

您好
斯特凡

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

    斯特凡 

     

    ·海 分配此主题的同事不在办公室,因此下周您可能会看到更多回答。 快速健全性检查将确保没有出现因器件勘误表所致的任何问题 www.ti.com/.../sprz457h.pdf i2313
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Stefan、您好、

    您能否尝试在 AM64X 中使用相同的 AM263 GPMC PSRAM 驱动程序? 因为大多数情况下两个 GPMC IP 是相同的。

    实际上、根据 AM263的时序参数读写 API 将集成 在 AM64X 中、看看您是否能够执行读写操作。

    由于到目前为止、我们不支持针对 PSRAM 存储器的 AM64X、因此将在未来版本中发布。

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/EXAMPLES_DRIVERS_GPMC_PSRAM_IO.html

    此致、

    S.Anil.

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

    您好!

    非常感谢您的快速回复!

    我使 GPMC PSRAM 正常运行。 问题是 gpmc_v0.c 中的第197行

    int32_t GPMC_configureTimingParametersPsram(GPMC_Handle handle)
    {
    ...
            CSL_REG32_WR(hwAttrs->gpmcBaseAddr + CSL_GPMC_CONFIG7(object->params.chipSel), 0xf28);
    ...
    }

    覆盖之前在"GPMC_programInstancePsram ()"中完成的所有 CS 地址配置

    我想这是驱动器中的一个错误。

    您好
    斯特凡