搜索
bottom↓
回复: 16

LPC1788,用emc驱动NOR FLASH(SST39VF1601C),读不出ID号

[复制链接]

出0入0汤圆

发表于 2012-4-9 22:25:01 | 显示全部楼层 |阅读模式
做了几个板子LPC1788,用emc驱动NOR FLASH(SST39VF1601C),用NXP官方的例程,改了一下,怎么都读不出器件ID号,知道的指导一下,附件如下,

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-4-9 22:36:25 | 显示全部楼层
没看见附件呀,首先要检查一下EMC的地址、数据线是否正确,时钟、选择端等GPIO的配置是否正确,还有就是引用的驱动代码是否正确。。。

我做的板子目前都可以正常跑通了,移植了ucOS-II、emWin、FatFs0.09、触摸屏、SPIFLASH、NAND FLASH、NOR FLASH、I2S等目前都是正常的。。还有很多外设目前正在测试中。。。。。

出0入0汤圆

 楼主| 发表于 2012-4-9 22:37:32 | 显示全部楼层
数据手册附上,接法如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-4-9 22:40:08 | 显示全部楼层
我接的是EMC_CS2,地址应该是0X9800_0000吧,yuming加个q指导下,

出0入0汤圆

发表于 2012-4-9 22:45:43 | 显示全部楼层
_yuming 发表于 2012-4-9 22:36
没看见附件呀,首先要检查一下EMC的地址、数据线是否正确,时钟、选择端等GPIO的配置是否正确,还有就是引 ...

说了这么多可能的,你还少说了一样,就是有可能片子是坏的。虽然可能性很小,但我估计楼主不是线接错了就是IO配置错了

出0入0汤圆

 楼主| 发表于 2012-4-9 22:49:34 | 显示全部楼层
int c_entry(void)
{
    uint32_t i;
    volatile uint16_t *ip;
    uint32_t NorFlashAdr;

        /* Initialize debug via UART0
         * ?115200bps
         * ?8 data bit
         * ?No parity
         * ?1 stop bit
         * ?No flow control
         */
        debug_frmwrk_init();

        // print welcome screen
        print_menu();

        _DBG_("Init NOR Flash...");
    NORFLASHInit();

    _DBG_("Read NOR Flash ID...");
    if ( NORFLASHCheckID() == FALSE )
    {
            _DBG_("Error in reading NOR Flash ID, testing terminated!");
            while ( 1 );                /* Fatal error */
    }

    _DBG_("Erase entire NOR Flash...");
    NORFLASHErase();                /* Chip erase */

    /* Write to flash with pattern 0xAA55 and 0xA55A */
    NorFlashAdr = NOR_FLASH_BASE;

    _DBG_("Write a block of 2K data to NOR Flash...");
    for ( i = 0; i < NORFLASH_RW_PAGE_SIZE/2; i++ )
    {
                  NORFLASHWriteWord( NorFlashAdr, 0xAA55 );
                  NorFlashAdr++;
                  NORFLASHWriteWord( NorFlashAdr, 0xA55A );
                  NorFlashAdr++;
    }

    /* Verify */
    _DBG_("Verify data...");
    NorFlashAdr = NOR_FLASH_BASE;
    for ( i = 0; i < NORFLASH_RW_PAGE_SIZE/2; i+=2 )
    {
                  ip  = GET_ADDR(i);
                  if ( (*ip & 0xFFFF) != 0xAA55 )
                  {
                          _DBG_("Verifying fail, testing terminated!");
                          while ( 1 );        /* Fatal error */
                  }

                  ip  = GET_ADDR(i+1);
                  if ( (*ip & 0xFFFF) != 0xA55A )
                  {
                          _DBG_("Verifying fail, testing terminated!");
                          while ( 1 );        /* Fatal error */
                  }
    }

    // terminated
    _DBG_("Verifying complete! Testing terminated!");

    while (1);
    return 1;
}


