打印

移植FATFS到S3C2440的SD卡上遇到的困难,请高手指点

[复制链接]
楼主: dsoyy
手机看帖
扫描二维码
随时随地手机跟帖
41
xfcjava2| | 2010-4-9 23:00 | 只看该作者 回帖奖励 |倒序浏览
fatfs R0.07e中,宏定义如下:

#define        LD_WORD(ptr)                (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))
#define        LD_DWORD(ptr)                (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr))
#define        ST_WORD(ptr,val)        *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
#define        ST_DWORD(ptr,val)        *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)

使用特权

评论回复
42
dsoyy|  楼主 | 2010-4-9 23:04 | 只看该作者
那么FS移植到nand  flash知道nand的底层OK问题就不大了
如果明天成功要好好理解和反思下,之后移植到nand,还要遗址UCGUI。

如果我SD读到一张位图,通过DMA送到TFT显示,整个过程是不涉及CPU干涉的,如果读取一个数据需要CPU计算处理,用DMA就不合适了吧。

刚刚接触2440,明天要好好看书,有很多疑惑。

使用特权

评论回复
43
dsoyy|  楼主 | 2010-4-10 10:40 | 只看该作者
本帖最后由 dsoyy 于 2010-4-10 14:44 编辑

xfcjava2,
void test_fatfs(void)
{
        FATFS fs;
        DSTATUS stat = 0;
        FRESULT res;                //文件系统返回信息
        FIL file;
         
         
        stat = disk_initialize(1);//SD_card_init();

        Uart_Printf("%d\n",stat);
        

        Write_SD("data.txt","12345",2);

        
        while(1);

}

void Write_SD(const char *write_file,const void *buffer,UINT count)
{
  FATFS fs;
  FIL fil;
  U32 bw;
  FRESULT res;                //文件系统返回信息

   f_mount(1,&fs);//注册一个文件系统
   res=f_open(&fil,write_file,FA_OPEN_ALWAYS|FA_WRITE);//建立文件的文件名最长8个字节
   Uart_Printf("%d\n",res);
    if(res!=FR_OK)
   {
        Uart_Printf("文件不能写!!!\r\n");
        return;
    }
     
        res=f_lseek(&fil,fil.fsize);
        res=f_write(&fil,buffer,count,&bw);

    f_close(&fil);
        f_mount(1, NULL);
}

void Write_SD(const char *write_file,const void *buffer,UINT count)
函数中的Uart_Printf("%d\n",res);为13,说明FS初始化没成功

FR_NO_FILESYSTEM               /* 13*/

使用特权

评论回复
44
dsoyy|  楼主 | 2010-4-10 13:31 | 只看该作者
f_mount(0,&fs):

  此函数的第1个参数指定操作的驱动器,默认情况下0(ATA); 1(MMC);2(USB),不知你注意到了没有?

如果你使用的是SD卡,请将此函数的第1个参数指定为MMC!!! ...
xfcjava2 发表于 2010-4-9 22:29


我看了源码:
FRESULT f_mount (
BYTE vol,  /* Logical drive number to be mounted/unmounted */
FATFS *fs  /* Pointer to new file system object (NULL for unmount)*/
)
{
FATFS *rfs;

if (vol >= _DRIVES)    /* Check if the drive number is valid */
  return FR_INVALID_DRIVE;

rfs = FatFs[vol];    /* Get current fs object */
if (rfs) {
#if _FS_REENTRANT     /* Discard sync object of the current volume */
  if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR;
#endif
  rfs->fs_type = 0;   /* Clear old fs object */
}
if (fs) {
  fs->fs_type = 0;   /* Clear new fs object */
#if _FS_REENTRANT     /* Create sync object for the new volume */
  if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR;
#endif
}
FatFs[vol] = fs;    /* Register new fs object */
return FR_OK;
}

我现在每次都返回FR_INVALID_DRIVE,这个_DRIVES 值为1.除非写成 0,但是和您说的不相符,而且调试都没有成功.

使用特权

