我的系统基于pxa255+wce4.2,外挂2个bank的sdram,每个bank接64M,由两片32M组成。我在eboot中为测试sdram,就分别对两个bank的地址进行读写(每个bank的低400字节),发现bank0可以正常读写,也即读写数据一致;bank1读写数据不一致,且每次读出的数据还不一样。
请问会是什么原因呢?硬件?还是内存映射问题?
另外,我用示波器观察sdram的引脚时,发现clk信号是正弦波,频率正常;但是片选信号在eboot启动后就出现周期性的低电平(不规则),且两个bank的片选周期还不一样(bank0为800KHZ,bank1为200KHZ);在循环读写时,发现片选信号的频率会有2KHZ左右的升高!
8 个解决方案
#1
不好意思帮不上忙啊
#2
我觉得你的已经有一个内存读写正常。
另外一个不正常,这说明不是软件的问题,是你的接线没有接好。先和硬件工程师查找原因,看是否应该这样接。
——
没有ADS的东西,真不是那么好开发的。
另外一个不正常,这说明不是软件的问题,是你的接线没有接好。先和硬件工程师查找原因,看是否应该这样接。
——
没有ADS的东西,真不是那么好开发的。
#3
接线问题?两个bank的接线基本一样,区别就在于片选不一样。而且观察发现两个bank的片选信号波形不一致,差别挺大。
有没有可能我的数据没有写入SDRAM,而是写到CACHE里,所以数据读出是随机的?
有没有可能我的数据没有写入SDRAM,而是写到CACHE里,所以数据读出是随机的?
#4
时钟等都要注意的。
你要仔细看内存控制器那章节,肯定会发现问题。
#5
我的两个bank的SDRAM,第一个bank除了内核部分外,其余部分以RAM的形式在config.bib文件中声明(类型为RAM);第2个bank在OEMGetExtensionDRAM函数中声明:
BOOL OEMGetExtensionDRAM(LPDWORD lpMemStart, LPDWORD lpMemLen)
{
/* This is called by the Kernel so see if there is any DRAM beyond
what is reported through Config.bib
*/
//blue add
*lpMemStart = 0x94200000;
*lpMemLen = 0x04000000;
return TRUE;
//return FALSE; // no extension DRAM
}
其中0x94200000就是第2个bank的虚拟起始地址(cached)。
我在eboot中读写第2个bank的前400个字节(从0xB4200000开始),数据读写不一致,且每次读出的都不一样。
BOOL OEMGetExtensionDRAM(LPDWORD lpMemStart, LPDWORD lpMemLen)
{
/* This is called by the Kernel so see if there is any DRAM beyond
what is reported through Config.bib
*/
//blue add
*lpMemStart = 0x94200000;
*lpMemLen = 0x04000000;
return TRUE;
//return FALSE; // no extension DRAM
}
其中0x94200000就是第2个bank的虚拟起始地址(cached)。
我在eboot中读写第2个bank的前400个字节(从0xB4200000开始),数据读写不一致,且每次读出的都不一样。
#6
SDRAM的Controller是需要配置的。255支持4个SDRAM的#SDCS,每个都需要单独配置及打开。一般这个动作是在汇编部分,MMU打开之前做的。你仅仅在OEM程序中提交了地址是不够的。
#7
SDRAM的控制器我已经在EBOOT的汇编中设置好了。
两套一模一样的板子,一样的EBOOT(包含测试代码),一个板子上可以正常读写;另外一套板子就只有低64M(第1个bank)可以正常读写,高64M(第2个bank)就是读写不一致,且每次读出都不相同。
是不是板子上的SDRAM坏了呢?还是SDRAM本身没有问题,电路有问题?它们会导致读写不一致,且每次读出是随机的吗?
两套一模一样的板子,一样的EBOOT(包含测试代码),一个板子上可以正常读写;另外一套板子就只有低64M(第1个bank)可以正常读写,高64M(第2个bank)就是读写不一致,且每次读出都不相同。
是不是板子上的SDRAM坏了呢?还是SDRAM本身没有问题,电路有问题?它们会导致读写不一致,且每次读出是随机的吗?
#8
估计是坏了。换个试试。内存比较用容易换。
#1
不好意思帮不上忙啊
#2
我觉得你的已经有一个内存读写正常。
另外一个不正常,这说明不是软件的问题,是你的接线没有接好。先和硬件工程师查找原因,看是否应该这样接。
——
没有ADS的东西,真不是那么好开发的。
另外一个不正常,这说明不是软件的问题,是你的接线没有接好。先和硬件工程师查找原因,看是否应该这样接。
——
没有ADS的东西,真不是那么好开发的。
#3
接线问题?两个bank的接线基本一样,区别就在于片选不一样。而且观察发现两个bank的片选信号波形不一致,差别挺大。
有没有可能我的数据没有写入SDRAM,而是写到CACHE里,所以数据读出是随机的?
有没有可能我的数据没有写入SDRAM,而是写到CACHE里,所以数据读出是随机的?
#4
时钟等都要注意的。
你要仔细看内存控制器那章节,肯定会发现问题。
#5
我的两个bank的SDRAM,第一个bank除了内核部分外,其余部分以RAM的形式在config.bib文件中声明(类型为RAM);第2个bank在OEMGetExtensionDRAM函数中声明:
BOOL OEMGetExtensionDRAM(LPDWORD lpMemStart, LPDWORD lpMemLen)
{
/* This is called by the Kernel so see if there is any DRAM beyond
what is reported through Config.bib
*/
//blue add
*lpMemStart = 0x94200000;
*lpMemLen = 0x04000000;
return TRUE;
//return FALSE; // no extension DRAM
}
其中0x94200000就是第2个bank的虚拟起始地址(cached)。
我在eboot中读写第2个bank的前400个字节(从0xB4200000开始),数据读写不一致,且每次读出的都不一样。
BOOL OEMGetExtensionDRAM(LPDWORD lpMemStart, LPDWORD lpMemLen)
{
/* This is called by the Kernel so see if there is any DRAM beyond
what is reported through Config.bib
*/
//blue add
*lpMemStart = 0x94200000;
*lpMemLen = 0x04000000;
return TRUE;
//return FALSE; // no extension DRAM
}
其中0x94200000就是第2个bank的虚拟起始地址(cached)。
我在eboot中读写第2个bank的前400个字节(从0xB4200000开始),数据读写不一致,且每次读出的都不一样。
#6
SDRAM的Controller是需要配置的。255支持4个SDRAM的#SDCS,每个都需要单独配置及打开。一般这个动作是在汇编部分,MMU打开之前做的。你仅仅在OEM程序中提交了地址是不够的。
#7
SDRAM的控制器我已经在EBOOT的汇编中设置好了。
两套一模一样的板子,一样的EBOOT(包含测试代码),一个板子上可以正常读写;另外一套板子就只有低64M(第1个bank)可以正常读写,高64M(第2个bank)就是读写不一致,且每次读出都不相同。
是不是板子上的SDRAM坏了呢?还是SDRAM本身没有问题,电路有问题?它们会导致读写不一致,且每次读出是随机的吗?
两套一模一样的板子,一样的EBOOT(包含测试代码),一个板子上可以正常读写;另外一套板子就只有低64M(第1个bank)可以正常读写,高64M(第2个bank)就是读写不一致,且每次读出都不相同。
是不是板子上的SDRAM坏了呢?还是SDRAM本身没有问题,电路有问题?它们会导致读写不一致,且每次读出是随机的吗?
#8
估计是坏了。换个试试。内存比较用容易换。