求助 :ch376与smart2200 插上U盘CH376不亮

2019-07-16 10:18发布

我插上U盘一点反应都没有,本人小菜 求大侠指点迷津
#include "config.h"
#include "CH376INC.h"


/************************************************************************/

/* smart2200引脚      CH376芯片的引脚
         P1.16                 INT#
         P1.17                 A0
         P1.18                 CS#
         P1.19                 WR#
         P1.20                 RD#
  P2.16-P2.23(8位端口)         D7-D0       */
  
  void        mDelay0_5uS( void )  /* 至少延时0.5uS,根据单片机主频调整 */
{   int i=1;
    for(;i!=0;i--);
         
}
void        mDelayuS( UINT8 us )
{  
    //while ( us -- );  /* 24MHz MCS51 */  
    us = us*2*4;
    while ( us -- );  //11.059200*4MHZ ARM
}
  
  
  /* 延时指定毫秒时间,根据单片机主频调整,不精确 */
void        mDelaymS( UINT8 ms )
{
        while ( ms -- )
        {
                mDelayuS( 250 );
                mDelayuS( 250 );
                mDelayuS( 250 );
                mDelayuS( 250 );
        }
}

void        CH376_PORT_INIT( void )  /* 由于使用通用I/O模拟并口读写时序,并口初始化 */
{
    PINSEL2 &=0xFFFFFFF4;  //P1.16~P1.25为GPIO
    PINSEL2 |=0x00000030;  //P2.16~P2.23为GPIO
      
        IO1SET |= 0x001C0000;  /* 设置CS,WR,RD默认为高电平 */
        IO2DIR |= 0x00000000;  /* 设置8位并口和INT#为输入 */
        IO1DIR |= 0x001E0000;  /* 设置CS,WR,RD,A0为输出 */

}





void WriteCH376Cmd( UINT8 mCmd )                /* 外部定义的被CH376程序库调用的子程序,向CH376写命令 */
{
        mDelayuS(2);  /* 至少延时1uS */
        IO2CLR |= 0x00FF0000;  /* 清并口输出, P2.16-P2.23(8位端口)为并口 */
        IO1SET |= 0x00120000; //输出A0(P1.17)=1,CS=0,WR=0,RD=1;
        IO1DIR |= 0x001E0000;  /* 设置CS,WR,RD,A0为输出 */
        IO2SET |= ( (UINT32)mCmd << 16 );  /* 向CH376的并口输出数据,移16位是由于P2.16~P2.23为GPIO */
        IO1SET |= 0x000C0000;         //WR=1,CS=1,A0=1
        mDelayuS(2);  /* 至少延时2uS */
}

void WriteCH376Data( uint32 mData )                /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
{
        mDelayuS(2);  /* 至少延时1uS */
        //uint32 mCmd;
        IO2CLR |= 0x00FF0000;  /* 清并口输出 */
        IO1SET |= 0x00100000; //输出A0(P1.17)=0,CS=0,WR=0,RD=1;
        IO1DIR |= 0x001E0000;  /* 设置CS,WR,RD,A0为输出 */
        IO2SET |= ( (uint32)mData << 16 );  /* 向CH376的并口输出数据,移16位是由于P2.16~P2.23为GPIO */
        IO1SET |= 0x000E0000;         //WR=1,CS=1,A0=1
        mDelayuS(2);  /* 至少延时2uS */
}

UINT8 ReadCH376Data( void )                        /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
{
        UINT8 mData;
        mDelayuS(2);  /* 至少延时1.2uS */
        IO2DIR &= 0xFF00FFFF;  /* 读操作输入 */
        IO1SET |=0x00100000; //输出A0(P1.17)=0,CS=0,WR=0,RD=1;
        IO1DIR |= 0x001E0000;  /* 设置CS,WR,RD,A0为输出 */
        mData = (UINT8)( IO2PIN >> 16 );  /* 从CH376的并口P2.16-P2.23输入数据 */
        IO1SET |= 0x000E0000;         //WR=1,CS=1,A0=1
        mDelayuS(2);  /* 至少延时2uS */
        return( mData );
}
/******************************************************************
- 功能描述:初始化CH376芯片
- 隶属模块:CH376模块
- 函数属性:外部,供用户调用
- 参数说明:无
- 返回说明:执行结果
******************************************************************/