评论回复
45
xfcjava2| | 2010-4-10 16:18 | 只看该作者
/****************************************************************************       
* 功    能:      SD卡文件功能任务
*---------------------------------------------------------------------------*
* 入口参数:
* 出口参数:
****************************************************************************/       
__task void SD_FileTask(void)
{         
                if(MMC_disk_initialize())
             Uart_Printf("\r\n SD Card No Connect!!!\r\n ");
                else
                  {               
                   Uart_Printf("\r\n SD Card Ready--->\r\n");  

                         Init_LogicalDrive();
                  
                   fatfs_tst();                          
           }                                          
          
                while(1)
                 {        
                                             
                                os_dly_wait(100);
                 }

}




/*********************************************************************************************************
** 函数名称:  MMC_disk_initialize
** 功能描述:
** 输   入: nil
** 输   出: TRUE, 正常返回
**                         FALSE,出错返回
********************************************************************************************************/

int MMC_disk_initialize(void)
{          
  if(SD_Driver_init())
   {
     Stat &= ~STA_NOINIT;        /* Clear STA_NOINIT */               
           return Stat;
   }
  
  else
        {
    Stat |= STA_NOINIT;                /* Set STA_NOINIT */
       
          return Stat;  
        }   
}


int SD_Driver_init(void)
{
                RCA=0;
    MMC=0;

                if(SD_card_init())
             return  1;
          else
                   return  0;       
}



int SD_card_init(void)//-- SD controller & card initialize
{
    int i;

   
    rSDIPRE=PCLK/(INICLK)-1;   // 400KHz
       
          rSDICON=(1<<4)|1;               // Type B, clk enable
          rSDIFSTA=rSDIFSTA|(1<<16); //YH 040223 FIFO reset
    rSDIBSIZE=0x200;                   // 512byte(128word)
    rSDIDTIMER=0x7fffff;        // Set timeout count   
   
   
    for(i=0;i<0x1000;i++);  // Wait 74SDCLK for MMC card
   
    CMD0();  
   
    if(Chk_MMC_OCR()) //-- Check MMC card OCR
     {                       
              MMC=1;          
     }   
    else
     {
                                if(Chk_SD_OCR())
                                  Uart_Printf("\nIn SD ready\n");
               
                                else
                                 {
                                        Uart_Printf("\nInitialize fail\nNo Card assertion\n");
                                    return 0;
                                 }
      }

    do{
        //-- Check attaced cards, it makes card identification state
            rSDICARG=0x0;   // CMD2(stuff bit)
            rSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x42; //lng_resp, wait_resp, start, CMD2
    }while(!Chk_CMDend(2, 1)); //-- Check end of CMD2   
   
    rSDICSTA=0xa00;        // Clear cmd_end(with rsp)   

    do{            
            
                    do{
                            rSDICARG=MMC<<16;            // CMD3(MMC:Set RCA, SD:Ask RCA-->SBZ)
                            rSDICCON=(0x1<<9)|(0x1<<8)|0x43;        // sht_resp, wait_resp, start, CMD3
                    }while(!Chk_CMDend(3, 1));//-- Check end of CMD3                             
                    
                    rSDICSTA=0xa00;        // Clear cmd_end(with rsp)        
                  
                    if(MMC) //--Publish RCA
                     {
                              RCA=1;        
                        rSDIPRE=(PCLK/MMCCLK)-1;        // YH 0812, Normal clock=20MHz
       
                        Uart_Printf("MMC Frequency is %dHz\n",(PCLK/(rSDIPRE+1)));
                     }
                    else
                     {
                                                RCA=( rSDIRSP0 & 0xffff0000 )>>16;            
                       
                                                rSDIPRE=PCLK/(SDCLK)-1;        // Normal clock=25MHz                       
                     }
                    
    }while( rSDIRSP0 & 0x1e00!=0x600 );        // CURRENT_STATE check           

    Card_sel_desel(0);        // Card deselect
   
                if (CMD9()== 1)  //Get CSD and save it
                 {
                                resp[0] = rSDIRSP0;        //Read the response words               
                                resp[1] = rSDIRSP1;
                                resp[2] = rSDIRSP2;
                                resp[3] = rSDIRSP3;       
               
                                for (i = 0; i < 4; i++)
                                     bswap_cp(&CardInfo[i * 4], &resp[i]);
                 }
                                
    Card_sel_desel(1);        // Select

    if(!MMC)
            Set_4bit_bus();
    else
            Set_1bit_bus();               
       
    return 1;
}

