好的、我有以下问题。 我使用 EMIF SDRAM 存储数据。 当我每1000ms 向 SDRAM 写入数据一段时间时、一切都正常。 但有时会发生数据损坏,如下所示:
这是什么?
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.
好的、我有以下问题。 我使用 EMIF SDRAM 存储数据。 当我每1000ms 向 SDRAM 写入数据一段时间时、一切都正常。 但有时会发生数据损坏,如下所示:
这是什么?
您好、Roman、
您是否意味着写入的数据与回读数据不匹配? 请执行另一项测试:
1.禁用高速缓存:_cacheDisable_()
2.将一组32位字写入 SDRAM:我使用地址作为示例代码中的数据
void WRITW32BIT_ADR (unsigned int Start_Address、 unsigned int No_for_words){
unsigned int *地址 =(unsigned int *) Start_Address;
while (No_of _words > 0) {
*地址++= Start_Address++;
NO_NO_ON_TO_CES--;
}
}
3.读回这些数据,并检查它们是否相互匹配
unsigned int check_emif_memory_32bit_adr (unsigned int Start_Address、unsigned int No_Of_words)
{
unsigned int ReadPattern;
unsigned int *地址=(unsigned int *) Start_Address;
while (NO_Of _words > 0)
{
ReadPattern =*地址++;
if (ReadPattern!= Start_Address)
{
返回(Start_Address);
}
NO_NO_ON_TO_CES--;
START_Address++;
}
返回(0);
}
这是用于 HDK (IS42S1640)上的 SDRAM 的 SDRAM 配置。
void EMIF_SDRAM_StartupInit (void)
{
/*用户代码开始(11)*/
/*用户代码结束*/
易失性 uint32缓冲器;
/*过程 B 第1步: 假定在启动时配置 EMIF 时钟频率*/
/*过程 B 步骤2: 对 SDTIMR 和 SDSRETR 进行编程以满足 SDRAM 器件的要求*/
emifREG->SDTIMR =(uint32)((uint32) 2U << 27U)|
(uint32)((uint32) 0U << 24U)|
(uint32)((uint32) 0U <<23U)|
(uint32)((uint32) 0U << 20U)|
(uint32)((uint32) 0U << 19U)|
(uint32)((uint32) 0U << 16U)|
(uint32)((uint32) 1U <<12U)|
(uint32)((uint32) 2U <<8U)|
(uint32)((uint32) 0U << 7U)|
(uint32)((uint32) 0U << 4U)|
(uint32)((uint32) 0U << 3U);
emifREG->SDSRETR =(uint32) 2U;
/*程序 B 步骤3: 对 SDRCR 的 RR 场进行编程以提供200us 的初始化时间*/
emifREG->SDRCR = 1605U;
/*过程 B 步骤4: 将 SDRCR 编程为触发初始化序列*/
/**- 登记册的一般清零
* -用于 nm 设置16位数据总线
* -cas 延迟
* -BIT11_9CLOCK、以允许写入 cl 字段
* -选择组
* -设置页面大小
*
emifREG->SDCR =(uint32)((uint32) 0U << 31U)|
(uint32)((uint32) 1U <<14U)|
(uint32)((uint32) 2U <<9U)|
(uint32)((uint32) 1U <<8U)|
(uint32)((uint32) 2U << 4U)|
(uint32)((uint32) elements_256);
/*过程 B 步骤5: 读取 SDRAM 内存位置会导致处理器等待 SDRAM 初始化完成*/
缓冲器 =* ptr;
/*阻止优化*/
缓冲器 =缓冲器;
/*过程 B 步骤6: 将 RR 字段编程为 SDRAM*/的默认刷新间隔
emifREG->SDRCR = 585U;
/*将 EMIF 置于自刷新模式以进行时钟更改 *
/*只能写入 SDCR 的高字节以避免 */
/*第二个初始化序列 *
/*字节地址取决于字节序(LE 为0x3U、BE32为0x00)*/
*((unsigned char *)(&emifREG->SDCR)+ 0x0U)= 0x80;
/*用户代码开始(12)*/
/*用户代码结束*/
}