打印
[ZLG-ARM]

在SmartARM2200 中想实现USB总线读取SD卡 中的文件 遇到问题?

[复制链接]
1343|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ybs273|  楼主 | 2007-8-16 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
希望能够得到各位前辈的指点。

我目前在使用SmartARM2200平台做一个仪器系统。我目前已经利用其扩展接口做了很多外接模块,现在进行系统综合时碰到一些问题。
我把ZLG/FS文件系统应用到SD卡上,对文件和目录的操作已经没有问题。
我利用SmartARM2200的USB模块,在电脑主机上,通过USB总线对ARM系统内的数据读写等也没有问题。
但是当我想通过USB总线操作SD卡文件时发现问题。

在ZLG/FS 中 osFile.c中有文件系统服务任务: 
void OSFileTask(void *pdata)
{  .........}

在 ZLG_USBD13中,D13Driver.c中有控制传输处理任务:
void  TaskSetup(void *pdata)
{ .......}

我发现当这两个任务同时启动时,USB接口就无法连接,个人觉得是两个任务彼此发生冲突,但是不知道为什么会发生冲突。
下面是我的main.c中的部分代码,希望哪位能够指点迷津。感兴趣的,我可以将我的整个工程文件传过来,:



#include "config.h"            
#include "D13Driver.h"                     #include "I2C.h"                        

#define PAGE_SIZE_CAT1025     16            
#define CMD_READ_CAT1025     0x01         
#define CMD_WRITE_CAT1025     0x02         
#define CMD_READ_SD          0x06
#define CMD_WRITE_SD         0x07

OS_STK  TaskStartStk[128];                
OS_STK  ReadTaskStk[256];                 
OS_STK  WriteTaskStk[256];                 
OS_STK  ReadSDTaskStk[256];
OS_STK  WriteSDTaskStk[256];
OS_STK  TaskStk[1024];

OS_EVENT *Write_Sem;                     OS_EVENT *Read_Sem;                
OS_EVENT *Read_SD_Sem;
OS_EVENT *Write_SD_Sem;

void Init_I2CInt(void);                
INT16U Read_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *recbuff);
INT16U Write_CAT1025(INT8U addr,INT8U offset,INT16U len,INT8U *sendbuff);

void TaskStart(void *pdata);    
void TaskRead(void *pdata);
void TaskWrite(void *pdata);
void TaskReadSD(void *pdata);
void TaskWriteSD(void *pdata);

extern void Usb_Handler(void);

 char *strupr(char *Str)
{
    char *cp;
    
    cp = Str;
    while (*cp != 0)
    {
        if (*cp >= 'a' && *cp <= 'z' )
        {
            *cp -=  'a' - 'A';
        }
        cp++;
    }
    return Str;
}

*************************************************************/
void Init_D13Int(void)
{
    VICVectCntl1 = (0x20 | 0x0E);                   VICVectAddr1 = (INT32U)Usb_Handler;               VICIntEnable = 1 << 14;                
}

/*************************************************************/
int main (void)
{
    OSInit();                                
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[127], 5);
    OSStart();           
}

/*************************************************************/
void  TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                  
   OS_CPU_SR  cpu_sr;    
#endif
    INT8U err,cmd;
    pdata = pdata;     
                   
    TargetInit();                                I2cInit(30000);                         Init_I2CInt();                         Init_D13Int();                         err = Init_D13();                          
    Write_Sem = OSSemCreate(0);                      Read_Sem  = OSSemCreate(0);   
    Read_SD_Sem = OSSemCreate(0);
    Write_SD_Sem = OSSemCreate(0);
    
    OSTaskCreate(TaskRead, (void *)0, &ReadTaskStk[255], 1);    OSTaskCreate(TaskWrite, (void *)0, &WriteTaskStk[255], 2);    OSTaskCreate(TaskReadSD, (void *)0, &ReadSDTaskStk[255], 3);
         OSTaskCreate(TaskWriteSD,(void *)0, &WriteSDTaskStk[255], 4);                        
    OSTaskCreate(OSFileTask, (void *)0, &TaskStk[1023], 6);
    if (err == 0)                          OSTaskCreate(TaskSetup, (void *)0, &TaskSetupStk[127], 0);
      
      for (;;)
      {
          err = ReadPort1(1, &cmd, 200);                if (err == OS_NO_ERR)
        {                                                            if (cmd == CMD_READ_CAT1025)                OSSemPost(Read_Sem);                    if (cmd == CMD_WRITE_CAT1025)
            OSSemPost(Write_Sem);                    if (cmd == CMD_READ_SD)                    OSSemPost(Read_SD_Sem);                    if (cmd == CMD_WRITE_SD)
            OSSemPost(Write_SD_Sem);                 } 
            }  
 }
     .......

相关帖子

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

本版积分规则

2

主题

4

帖子

1

粉丝