void NORFLASHInit( void )
{
        TIM_TIMERCFG_Type TIM_ConfigStruct;
        /**************************************************************************
        * Initialize EMC for NOR FLASH
        **************************************************************************/
        EMC_Init();

    // init timer
        TIM_ConfigStruct.PrescaleOption = TIM_PRESCALE_USVAL;
        TIM_ConfigStruct.PrescaleValue        = 1;

                // Set configuration for Tim_config and Tim_MatchConfig
        TIM_Init(LPC_TIM0, TIM_TIMER_MODE,&TIM_ConfigStruct);
        TIM_Waitms(100);

        EMC_StaMemConfigMW (2,EMC_StaticConfig_MW_16BITS);         // WANG CS2的 16位数据
        EMC_StaMemConfigPB(2,EMC_StaticConfig_PB);
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITWEN, EMC_StaticWaitWen_WAITWEN(2));
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITOEN, EMC_StaticWaitOen_WAITOEN(2));
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITRD, EMC_StaticWaitRd_WAITRD(0x1f));
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITPAGE, EMC_StaticwaitPage_WAITPAGE(0x1f));
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITWR, EMC_StaticWaitwr_WAITWR(0x1f));
        EMC_SetStaMemoryParameter(2, EMC_STA_MEM_WAITTURN, EMC_StaticWaitTurn_WAITTURN(0x1f));

        //delay time
        TIM_Waitms(10);

          return;
}


uint32_t NORFLASHCheckID( void )
{
  volatile uint16_t *ip;
  uint16_t SST_id1, SST_id2;

  /*  Issue the Software Product ID code to 39VF160   */

//这里定义  #define GET_ADDR(addr)        (volatile uint16_t *)(NOR_FLASH_BASE | (addr<<1))  
  ip  = GET_ADDR(0x0555);  
  *ip = 0x00AA;
  ip  = GET_ADDR(0x02AA);
  *ip = 0x0055;
  ip  = GET_ADDR(0x0555);
  *ip = 0x0090;
  delayns(150);

  /* Read the product ID from 39VF160 */
  ip  = GET_ADDR(0x0000);
  SST_id1 = *ip & 0x00FF;
  ip  = GET_ADDR(0x0001);
  SST_id2 = *ip;

  /* Issue the Soffware Product ID Exit code thus returning the 39VF160 */
  /* to the read operating mode */
  ip  = GET_ADDR(0x0555);
  *ip = 0x00AA;
  ip  = GET_ADDR(0x02AA);
  *ip = 0x0055;
  ip  = GET_ADDR(0x0555);
  *ip = 0x00F0;
  delayns(150);

  /* Check ID */
  if ((SST_id1 == SST_ID) && (SST_id2 ==SST_39VF160))
        return( TRUE );
  else
        return( FALSE );
}

主要是这3个函数,

出0入0汤圆

发表于 2012-4-9 23:08:37 | 显示全部楼层
我在u-boot上面移植了norflash的驱动!能读出ID了!
不过不是sst39vf1601c这个norflash!

出0入0汤圆

发表于 2012-4-9 23:09:38 | 显示全部楼层
本帖最后由 microcreat 于 2012-4-9 23:10 编辑

下面是读ID的程序!估计也适合sst的norflash!
flash_info[1].size = CONFIG_NOR_FLASH_SIZE;
        __raw_writew(0x00aa, (CONFIG_NOR_FLASH_BASE | (0x555 << 1)));
        __raw_writew(0x0055, (CONFIG_NOR_FLASH_BASE | (0x2AA << 1)));
        __raw_writew(0x0090, (CONFIG_NOR_FLASH_BASE | (0x555 << 1)));
        type_id = __raw_readw((CONFIG_NOR_FLASH_BASE | (0x0001 << 1)));
        vendor_id = __raw_readw((CONFIG_NOR_FLASH_BASE | (0x000E << 1)));
        __raw_writew(0x00aa, (CONFIG_NOR_FLASH_BASE | (0x555 << 1)));
        __raw_writew(0x0055, (CONFIG_NOR_FLASH_BASE | (0x2AA << 1)));
        __raw_writew(0x00f0, (CONFIG_NOR_FLASH_BASE | (0x555 << 1)));

        flash_id = (type_id << 16) | vendor_id;

        if( !( 0x227e2221 == flash_id) )
                printf("nor flash id is erro!\n");

