打印

已解决 -- 问题请教:SDRAM从32bit换为16bit,程序跑不起来

[复制链接]
12305|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nicholasldf 于 2009-11-23 16:50 编辑

CPU为at91sam9260,AT91BootStrap在9260内部SRAM运行,应用程序在SDRAM运行。SDRAM为MT48LC16M16A2,在第一级bootloader AT91BootStrap初始化SDRAM,进入应用程序后不做重新的初始化。

现象为:
     (1)在EBD9260开发板:由2片MT48LC16M16A2组成64M 32BIT的SDRAM存储器,可以运行AT91BootStrap和应用程序。

     (2)在我们的板子上:由1片MT48LC16M16A2组成32M 16BIT的存储器,在AT91BootStrap的SDRAM初始化代码中,将数据总线改为16BIT,容量改为32M。AT91BootStrap是正常运行的,可以输出启动信息:
     ------------- AT91bootstrap Project -------------
     Load uCOS-II App Image , Jump to addr 0x2000_0000
但跳到SDRAM后,应用程序跑不了。

      (3)在atmel的SAM-BA软件里测试SDRAM,可以修改SDRAM数值,不知道这个是否能验证SDRAM硬件是正常的??

按理说,SDRAM只修改数据宽度为16BIT就行了呀。

在AT91BootStrap的board_memories.c文件,SDRAM初始化代码如下:
void BOARD_ConfigureSdram(unsigned char busWidth)
{
    volatile unsigned int i;
    static const Pin pinsSdram = PINS_SDRAM;
    volatile unsigned int *pSdram = (unsigned int *) AT91C_EBI_SDRAM;
    unsigned short sdrc_dbw = 0;

    switch (busWidth) {
        case 16:
            sdrc_dbw = AT91C_SDRAMC_DBW_16_BITS;
            break;
        case 32:
        default:
            sdrc_dbw = AT91C_SDRAMC_DBW_32_BITS;
            break;
    }

    // Enable corresponding PIOs
    PIO_Configure(&pinsSdram, 1);//注:由于是16bit,D16-D32可以屏蔽,但无论是否屏蔽,程序都运行不了。
   
    // Enable EBI chip select for the SDRAM, VDDIOMSEL set: memories are 3.3V powered
    WRITE(AT91C_BASE_MATRIX, MATRIX_EBI, AT91C_MATRIX_CS1A_SDRAMC | (1 << 16));
   
    // CFG Control Register
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_CR, AT91C_SDRAMC_NC_9
                                        | AT91C_SDRAMC_NR_13
                                        | AT91C_SDRAMC_CAS_2
                                        | AT91C_SDRAMC_NB_4_BANKS
                                        | sdrc_dbw
                                        | AT91C_SDRAMC_TWR_2
                                        | AT91C_SDRAMC_TRC_7
                                        | AT91C_SDRAMC_TRP_2
                                        | AT91C_SDRAMC_TRCD_2
                                        | AT91C_SDRAMC_TRAS_5
                                        | AT91C_SDRAMC_TXSR_8);
    for (i = 0; i < 1000; i++);
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NOP_CMD);    // Perform NOP
    pSdram[0] = 0x00000000;
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_PRCGALL_CMD);    // Set PRCHG AL
    pSdram[0] = 0x00000000;                        // Perform PRCHG
    for (i = 0; i < 10000; i++);
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 1st CBR
    pSdram[1] = 0x00000001;                        // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 2 CBR
    pSdram[2] = 0x00000002;                        // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 3 CBR
    pSdram[3] = 0x00000003;                       // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 4 CBR
    pSdram[4] = 0x00000004;                      // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 5 CBR
    pSdram[5] = 0x00000005;                      // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 6 CBR
    pSdram[6] = 0x00000006;                    // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 7 CBR
    pSdram[7] = 0x00000007;                    // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_RFSH_CMD);    // Set 8 CBR
    pSdram[8] = 0x00000008;                    // Perform CBR
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_LMR_CMD);        // Set LMR operation
    pSdram[9] = 0xcafedede;                    // Perform LMR burst=1, lat=2
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_TR, (BOARD_MCK * 7) / 1000000);        // Set Refresh Timer
    WRITE(AT91C_BASE_SDRAMC, SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL_CMD);    // Set Normal mode
    pSdram[0] = 0x00000000;                        // Perform Normal mode
}