UINT8 CH376_Init()
{
UINT8 i=0;
WriteCH376Cmd(CMD_GET_IC_VER);  /* 获取芯片及固件版本 */
i=ReadCH376Data();  /* 版本 */
if(i<0xA2) return 1;  /* 不支持该芯片 */

WriteCH376Data(CMD_SET_USB_MODE);  /* 设置USB工作模式 */
WriteCH376Data(6);  /* 模式代码,自动检测USB设备连接 */

for(i=0;i<250;i++)
{  /* 等待操作成功,通常需要等待10uS-20uS */
mDelayuS(20) ;
  if(ReadCH376Data()==CMD_RET_SUCCESS )
   return 0;  /* 操作成功 */
}

return 1;  /* CH376出错,例如芯片型号错或者处于串口方式或者不支持 */
}


UINT8 CH376_Wait_Int() //等待中断信号,即INT引脚上产生低电平,并获取中断状态码,获取后INT恢复高电平,以产生下一次中断信号
{

IO1SET |= 0x00010000;//INT=P1.16先为高电平
while(IO1PIN &= 0x00010000 ==0 ); //等待中断,INT=P1.16变为高电平
WriteCH376Cmd( CMD_GET_STATUS);//产生操作完成中断,获取中断状态
return ReadCH376Data();
}

/******************************************************************
- 功能描述:初始化磁盘
- 隶属模块:CH376模块
- 函数属性:外部,供用户调用
- 参数说明:无
- 返回说明:操作结果,0表示初始化磁盘成功
                       1表示初始化磁盘失败
- 注:在使用U盘之前,先要调用此函数,此函数将进行判断
            磁盘是否连接,初始化是否成功等操作
******************************************************************/

UINT8 CH376_InitDisk()
{
UINT8 status,i,j=0;

status=CH376_Wait_Int();
if(status==USB_INT_DISCONNECT) return 1;  /* USB设备断开 */

while(1)
{
  WriteCH376Cmd(CMD_DISK_INIT);  /* 初始化USB存储器 */
  status=CH376_Wait_Int();             /* 等待中断并获取状态 */
  if(status==USB_INT_SUCCESS)
   break;
}

while(1)         //以下代码均源自沁恒的官方U盘初始化函数,借用它可以提高对U盘的兼容性!
{   
  j++;
  WriteCH376Cmd(CMD_DISK_SIZE);  /* 获取USB存储器的容量 */
  status=CH376_Wait_Int();             /* 等待中断并获取状态 */
  if(status==USB_INT_SUCCESS)
   break;
  else
  {
  mDelaymS(2) ;
   WriteCH376Cmd(CMD_DISK_R_SENSE); /* 获取USB存储器的容量 */
   status=CH376_Wait_Int();                 /* 等待中断并获取状态 */
   if(status==USB_INT_SUCCESS)            /* 出现错误 */
        continue;
   else
    return 1;
  }
  if(j==5)
   return 1;
}
for(i=0;i!=5;i++)
{
WriteCH376Cmd( CMD_DISK_READY );     /* 获取USB存储器的容量 */
  status=CH376_Wait_Int();                 /* 等待中断并获取状态 */
  if(status==USB_INT_SUCCESS)
   return 0;                           /* U盘已经成功初始化 */
}
return 1;
}

int main(void)
{
CH376_Init(); //初始化CH375芯片
CH376_InitDisk();         //初始化U盘

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lstcspring
1楼-- · 2019-07-16 14:23
国产的芯片,直接跟厂家沟通,最直接,下个例程序测试一下
晚点丶
2楼-- · 2019-07-16 17:14
lstcspring 发表于 2012-9-25 12:38
国产的芯片,直接跟厂家沟通,最直接,下个例程序测试一下

额,还是谢谢了。
wsh171453188
3楼-- · 2019-07-16 20:54
您好  你的问题解决了吗?    我想看一下您的IO2DIR   IO1SET   这样的定义   我也在做CH376的事情  用的是16位的单片机   他们之间的通讯弄不清楚了

一周热门 更多>