使用特权

评论回复
46
xfcjava2| | 2010-4-10 16:21 | 只看该作者
本人的定义:
因为只使用sd卡,所以

#define _DRIVES                     1

#define DISK_ATA                      1
#define DISK_MMC                      0
#define DISK_USB                      2

使用特权

评论回复
47
xfcjava2| | 2010-4-10 16:23 | 只看该作者
DSTATUS disk_initialize (
        BYTE drv                                /* Physical drive nmuber (0..) */
)
{       
  DSTATUS stat=0;       
        int result=0;

        switch (drv) {
        case DISK_ATA :
                result = ATA_disk_initialize();
                if(result == 0)            
      return RES_OK;            
    else   
      return RES_ERROR;                        

        case DISK_MMC :
                result = MMC_disk_initialize();       
                return RES_OK;

        case DISK_USB :
                result = USB_disk_initialize();       

                return stat;
        }
        return STA_NOINIT;
}

使用特权

评论回复
48
xfcjava2| | 2010-4-10 16:25 | 只看该作者
请认真检查你的sd卡初始化函数,以及disk_initialize()函数

使用特权

评论回复
49
dsoyy|  楼主 | 2010-4-10 16:40 | 只看该作者
:handshake

使用特权

评论回复
50
dsoyy|  楼主 | 2010-4-10 17:09 | 只看该作者
本帖最后由 dsoyy 于 2010-4-10 17:20 编辑

请问这个函数是啥Init_LogicalDrive()。
SD初始化里面的 if (CMD9()== 1)  //Get CSD and save it
               {}
   bswap_cp(&CardInfo[i * 4], &resp);
这个函数和resp这个数组个代表什么呢?
我底层SD初始化直接用飞凌的,要好好检查一遍

使用特权

评论回复
51
xfcjava2| | 2010-4-10 20:41 | 只看该作者
SD初始化直接用飞凌的,还是不够的!!!

void Init_LogicalDrive (void)
{
   put_rc(f_mount(0, &fatfs[0]));/* fi - Force initialized the logical drive */
}

Init_LogicalDrive 你可以直接调用f_mount();


U32 resp[4];
U8 CardInfo[16+16+4];        /* CSD(16), CID(16), OCR(4) */

/*-----------------------------------------------------------------------*/
/* Swap byte order                                                       */
/*-----------------------------------------------------------------------*/

static void bswap_cp (U8 *dst, const U32 *src)
{
         U32 d;

         d = *src;
        *dst++ = (U8)(d >> 24);
        *dst++ = (U8)(d >> 16);
        *dst++ = (U8)(d >> 8);
        *dst++ = (U8)(d >> 0);
}

使用特权

评论回复
52
xfcjava2| | 2010-4-10 20:42 | 只看该作者
请参考调用!!

使用特权

评论回复
53
xuehui869| | 2010-12-6 11:30 | 只看该作者
正要移植,瞅瞅

使用特权

评论回复
54
xdwumin| | 2011-2-8 12:31 | 只看该作者
楼主,你这个代码似乎仍是PIO模式的,那个开发板带的 DMA 模式的例子似乎不正确。

使用特权

评论回复
55
fyyy4030| | 2011-5-9 19:20 | 只看该作者
40# xfcjava2

可以发表下MMC_disk_status()这个函数吗

使用特权

评论回复
56
fyyy4030| | 2011-5-10 00:07 | 只看该作者
我用了上面的程序怎么没有效果呢。大侠可以共享一下你的源码吗

使用特权

评论回复
57
js_xuzh| | 2011-6-2 11:27 | 只看该作者
支持下版主,正想看这方面的资料

使用特权

评论回复
58
empireswang| | 2011-6-11 21:57 | 只看该作者

使用特权

评论回复
59
myhunter800| | 2011-11-14 14:35 | 只看该作者
有没有源码啊?

使用特权

评论回复
60
myhunter800| | 2011-11-14 15:00 | 只看该作者
我现在的问题是:调试到if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55)时总返回2,操作系统不存在,也试过把rSDICON = (1<<4)|1改为rSDICON = (0<<4)|1 也不行,请指教。

使用特权

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

本版积分规则