在AT91BootStrap的board.h文件,修改SDRAM配置参数:
#define BOARD_SDRAM_SIZE   (32*1024*1024)  // 64 MB
#define PINS_SDRAM  {0xFFFF0000, AT91C_BASE_PIOC, AT91C_ID_PIOC,PIO_PERIPH_A, PIO_DEFAULT}
#define BOARD_SDRAM_BUSWIDTH    16

相关帖子

沙发
8421bcd| | 2009-11-19 10:31 | 只看该作者
以我对2410配置的理解, 这些寄存器应该不用再配置了吧,也就是你在程序中,32模式和16模式应该有个切换指令!你把运行程序看下!

使用特权

评论回复
板凳
nicholasldf|  楼主 | 2009-11-19 11:40 | 只看该作者
谢谢楼上,但是我认为:只是SDRAM控制器是16bit或者32bit,跟程序以ARM模式或者THUMB模式运行没有关系的。

使用特权

评论回复
地板
wangkj| | 2009-11-19 12:00 | 只看该作者
你写的这段程序没错,可能是别的错误。你用jtag测试一下sdram数据正确性先。

使用特权

评论回复
5
desert_hawk| | 2009-11-19 12:29 | 只看该作者
由32位改为16位,地址线和DQM引脚都应该做相应变化,不知道楼主是怎么接的。

使用特权

评论回复
6
nicholasldf|  楼主 | 2009-11-19 12:45 | 只看该作者
我们的原理图和开发板的原理图如下:

our.PNG (63.49 KB )

我们的原理图

我们的原理图

ebd1.PNG (70.39 KB )

开发板原理图1

开发板原理图1

ebd2.PNG (64.11 KB )

开发板原理图2

开发板原理图2

使用特权

评论回复
7
nicholasldf|  楼主 | 2009-11-19 12:53 | 只看该作者
本帖最后由 nicholasldf 于 2009-11-19 12:56 编辑

4# wangkj

具体如何测试呢? 还没有这样用过。

我们手里只有一个wiggler,配合H-JTAG,跟CPU连接不上,不知道是不是JTAGSEL引脚没有选择JTAG模式有关,现在暂时靠debug串口调试的。

还是之前用2410好,ADS+Mutil-ICE,现在用keil MDK,改天买个JLINK。

使用特权

评论回复
8
xwj| | 2009-11-19 13:30 | 只看该作者
写一串顺序的数字,然后读出来看看就知道了

使用特权

评论回复
9
desert_hawk| | 2009-11-19 13:38 | 只看该作者
本帖最后由 desert_hawk 于 2009-11-19 14:00 编辑

sorry,看错。原来NBS0和地址线A0是同一引脚。

使用特权

评论回复
10
nicholasldf|  楼主 | 2009-11-19 13:43 | 只看该作者
本帖最后由 nicholasldf 于 2009-11-19 13:50 编辑

8# xwj

谢谢XWJ,我之前已经做过这个测试。
at91bootstrap是在9260内部的4K RAM运行的,
我在at91bootstrap里,初始化SDRAM之后给SDRAM首地址0x2000-0000写了5,
然后再读出来,但是代码运行到SDRAM读写操作这里就死掉了。测试代码大致如下:

pChar = "\n\r\n\r------------- AT91bootstrap Project -------------\n\r";
while( *pChar ) {
  DBGU_PutChar( *pChar++ );  /*这里正常输出字符串“------------- AT91bootstrap Project -------------”*/
}

pChar = (unsigned char *)0x200000; //指向9260内部的4K RAM首地址
*pChar = 5;
DBGU_PutChar( *pChar+'0' );  //超级终端输出数字5

pChar = (unsigned char *)0x20000000;//指向SDRAM的首地址
*pChar = 5; //程序运行到这里,没有反应了
DBGU_PutChar( *pChar+'0' ); //超级终端没有看到数字5

pChar = "Load uCOS-II App Image , Jump to addr 0x2000_0000\n\r\n\r";
while( *pChar ) {
  DBGU_PutChar( *pChar++ );  /*程序没有输出“Load uCOS-II App Image , Jump to addr 0x2000_0000”,说明程序没有运行到这里*/
}

