laijinwang 发表于 2012-4-9 22:25:01

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

做了几个板子LPC1788,用emc驱动NOR FLASH(SST39VF1601C),用NXP官方的例程,改了一下,怎么都读不出器件ID号,知道的指导一下,附件如下,

_yuming 发表于 2012-4-9 22:36:25

没看见附件呀,首先要检查一下EMC的地址、数据线是否正确,时钟、选择端等GPIO的配置是否正确,还有就是引用的驱动代码是否正确。。。

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

laijinwang 发表于 2012-4-9 22:37:32

数据手册附上,接法如下

laijinwang 发表于 2012-4-9 22:40:08

我接的是EMC_CS2,地址应该是0X9800_0000吧,yuming加个q指导下,

lpc1788 发表于 2012-4-9 22:45:43

_yuming 发表于 2012-4-9 22:36 static/image/common/back.gif
没看见附件呀,首先要检查一下EMC的地址、数据线是否正确,时钟、选择端等GPIO的配置是否正确,还有就是引 ...

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

laijinwang 发表于 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个函数,

microcreat 发表于 2012-4-9 23:08:37

我在u-boot上面移植了norflash的驱动!能读出ID了!
不过不是sst39vf1601c这个norflash!

microcreat 发表于 2012-4-9 23:09:38

本帖最后由 microcreat 于 2012-4-9 23:10 编辑

下面是读ID的程序!估计也适合sst的norflash!
flash_info.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");

laijinwang 发表于 2012-4-10 22:43:45

我的接法是SST39VF1601C的A0-A19对应接LPC1788的EMC_A0-EMC_A19,这样接的话,那个SCS寄存器的0位(那个是地址移位设置位)要不要设为0啊,还有我的EMC时钟是60MHz,明天要试试降低频率试试。希望大家关注,初学者,哈哈

dadatou 发表于 2012-4-12 09:48:19

如果你地址线直接对齐的话,那个地址移位设置必须设置为0啊.如果该位为1的话,16位总线,地址要错开一位,32位的话,要错开两位.

laijinwang 发表于 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);



我这样理解对吧?

xuwenjie168 发表于 2012-7-30 17:06:10

怎么没下文了啊 !!LZ搞定了没 ,什么问题?

gaojy902 发表于 2013-4-8 16:36:18

请问高手些,如何烧写1788 off-chip norflash啊?

ST_ATMEL_NXP 发表于 2013-7-20 18:05:37

laijinwang 发表于 2012-4-12 14:27 static/image/common/back.gif
是的,我接的是NOR flash地址线和LPC地址一一对应的。如果那个移位设为0,软件上就不用移位,EMC自动会根据 ...

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

xi_liang 发表于 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                */

myxiaonia 发表于 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都有啊

LO单片机VE 发表于 2015-11-2 12:10:58

烧写 norflash还是用JLINK比较方便,而且速度也快,值得推荐。
页: [1]
查看完整版本: LPC1788,用emc驱动NOR FLASH(SST39VF1601C),读不出ID号