出0入0汤圆

 楼主| 发表于 2012-4-10 22:43:45 | 显示全部楼层
我的接法是SST39VF1601C的A0-A19对应接LPC1788的EMC_A0-EMC_A19,这样接的话,那个SCS寄存器的0位(那个是地址移位设置位)要不要设为0啊,还有我的EMC时钟是60MHz,明天要试试降低频率试试。希望大家关注,初学者,哈哈

出0入0汤圆

发表于 2012-4-12 09:48:19 | 显示全部楼层
如果你地址线直接对齐的话,那个地址移位设置必须设置为0啊.如果该位为1的话,16位总线,地址要错开一位,32位的话,要错开两位.

出0入0汤圆

 楼主| 发表于 2012-4-12 14:27:02 | 显示全部楼层
是的,我接的是NOR flash地址线和LPC地址一一对应的。如果那个移位设为0,软件上就不用移位,EMC自动会根据数据宽度移位,
如果那个移位设为1,软件就要移位,像这里
//这里定义  #define GET_ADDR(addr)        (volatile uint16_t *)(NOR_FLASH_BASE | (addr<<1))  
  ip  = GET_ADDR(0x0555);  
  *ip = 0x00AA;
  ip  = GET_ADDR(0x02AA);
  *ip = 0x0055;
  ip  = GET_ADDR(0x0555);
  *ip = 0x0090;
  delayns(150);



我这样理解对吧?

出0入0汤圆

发表于 2012-7-30 17:06:10 | 显示全部楼层
怎么没下文了啊 !!LZ搞定了没 ,什么问题?

出0入0汤圆

发表于 2013-4-8 16:36:18 | 显示全部楼层
请问高手些,如何烧写1788 off-chip norflash啊?

出0入0汤圆

发表于 2013-7-20 18:05:37 | 显示全部楼层
laijinwang 发表于 2012-4-12 14:27
是的,我接的是NOR flash地址线和LPC地址一一对应的。如果那个移位设为0,软件上就不用移位,EMC自动会根据 ...

地址线是需要偏移的。这和STM32的FSMC不一样。

出0入0汤圆

发表于 2014-2-22 12:41:41 | 显示全部楼层
对,这个是要移位的
#define ADDR_SHIFT(Addr) (NOR_FLASH_BASE + ((Addr)<<1))

SST39VF1601的ID:
#define SST_ID                                0xBF    /* SST Manufacturer's ID code        */
#define SST_39VF1601        0x234B  /* SST 39VF1601 device code                */

出0入0汤圆

发表于 2015-9-18 12:42:07 | 显示全部楼层
gaojy902 发表于 2013-4-8 16:36
请问高手些,如何烧写1788 off-chip norflash啊?

网上有人做出来了  我给你提示下  怎么在mdk里烧写外部nor flash

首先要有闪存算法,楼主位说的这个刚好mdk自带了 按照板子上实际片选选择起始地址,生成的flx文件改成flm后缀

新建ini文件在下载设置栏,ini文件语句:load xxx.hex和emc初始化代码,这个就去找网上找也可以自己写

然后下载时候就可以用mdk下载了


我现在想搞sdram调试程序,网上竟然还没有公开的mdk的ini文件,问问题的人倒是很多
我在mdk目录下搜  发现lpc2478还有呢。。。其他一堆arm9也有,可怜的1788却没有,4357都有啊

出0入0汤圆

发表于 2015-11-2 12:10:58 | 显示全部楼层
烧写 norflash还是用JLINK比较方便,而且速度也快,值得推荐。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 16:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表