搜索
bottom↓
回复: 3

搞不定nand的水货发一份k9f1208的nand官方驱动并请教一个问...

[复制链接]

出0入0汤圆

发表于 2012-7-29 17:42:27 | 显示全部楼层 |阅读模式
被k9f1208搞了快一个星期,是的,我都觉得自己水爆了。
实际上第二天,我就能读写了。但是,发现系统掉电后,再读居然读不到数据!这是不可能的,我后来猜测是自己读函数没写好。
但是,我这个二货居然重写了所有底层的读写函数,结果现在连个渣渣都读不出来。一个星期,搞不定,就此自认水货,虚心讨教。

我使用的芯片是str710,用emi接口加管脚模拟控制信号,接bank3

// 头文件里的

enum flash_control_pin_num{
        CE_PIN = 3,                        /*gpio2,o*/
        WP_PIN = 4,                                /*gpio2,o*/
        CLE_PIN = 5,                        /*gpio2,o*/
        ALE_PIN = 6,                        /*gpio2,o*/
        RB_PIN = 7                                /*gpio2,i*/
};
#define CE        (0x0001 << CE_PIN)
#define WP        (0x0001 << WP_PIN)
#define CLE        (0x0001 << CLE_PIN)
#define ALE        (0x0001 << ALE_PIN)
#define RB        (0x0001 << RB_PIN)



//系统时钟设置。外接16M晶振。
void SystemClockInit(void){

        RCCU_PCLK1Config (RCCU_RCLK_2);
       
        RCCU_PCLK2Config (RCCU_RCLK_2);
       
        RCCU_MCLKConfig (RCCU_DEFAULT);

        RCCU_PLL1Config (RCCU_PLL1_Mul_12, RCCU_Div_6) ;
       
        while(RCCU_FlagStatus(RCCU_PLL1_LOCK) == RESET)
        {
                /* Wait PLL to lock */
        }
        RCCU_RCLKSourceConfig (RCCU_PLL1_Output);  
}

// bank3 的地址 NAND_ADDR_BASE = 0x66000000
volatile u8* _BASEADDR = (volatile u8*)NAND_ADDR_BASE;

// 一些控制管脚函数
void Nand_ALE_Active (void)
{
        GPIO_BitWrite(GPIO2, ALE_PIN, 1);
}

void Nand_ALE_noActive (void)
{
        GPIO_BitWrite(GPIO2, ALE_PIN, 0);
}

// io
void Nand_CE_Active (void)
{
        GPIO_BitWrite(GPIO2, CE_PIN, 0);
}

void Nand_CE_noActive (void)
{
        GPIO_BitWrite(GPIO2, CE_PIN, 1);
}

void Nand_WriteProtect (void)
{
                GPIO_BitWrite(GPIO2, WP_PIN, 0);
}

void Nand_WriteUnprotect (void)
{
                GPIO_BitWrite(GPIO2, WP_PIN, 1);
}


//nand初始化函数。
void Nand_Flash_Init(void){
       
        volatile u16 i = 50;
    EMI_Enable(EMI_BANK3, ENABLE);
    EMI_Config(EMI_BANK3, EMI_SIZE_8, EMI_15_WaitStates);
       
        GPIO_Config (GPIO2, RB, GPIO_IN_TRI_CMOS);        // RnB
    GPIO_Config (GPIO2, CE, GPIO_AF_PP);                // Chip Selecet
        GPIO_Config (GPIO2, CLE, GPIO_OUT_PP);                 // CLE
        GPIO_Config (GPIO2, ALE, GPIO_OUT_PP);                // ALE
        GPIO_Config (GPIO2, WP, GPIO_OUT_PP);          // WP   
        Nand_ALE_noActive();                                                    // Set ALE to 0
        Nand_CE_noActive();                                                                // Set CS3 to 0, Enable
        Nand_WriteUnprotect();
        // Clear the status register
        Nand_WriteCommand(NAND_Reset);
        for(;i < 3;i--)
                ;
        while(!IsFlashBusy());
       
        while(!(NandReadStausRegister()&(ERROR_READY |!ERROR_PROGRAM_OR_ERASE)));
}


// 写命令函数
void Nand_WriteCommand(u8 cmd){
       
        *((volatile u8 *)(NAND_ADDR_BASE | NAND_CLE)) = cmd;
       
}


// 读RB管脚忙标志
u8 IsFlashBusy(void){

    return GPIO_BitRead(GPIO2, RB_PIN);
}
读状态

// 读状态
u8 NandReadStausRegister(void){
    volatile u8 status;
       
    Nand_CE_Active();
       
    GPIO_Config(GPIO2, RB_PIN, GPIO_IN_TRI_CMOS);
    Nand_WriteCommand(NAND_ReadStatusReg);
       
        status= *(u8 *)NAND_ADDR_BASE;
       
    Nand_CE_noActive();

        return status;

}
读id

// 读芯片id
u16 Nand_ReadInfo(void){
    u8 MakerCode;
        u8 DeviceCode;

        Nand_CE_Active();
        GPIO_Config(GPIO2, RB, GPIO_IN_TRI_CMOS);
        Nand_WriteCommand(NAND_ReadElectSign);                  //send read ID Command  (90h)

        GPIO_Config (GPIO2, ALE, GPIO_OUT_PP);       
        Nand_ALE_Active();
        *(u8*)(NAND_ADDR_BASE) = (u8)(0x00);          //                send Address. 1cycle (00h)
        Nand_ALE_noActive();

        MakerCode = *_BASEADDR;
        DeviceCode = *_BASEADDR;
       
       
        Nand_CE_noActive();
   
    return ((MakerCode << 8)| DeviceCode);
}


应该差不多了,现在问题是怎么也读不到芯片id。在nand的初始化函数里,连读状态都读不出来,总是0x00。我试过短接它的数据线到电源,结果还是读回来0x00!
如果有高手指出我问题所在,小弟万谢~~~

官方代码奉上。


我自己的代码,求解。

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

 楼主| 发表于 2012-7-29 17:44:17 | 显示全部楼层
把板子拿给同事读,是可以读得到的。觉得自己真心水爆了。

出0入0汤圆

 楼主| 发表于 2012-7-29 20:28:12 | 显示全部楼层
不要沉啊~~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 10:19

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

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