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.
我让 ospi 驱动程序用于读取寄存器等、使用 Stig 发出命令、但仅限8字节数据。
我阅读了文档、可以设置 OSPI_FLASH_CMD_CTRL_REG 的 STIG_MEM_BANK_EN_FLD、以使用存储体传输16至512字节的数据。
我已经尝试让这个工作,但没有任何成功。
是否有示例或说明如何将 存储器组与 STIG 配合使用?
Chris Ouellette
Chris、您好!
到目前为止、我没有看到任何相同的示例、但我将在内部进行检查。
请允许我花点时间查看一下。
此致、
Vaibhav
我有一个最新的新问题。
在哪里可以设置 Stig 记忆库的深度?
我能够使存储器组部分工作。 Stig 存储器组深度似乎设置为16字节。
我正在做的是:
通过以下方式从存储器组读取数据:
重复步骤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
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
感谢您的关注,直到它的结论.很高兴知道我的代码工作正常.
感谢您的关注,直到它的结论.很高兴知道我的代码工作正常.