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、您好!
您是否可以交叉检查您共享的链接、似乎链接可能已损坏。
此致、
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、您好!
您可以指定闪存部件吗?
此致、
Vaibhav
我更想重点关注使用存储器组的 Stig 读取似乎被限制为16字节的问题。
TI 文档表明它最多应该工作512字节。
如果我做错了将我限制为16个字节的事情、我想知道那是什么。
如果 Am62a 使用存储器组进行 Stig 读取的实际限制是16字节、我认为我可以解决这个问题。
AM62a 是否支持 STIG 存储器组读取大于16个字节?
闪存器件是 Winbond W35N01JWTBIG。