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.

[参考译文] PROCESSOR-SDK-AM62X:是否有使用存储器组通过 Stig 命令读取超过8个字节的 ospi 示例?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1196536/processor-sdk-am62x-is-there-an-ospi-example-that-uses-the-memory-bank-to-read-more-than-8-bytes-with-a-stig-command

器件型号:PROCESSOR-SDK-AM62X

我让 ospi 驱动程序用于读取寄存器等、使用 Stig 发出命令、但仅限8字节数据。

我阅读了文档、可以设置 OSPI_FLASH_CMD_CTRL_REG 的 STIG_MEM_BANK_EN_FLD、以使用存储体传输16至512字节的数据。

我已经尝试让这个工作,但没有任何成功。

是否有示例或说明如何将 存储器组与 STIG 配合使用?

Chris Ouellette

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

    Chris、您好!

    到目前为止、我没有看到任何相同的示例、但我将在内部进行检查。

    请允许我花点时间查看一下。

    此致、

    Vaibhav

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

    我有一个最新的新问题。

    在哪里可以设置 Stig 记忆库的深度?

    我能够使存储器组部分工作。 Stig 存储器组深度似乎设置为16字节。

    我正在做的是:

    1. 设置 FLASH_cmd_ctrl 寄存器(cmd_opcode_fld=read、enab_read_data_fld=1、num_rd_data_bytes_fld=7、enb_comd_addr_fld=1、num_addr_bytes_fld=1、 num_demy_cycles_fld=0、Stig_mem_Bank_en_fld=1
    2. 设置 FLASH_COMMAND_CTRL_Mem 寄存器 mem_Bank_addr_fld=0、NB_of_Stig_read_Bytes_fld=0
    3. 将 flash_cmd_addr 设置为足以读取的地址
    4. 将 flash_cmd_ctrl cmd_exec_fld 设置为 1
    5. 等待 STIG 命令完成

    通过以下方式从存储器组读取数据:

    1. 设置 FLASH_COMMAND_CTRL_MEM 寄存器 mem_TRIGGER_mem_BANK_req_fld=1
    2. 读取 flash_command_ctrl_mem 寄存器以从 mem_Bank_read_data_fld 获取数据
    3. 增加 flach_command_ctrl_mem 寄存器中的 mem_Bank_addr_fld

    重复步骤1至3以读取16个字节的数据

    该功能工作正常。

    但如果我将其设置为 读取32个字节 of data (flash_command_ctrl_mem 寄存器 NB_of_Stig_read_Bytes_fld=1)、 重复预期数据的最后16个字节。

    TRM 指出: "如果根据 OSPI_FLASH_COMMAND_CTRL_MEM_REG_REG[18-16]中的定义在 Stig 中读取的字节数
    NB_OF_STIG_READ_BYDS_FLD 位字段超过存储器组深度、剩余数据将被覆盖
    Stig 存储器组位置从其第一个地址开始。"

    TRM 还指出: "如果使用目标中的 Stig 读取的最大字节数
    应用小于512、Stig 存储器组的深度可设置为较小的值、从而实现保存
    这是整个地区的一个明显的部分。"

    STIG 存储库设置的深度在哪里?

    Chris

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

    有任何更新吗? 我什么时候可以得到答案?

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

    Chris、您好!

    您能否共享在读取16个字节数据方面工作正常的代码/文件。

    我正在检查如何设置 Stig 记忆库的深度。

    我会在一两天内回复你。

    此致、

    Vaibhav

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

    Chris、您好!

      基本上、可借助 NB_OF_Stig_READ_BYTES_FLD 来设置 Stig 存储器组的深度。

      这应该足以满足相同的要求、您无需在其他任何位置更改深度。

      此外,我将与 IP 所有者核实,并让你知道是否读8+字节的数据是在 STIG 模式下验证。

    谢谢。

    Vaibhav

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

    我已经附上了我的代码副本。

    我设置 NB_OF_STIG_READ_BYTES_FLD。

    为了清楚起见、我的代码可以正确读取16个字节(大于正常 Stig 命令预期的8个字节)。

    但如果我尝试读取32个字节、则读取的数据是16个字节的2个副本。

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

    Chris、您好!

    您是否可以交叉检查您共享的链接、似乎链接可能已损坏。

    此致、

    Vaibhav

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

    这是规范。 我无法使文件附件正常工作。

    typedef 结构{
    volatile uint32_t config at (0x00);
    Volatile uint32_t DEV_instr_rd_config at (0x04);
    Volatile uint32_t DEV_instr_wr_config at (0x08);
    (0x0c)处的 Volatile uint32_t DEV_DELAY;
    Volatile uint32_t RD_DATA_CAPTURE (0x10);
    Volatile uint32_t DEV_SIZE_CONFIG 位于(0x14);
    volatile uint32_t SRAM_PARTITION_cfg at (0x18);
    (0x1c)处的 Volatile uint32_t ind_ahb_addr_trigger;
    volatile uint32_t dma_periph_config at (0x20);
    volatile uint32_t remap_addr at (0x24);
    volatile uint32_t MODE_BIT_CONFIG 位于(0x28);
    volatile uint32_t SRAM_fill at (0x2C);
    Volatile uint32_t TX_THRESH at (0x30);
    在(0x34)处具有易失性 uint32_t rx_thresh;
    volatile uint32_t write_completion_ctrl at (0x38);
    volatile uint32_t no_of_polls_bef_exp、位于(0x3c);
    volatile uint32_t IRQ_STATUS (0x40);
    Volatile uint32_t IRQ_MASK at (0x44);
    GAP32 (0x48、0x50);
    Volatile uint32_t lower_wr_prot at (0x50);
    volatile uint32_t upper_power_prot at (0x54);
    volatile uint32_t power_prot_ctrl at (0x58);
    GAP32 (0x5c、0x60);
    volatile uint32_t inirter_read_xfer_ctrl、位于(0x60);
    Volatile uint32_t INDIRECT_READ_xFER_水线 位(0x64);
    位于(0x68)的 Volatile uint32_t indirial_read_xfer_start;
    volatile uint32_t indirial_read_xfer_num_Bytes at (0x6c);
    volatile uint32_t indirial_WRITE_xfer_ctrl、位于(0x70);
    Volatile uint32_t INDIRECT_WRITE_xfer_水线 位于(0x74);
    位于(0x78)的 Volatile uint32_t INDIRTE_WRITE_xfer_start;
    volatile uint32_t indirial_write_xfer_num_Bytes at (0x7c);
    volatile uint32_t intery_trigger_addr_range at (0x80);
    GAP32 (0x84、0x8c);
    volatile uint32_t flash_command_ctrl_mem 位于(0x8c);
    volatile uint32_t flash_cmd_ctrl at (0x90);
    volatile uint32_t flash_cmd_addr 位于(0x94);
    GAP32 (0x98、0xa0);
    Volatile uint32_t FLASH_RD_DATA_LOWER、位于(0xa0);
    Volatile uint32_t FLASH_RD_DATA_UPPER AT (0xa4);
    Volatile uint32_t flash_wr_data_low、位于(0xa8);
    volatile uint32_t flash_wr_data_upper at (0xac);
    volatile uint32_t polling_flash_status at (0xb0);
    volatile uint32_t phy_configuration at (0xb4);
    volatile uint32_t phy_master_control at (0xb8);
    volatile uint32_t dll_observerable_low at (0xbc);
    volatile uint32_t dll_observerable_upper at (0xc0);
    GAP32 (0xc4、0xe0);
    volatile uint32_t opcode_ext_lower at (0xe0);
    volatile uint32_t opcode_ext_upper at (0xe4);
    GAP32 (0xe8、0xFC);
    volatile uint32_t module_id at (0xFC);
    }Cadence_qspi_reg_t;

    //配置请求位
    #define CQSPI_CONFIG_IDLE (1<<31)

    //闪存 cmd Ctrl 寄存器位
    #define CQSPI_FLASH_CMD_CTRL_CMD_OPCODE_LSB (24)
    #define CQSPI_FLASH_CMD_CTRL_ENB_CMD_ADDR_FLD (1<<19)
    #define CQSPI_FLASH_CMD_CTRL_NUM_ADDR_BYTES_LSB (16)
    #define CQSPI_FLASH_CMD_CTRL_NUM_DUMP_CYCES_LSB (7)
    #define CQSPI_FLASH_CMD_CTRL_Stig_MEM_BANK_EN (1<<2)
    #define CQSPI_FLASH_CMD_CTRL_CMD_EXEC (1<<0)

    //闪存命令 ctrl mem 寄存器位
    #define CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_LSB (20)
    #define CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_MASK (0x1ff << CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_LSB)
    #define CQSPI_FLASH_CMD_CTRL_MEM_NB_OF_STIG_READ_BYTES_LSB (16)
    #define CQSPI_FLASH_CMD_CTRL_MEM_BANK_READ_DATA_LSB (8)
    #define CQSPI_FLASH_CMD_CTRL_MEM_BANK_READ_DATA_MASK (0xff << CQSPI_FLASH_CMD_CTRL_MEM_BANK_READ_DATA_LSB)
    #define CQSPI_FLASH_CMD_CTRL_MEM_BANK_REQ_IN_PROGRESS (1<<1)
    #define CQSPI_FLASH_CMD_CTRL_MEM_TRIGGER_MEM_BANK_REQ (1<<0)

    外部易失性 Cadence_qspi_reg_t* qspi_reg;
    uint8_t 命令;
    uint8_t NumDummyClks;
    uint32_t cmdCtrl;
    uint32_t AddrLen;
    uint32_t DataBuf[8];
    uint32_t DataLen;
    uint32_t x;
    uint32_t 计数;

    CMD = 3;
    NumDummyClks = 8;
    ADDR = 0;
    AddrLen = 2;
    DataLen = sizeof (DataBuf);

    //使用存储器组存取
    cmdCtrl = Cmd << CQSPI_FLASH_CMD_CTRL_CMD_OPCODE_LSB |
    (NumDummyClks << CQSPI_FLASH_CMD_CTRL_NUM_DUMP_CYCLES_LSB)|
    CQSPI_FLASH_CMD_CTRL_Stig_MEM_BANK_EN;

    //添加地址?
    cmdCtrl |= CQSPI_FLASH_CMD_CTRL_ENB_CMD_ADDR_FLD |
    ((AddrLen - 1)<< CQSPI_FLASH_CMD_CTRL_NUM_ADDR_BYTES_LSB);
    qspi_reg->flash_cmd_addr =地址;

    qspi_reg->flash_cmd_ctrl = cmdCtrl;

    //设置字节的数量16-512,定义为 x,其中2**(x+4)是
    //字节数
    x = 32 -__CLZ32 (DataLen);

    //针对 DataLen 进行2的幂调节
    如果((1 <<(x - 1))== DataLen)
    X-;

    //进行缩放,因此 x = 0 => 16个字节
    X-= 4;

    QSPI_REG->FLASH_COMMAND_CTRL_Mem = 0 << CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_LSB |
    x << CQSPI_FLASH_CMD_CTRL_MEM_NB_OF_STIG_READ_BYES_LSB;

    //执行命令
    qspi_reg->flash_cmd_ctrl |= CQSPI_FLASH_CMD_CTRL_CMD_EXEC;

    //等待命令事务完成。
    while (((qspi_reg->config &(uint32_t) CQSPI_CONFIG_IDLE)=0);

    //从存储器组读取数据

    计数= 0;
    while (count < DataLen)

    //设置地址
    qSPI_REG->FLASH_COMMAND_CTRL_Mem &=~(CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_MASK);
    qspi_reg->flash_command_ctrl_mem |=(计数<< CQSPI_FLASH_CMD_CTRL_MEM_BANK_ADDR_LSB);

    //触发存储器组读取
    qspi_reg->flash_command_ctrl_mem |= CQSPI_FLASH_CMD_CTRL_MEM_TRIGGER_MEM_BANK_REQ;

    //等待数据
    while (((qspi_reg->flash_command_ctrl_mem &
    CQSPI_FLASH_CMD_CTRL_MEM_BANK_REQ_IN_PROGRESS)!= 0)

    //读取下一个字节
    DataBuf[count]=(qSPI_reg->flash_command_ctrl_mem 和 CQSPI_FLASH_CMD_CTRL_MEM_BANK_READ_DATA_MASK)
    >> CQSPI_FLASH_CMD_CTRL_MEM_BANK_READ_DATA_LSB;

    //下一步
    计数++;
    }

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

    Chris、您好!

    感谢代码。

    同时、您还能说明一点。

    您是否尝试启用 Stig 超过16字节的某个用例? 还是仅仅为了使软件支持所有已记录的 IP 功能、而在这种背景下提供了这种支持?

    此致、

    Vaibhav

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

    我在尝试从闪存器件读取器件 ID 时遇到了这种情况。 我们的典型驱动程序为 ID 读取20个字节的数据、但根据器件的不同、许多数据将为0。

    此致、

    Chris

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

    Chris、您好!

    您可以指定闪存部件吗?

    此致、

    Vaibhav

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

    我更想重点关注使用存储器组的 Stig 读取似乎被限制为16字节的问题。

    TI 文档表明它最多应该工作512字节。

    如果我做错了将我限制为16个字节的事情、我想知道那是什么。

    如果 Am62a 使用存储器组进行 Stig 读取的实际限制是16字节、我认为我可以解决这个问题。

    AM62a 是否支持 STIG 存储器组读取大于16个字节?

    闪存器件是 Winbond W35N01JWTBIG。

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

    Chris、您好!

    请允许我花一天时间与您联系。  

    我更愿意关注使用内存库的 Stig 读取似乎被限制为16字节的问题

    我将与其他团队成员进行本次讨论、并确保回答您突出强调的问题。

    此致、

    Vaibhav

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

    Chris、您好!

    我已经与 IP 所有者验证过、我们所有器件中使用的配置都是静态的、并设置为16个字节。

    TRM 将逐渐更新以反映 STIG 从512字节到16字节的更改。

    请告诉我这是否有帮助。

    此致、

    Vaibhav

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

    感谢您的关注,直到它的结论.很高兴知道我的代码工作正常.

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

    感谢您的关注,直到它的结论.很高兴知道我的代码工作正常.

x 出现错误。请重试或与管理员联系。