使用特权

评论回复
11
nicholasldf|  楼主 | 2009-11-19 14:04 | 只看该作者
本帖最后由 nicholasldf 于 2009-11-19 14:16 编辑

9# desert_hawk

本身对SDRAM接线也不是很熟悉,所以这个SDRAM接线倒没有仔细看看,硬件工程师负责设计原理图和画板子。

再就是,如果硬件有问题,那SAMBA软件读写SDRAM也会出错啊?
但是用SAMBA软件可以读写SDRAM。
PC端的SAMBA软件把数据传递给9260内部的ROMboot,实际由ROMboot完成对SDRAM的操作。

刚刚问了硬件工程师,他说: A0就是NBS0, 如果用32位就用NBS1(A1)选高16位

使用特权

评论回复
12
wangkj| | 2009-11-19 15:03 | 只看该作者
我们的9200一直在16bi模式运行。没问题的。
你应该利用片内ram测试sdram。
如果没有jtag就太麻烦了。
当时,我首先用jtag测,一切正常了,再用串口测试的。

另外,最好找atmel或者百特,俺们有问题,直接找厂家。

使用特权

评论回复
13
desert_hawk| | 2009-11-19 15:04 | 只看该作者
“pChar = (unsigned char *)0x20000000;//指向SDRAM的首地址
*pChar = 5; //程序运行到这里,没有反应了
DBGU_PutChar( *pChar+'0' ); //超级终端没有看到数字5”
不能仿真就是麻烦啊。估计是进入异常了,如果SDRAM有问题,最多是输出的数据不对,也不应该没反应啊。
最好用串口调试助手观察16进制数,ASCII码如果数据不对有可能是乱码或不显示。

使用特权

评论回复
14
8421bcd| | 2009-11-19 16:57 | 只看该作者
在AT91BootStrap的board.h文件,修改SDRAM配置参数: #define BOARD_SDRAM_SIZE (32*1024*1024) // 64 MB #define PINS_SDRAM {0xFFFF0000, AT91C_BASE_PIOC, AT91C_ID_PIOC,PIO_PERIPH_A, PIO_DEFAULT} #define BOARD_SDRAM_BUSWIDTH 16

LZ红色部分是否也得要修改下呢?

使用特权

评论回复
15
nicholasldf|  楼主 | 2009-11-19 17:11 | 只看该作者
本帖最后由 nicholasldf 于 2009-11-19 17:13 编辑

14# 8421bcd

这个没有问题吧,
#define BOARD_SDRAM_SIZE (32*1024*1024)是设置成32M,
#define BOARD_SDRAM_BUSWIDTH 16是设置数据线为16bit啊。

由于不是32bit,
#define PINS_SDRAM {0xFFFF0000, AT91C_BASE_PIOC, AT91C_ID_PIOC,PIO_PERIPH_A, PIO_DEFAULT}是没有作用的。

使用特权

评论回复
16
nicholasldf|  楼主 | 2009-11-19 17:14 | 只看该作者
13# desert_hawk
这个有道理:handshake

使用特权

评论回复
17
cool_coder| | 2009-11-19 21:50 | 只看该作者
我在9261(s)的板子上实现过32/16位应用,硬件上只要去掉高16位的SDRAM芯片就行;软件上改SDRAM控制器的线宽,仅此而已。最麻烦的是要改ATMEL的那个SAMBA下载程序。

使用特权

评论回复
18
wangkj| | 2009-11-20 08:55 | 只看该作者
好像是改samba的某个配置文件

使用特权

评论回复
19
nicholasldf|  楼主 | 2009-11-20 11:16 | 只看该作者
18# wangkj

SAMBA软件配置已经改过来了。
我们能通过SAMBA下载程序at91bootstrap和应用程序,at91bootstrap能在内部SRAM跑,就是应用程序跑不了。

在倒弄Wiggler,开发板是好的,但连接不上。:dizzy:

wiggler.PNG (118.18 KB )

wiggler.PNG

使用特权

评论回复
20
wangkj| | 2009-11-20 15:33 | 只看该作者
八成还是硬件有问题。让他们硬件组的多想想。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

261

帖子

10

粉丝