求助 :ch376与smart2200 插上U盘CH376不亮
时间:10-02
整理:3721RD
点击:
我插上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盘
}
#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盘
}
国产的芯片,直接跟厂家沟通,最直接,下个例程序测试一下
额,还是谢谢了。
您好 你的问题解决了吗? 我想看一下您的IO2DIR IO1SET 这样的定义 我也在做CH376的事情 用的是16位的单片机 他们之间的通讯弄不清楚了