免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6690 | 回复: 10
打印 上一主题 下一主题

急急急!!!关于AT91SAM9260开发板的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-14 00:08 |只看该作者 |倒序浏览
我有一块AT91SAM9260开发板,然后照着开发板一模一样又作了一块自己的开发板,除了将NAND FLASH换

成NOR FLASH之外,其它都一样。我换的NOR FLASH是KH29LV640DT-B (4M x 16bit),16位数据总线。

我使用AT91SAM9260的NCS6做NOR FLASH的片选,NCS6的BANK地址为0X7000 0000,NCS6是A13(即P13)的

外围B功能(peripheral B function).
我使用A13(PC13)做NOR FLASH的CE#。
我可以在我做的板子上下载和正确地运行U-BOOT,但它总是取得错误的NOR FLASH厂商ID号和设备ID号。

这就是我的问题。我问过我公司的一位资深硬件人员,他说我做的开发板的电路是没有问题的。
正确的厂商ID号和设备ID号都应该为0XC2,但是我获得的总是0XC。

下面是我写的关于NOR FLASH(在U-BOOT里面)的主要代码:


#define AT91C_SM_NWE_SETUP      (0 << 0)
#define AT91C_SM_NCS_WR_SETUP   (0 <<
#define AT91C_SM_NRD_SETUP      (0 << 16)
#define AT91C_SM_NCS_RD_SETUP   (0 << 24)
#define AT91C_SM_NWE_PULSE      (5 << 0) //lingyb Write
#define AT91C_SM_NCS_WR_PULSE   (7 << //lingyb cs Write
#define AT91C_SM_NRD_PULSE      (5 << 16) //lingyb Read
#define AT91C_SM_NCS_RD_PULSE   (7 << 24) //lingyb cs Read
#define AT91C_SM_NWE_CYCLE      (12 << 0) //lingyb Write
#define AT91C_SM_NRD_CYCLE      (12 << 16) //lingyb Read
#define AT91C_SM_TDF            (1 << 16)

#define FLASH_BASE              0x70000000
typedef volatile unsigned char vu_char;

unsigned long nor_init (void)
{
vu_char* addr;

  /* Configure SMC CS6 */
  AT91C_BASE_SMC->SMC_SETUP6 = (AT91C_SM_NWE_SETUP | AT91C_SM_NCS_WR_SETUP |
                                AT91C_SM_NRD_SETUP | AT91C_SM_NCS_RD_SETUP);
                                                               
  AT91C_BASE_SMC->SMC_PULSE6 = (AT91C_SM_NWE_PULSE | AT91C_SM_NCS_WR_PULSE |
                                AT91C_SM_NRD_PULSE | AT91C_SM_NCS_RD_PULSE);

  AT91C_BASE_SMC->SMC_CYCLE6 = (AT91C_SM_NWE_CYCLE | AT91C_SM_NRD_CYCLE);

  AT91C_BASE_SMC->SMC_CTRL6 = (AT91C_SMC_READMODE | AT91C_SMC_WRITEMODE |
                               AT91C_SMC_NWAITM_NWAIT_DISABLE |
                               AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS | AT91C_SM_TDF);

/* enable the nor flash chip select */
AT91C_BASE_PIOC->IO_PDR = AT91C_PIO_PC13;
AT91C_BASE_PIOC->IO_BSR = AT91C_PIO_PC13;

printf("AT91C_BASE_PIOC->IO_ABSR & AT91C_PIO_PC13=0x%x \n\r",AT91C_BASE_PIOC->IO_ABSR &

AT91C_PIO_PC13);//lingyb
printf("AT91C_BASE_PIOC->IO_PSR & AT91C_PIO_PC13=0x%x \n\r",AT91C_BASE_PIOC->IO_PSR &  

AT91C_PIO_PC13 );//lingyb

    /* get manufacturer ID and device ID */
    addr = (vu_char*)FLASH_BASE;
  addr[0x555] = 0xAA;
  addr[0x2aa] = 0x55;
  addr[0x555] = 0x90;
  ID_manuf  = (ulong)addr[0];
  ID_device = (ulong)addr[1];
  /* restore read mode */
  addr[0x0000] = 0xF0;

printf("Manuf. ID @ 0x%08lx: 0x%08lx\n", (ulong)addr, ID_manuf);
printf("Device ID @ 0x%08lx: 0x%08lx\n", (ulong)(&addr[1]), ID_device);

}

我实在是找不到是哪里出错了?难道是还有什么寄存器我没有设置?或者是SMC_PULSE6 和 SMC_CYCLE6的
时序我没有设对?我已经试过了SMC_PULSE6 和 SMC_CYCLE6时序的很多种组合,但获得的厂商ID总是0XC


有哪位大侠能帮到我吗,真的是非常感激!!!

论坛徽章:
5
2 [报告]
发表于 2007-08-14 09:48 |只看该作者
    /* get manufacturer ID and device ID */
    addr = (vu_char*)FLASH_BASE;
  addr[0x555] = 0xAA;
  addr[0x2aa] = 0x55;
  addr[0x555] = 0x90;
  ID_manuf  = (ulong)addr[0];
  ID_device = (ulong)addr[1];
  /* restore read mode */
  addr[0x0000] = 0xF0;

我换的NOR FLASH是KH29LV640DT-B (4M x 16bit),16位数据总线。

这一段是进行了8位的操作. 0xaa, 0x55, 0x90, 0xf0均是8位. 但你又说是16位的数据总线. 显然会出错.

请阅读你的Flash芯片手册和CFI接口标准. 改成类似如下的操作:
  addr[0x5555] = 0xAAAA;
  addr[0x2aaa] = 0x5555;
  addr[0x5555] = 0x9090;
  addr[0x0000] = 0xF0F0;

继续关注.有结果请告诉我.

论坛徽章:
0
3 [报告]
发表于 2007-08-14 09:58 |只看该作者
16位总线进行8位数据操作不应该有问题吧,个人觉得,没试过

btw:建议楼主把代码放在 [CODE ]里,会好看一些

论坛徽章:
0
4 [报告]
发表于 2007-08-14 11:45 |只看该作者
感谢 yidou  光明使者 的关注。

我用你的代码试过了,结果还是一样的。

论坛徽章:
5
5 [报告]
发表于 2007-08-14 12:55 |只看该作者
试过其它的command sequences吗? 比如CFI Read. 是什么结果?

芯片手册在http://www.macronix.com/QuickPla ... A248257164001EEC2A/$File/MX29LV640DT-B-1.0.pdf?OpenElement  可以找到. 按Page20中的描述, 8位或16位操作都得到C2H才对. 真是有点奇怪.

论坛徽章:
0
6 [报告]
发表于 2007-08-14 14:33 |只看该作者
原帖由 yidou 于 2007-8-14 12:55 发表
试过其它的command sequences吗? 比如CFI Read. 是什么结果?

芯片手册在
http://www.macronix.com/QuickPla ... A248257164001EEC2A/$File/MX29LV640DT-B-1.0.pdf?OpenElement




链接地址:


  1. http://www.macronix.com/QuickPlace/hq/PageLibrary48256F5500439ED0.nsf/h_CE4C9490FDF4280B48256F550043C6D8/584AAC9F2CFF16A248257164001EEC2A/$File/MX29LV640DT-B-1.0.pdf?OpenElement
复制代码




ps.yidou明明是版主,咋不显示头衔呢?

[ 本帖最后由 bitmilong 于 2007-8-14 14:36 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-08-14 14:53 |只看该作者
yidou  光明使者:
  可否指教一下如何使用 CFI Read. 谢了!

论坛徽章:
5
8 [报告]
发表于 2007-08-14 15:57 |只看该作者
for 8 bit programming:
           仅需判断0x98是否等于addr[0xAA];

for 16 bit programming:
           仅需判断0x98是否等于addr[0x55];

参考Page 20的"command definitions". CFI read操作只需要一个command就可以了

论坛徽章:
0
9 [报告]
发表于 2007-08-14 19:29 |只看该作者

非常感谢 yidou 光明使者 !!

非常感谢 yidou  光明使者 的关注!

我明天会试试你的这个方法。

论坛徽章:
0
10 [报告]
发表于 2007-08-16 21:19 |只看该作者

感谢各位的关注

非常感谢各位的关注,这个问题我请教了另一位高深人士,现在已解决。
现把一些关键信息给出如下:
该高深人士只是改了一下时序,同时又将vu_char改为vu_short问题就解决了,
说是什么A0地址线没使用,输入0XAAA到总线上就变成0X555。目前问题虽已
解决,但其中的道理我还没弄懂。但由于别的事情太忙,所以弄懂这个原理
就得等到以后较清闲时再做了。谢谢各位的关注!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP