📄 debug375.c
字号:
#include <reg51.h>
//#include <stdio.h>
#include <string.h>
/*端口地址依然可用*/
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */
sbit CH375_INT_WIRE = 0xB0^2; /* P3.2, INT0, 连接CH375的INT#引脚,用于查询中断状态 */
#define INT8 unsigned char
//外部命令
#define CMD_RESET_ALL 0x05 /* 执行硬件复位 */
#define CMD_CHECK_EXIST 0x06 /* 测试工作状态 */
#define CMD_SET_USB_MODE 0x15
#define CMD_DISK_INIT 0x51
#define CMD_GET_STATUS 0x22
#define CMD_DISK_SIZE 0x53
#define CMD_RD_USB_DATA 0x28
#define CMD_DISK_READ 0x54
#define CMD_DISK_RD_GO 0x55
#define CMD_DISK_WRITE 0x56
#define CMD_DISK_WR_GO 0x57
#define CMD_RD_USB_DATA 0x28
#define CMD_WR_USB_DATA 0x2B
//操作状态结果
#define CMD_RET_SUCCESS 0x51 //操作成功
#define CMD_RET_ABORT 0x5F //操作失败
//中断状态结果
#define USB_INT_SUCCESS 0x14
#define USB_INT_DISK_READ 0x1D
#define USB_INT_DISK_WRITE 0x1E
//#define flash_pro(x) {if(c==x) flash_led2();//正确慢闪
//else flash_led1();} //错误快闪
unsigned char c; //用于返回命令状态
unsigned char xdata *pchar;
unsigned char xdata Usb_Buf[64];
/* 延时1微秒 */
void mDelay1uS( )
{
INT8 i;
for ( i = 1; i != 0; i -- );
}
/* 延时2微秒*/
void mDelay2uS( )
{
INT8 i;
for ( i = 2; i != 0; i -- );
}
/* 延时100毫秒*/
void mDelay100mS( )
{
INT8 i, j,cn;
for ( i = 150; i != 0; i -- )
for ( j = 200; j != 0; j -- )
cn+=3;
}
/* 向CH375命令端口写命令数据 */
void CH375_CMD_PORT_d_out( INT8 d_out )
{
mDelay1uS( );
CH375_CMD_PORT=d_out;
mDelay2uS( ); /* 至少延时2uS */
}
/* 向CH375数据端口写数据 */
void CH375_DAT_PORT_d_out( INT8 d_out )
{
CH375_DAT_PORT=d_out;
mDelay1uS( );
}
INT8 CH375_DAT_PORT_in( )
{
mDelay1uS( );
return( CH375_DAT_PORT );
}
//快闪灯
void flash_led1()
{
P1=0xff; //灯灭
mDelay100mS( );
P1=0x00; //灯亮
mDelay100mS( );
}
//慢闪灯
void flash_led2()
{
P1=0xff; //灯灭
mDelay100mS( );
mDelay100mS( );
mDelay100mS( );
P1=0x00; //灯亮
mDelay100mS( );
mDelay100mS( );
mDelay100mS( );
}
/*******************************************************/
print_s(unsigned char *pstring,unsigned char string_len)//打印字符串,pstring为字符串首址,string_len为长度
{
while(string_len--)
{
SBUF=*pstring;
while(!TI){};
pstring++;
TI=0;
}
}
/*******************************************************/
unsigned char mWaitInterrupt( )
{
// unsigned char c;
while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */
CH375_CMD_PORT_d_out(CMD_GET_STATUS); /* 获取当前中断状态 */
c = CH375_DAT_PORT_in(); /* 返回中断状态 */
/* if ( c == USB_INT_DISCONNECT ) /* 检测到USB设备断开事件 */
/* else if ( c == USB_INT_CONNECT ) /* 检测到USB设备连接事件 */
return( c );
}
void mCH375Reset()
{
unsigned char xdata str_array[30]={"CH375 RESET starting...\n"};
pchar=str_array;
CH375_CMD_PORT_d_out(CMD_RESET_ALL);
print_s(pchar,3);
mDelay100mS();
}
unsigned char mCH375Init( )//初始化375芯片,验证正确性
{
//unsigned char c;
unsigned char xdata str_array[30]={"CH375 initial successed!\n"};
pchar=str_array;
//P2=0xBC;
//P2=0xBD;
CH375_CMD_PORT_d_out(CMD_CHECK_EXIST); /* 测试工作状态 */
CH375_DAT_PORT_d_out(0x23); /* 测试数据 */
c = CH375_DAT_PORT_in(); /* 返回数据应该是测试数据取反 */
if ( c == 0xdc )
{
flash_led2();//正确慢闪
print_s(pchar,30);
}
else
{
flash_led1();//错误快闪
strcpy(pchar,"CH375 initial failed!\n");
print_s(pchar,30);
}
//printf("the CH375Init value is",&c)
return(c);
}
unsigned char mSetMode() //设定工作模式为“未启用的USB主机方式”
{
unsigned char i;
unsigned char xdata str_array[30]={"SetMode successed!\n"};
pchar=str_array;
CH375_CMD_PORT_d_out(CMD_SET_USB_MODE);
CH375_DAT_PORT_d_out( 0x06);
for(i=20;i==0;i--) mDelay1uS( );
c = CH375_DAT_PORT_in();
if(c==CMD_RET_SUCCESS)
{
flash_led2();//正确慢闪
print_s(pchar,30);
}
else
{
flash_led1();//错误快闪
strcpy(pchar,"SetMod failed\n");
print_s(pchar,30);
}
return(c);
}
unsigned char mDiskInit() //磁盘初始化
{
unsigned char xdata str_array[30]={"Disk initial successed!\n"};
pchar=str_array;
CH375_CMD_PORT_d_out(CMD_DISK_INIT);
c=mWaitInterrupt( );
if(c==USB_INT_SUCCESS)
{
print_s(pchar,30);
flash_led2();//正确慢闪
}
else
{
flash_led1();//错误快闪
strcpy(pchar,"Disk initial failed!");
print_s(pchar,30);
}
// printf("the DiskInit value is",&c)
return(c);
}
unsigned char mDiskSize() //获得磁盘容量,可与上函数作同一函数而传不同参数
{
unsigned char len;
unsigned char mBufferpoint;// _at_ XBYTE[0x0080];
CH375_CMD_PORT_d_out(CMD_DISK_SIZE);
c=mWaitInterrupt( );
if(c==USB_INT_SUCCESS)
{
CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
len=CH375_DAT_PORT_in();
while(len!=0)
{mBufferpoint=CH375_DAT_PORT_in();
len--;
}
}
return(c);
}
//****************************************************
void CH375_Write(unsigned char xdata *Usb_Buf_Startp,unsigned char xdata *Usb_Buf_Endp)//
{
unsigned char count;
unsigned char Usb_Buf_Len;
int i;
if ((Usb_Buf_Endp-Usb_Buf_Startp)>64)
{
Usb_Buf_Len=64;
}
else
{
Usb_Buf_Len=Usb_Buf_Endp-Usb_Buf_Startp;
}
count=64-Usb_Buf_Len;
CH375_CMD_PORT_d_out(CMD_WR_USB_DATA);
CH375_DAT_PORT_d_out(Usb_Buf_Len);
for (i=0;i<Usb_Buf_Len;i++)
{
CH375_DAT_PORT_d_out(*Usb_Buf_Startp);
Usb_Buf_Startp++;
}
for(i=0;i<count;i++)
{
CH375_DAT_PORT_d_out(0xff);
}
}
unsigned char CH375_WriteUD(unsigned char xdata *pData,long LbaNo,int BytesLen)
{
unsigned char xdata *Usb_Startp;
unsigned char xdata *Usb_Endp;
unsigned char SecNum;
//unsigned char help_view=1;//串口输出,作观察数据
unsigned char xdata str_array[30]={"Now write nd data block!/n"};
pchar=str_array;
if(BytesLen==0) return 0;
if(BytesLen%512==0)
{
SecNum=BytesLen<<9 ;
}
else
{
SecNum=((BytesLen<<9)+1);
}
CH375_CMD_PORT_d_out(CMD_DISK_WRITE);
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>0)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>8)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>16)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>24)&0xff));
CH375_DAT_PORT_d_out(SecNum);
while (1)
{
switch (mWaitInterrupt( ))
{
case USB_INT_DISK_WRITE:
if(BytesLen>=64)
{
Usb_Startp=pData;
pData=pData+64;
Usb_Endp=pData;
BytesLen=BytesLen-64;
}
else
{
Usb_Startp=pData;
pData=pData+BytesLen;
Usb_Endp=pData;
BytesLen=0;
}
print_s(pchar,30) ;
//help_view++;
CH375_Write(Usb_Startp,Usb_Endp);//void CH375_Write(void)//U8* Usb_Buf_Startp;U8* Usb_Buf_Endp;
CH375_CMD_PORT_d_out(CMD_DISK_WR_GO);
break;
case USB_INT_SUCCESS:
strcpy(pchar,"Write successed!\n");
print_s(pchar,30);
return 1;
break;
default :
strcpy(pchar,"Write failed!\n");
print_s(pchar,30);
return (0);
break;
}
}
}
/*
void CH375_Read()//unsigned char xdata* pbuffer,unsigned char Rd_DataLen//读Usb_Buf_Len长度的字符到pbuffer所指地址
{
unsigned char Usb_Buf_Len;
unsigned char i,count;
unsigned char nouse_data;//存放读无用数据
CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
Usb_Buf_Len=CH375_DAT_PORT_in();
// count=64-Usb_Buf_Len; //如果其它地方出问题,此处会出现许多bug
if(Rd_DataLen<=Usb_Buf_Len)
{
for (i=0;i<Rd_DataLen;i++)
{
*pbuffer=CH375_DAT_PORT_in();
pbuffer++;
}
for (i=0;i<count;i++)
{
nouse_data=CH375_DAT_PORT_in();
}
}
}
*/
//*******************************************************
unsigned char CH375_ReadUD(unsigned char xdata *pData,long LbaNo,unsigned int BytesLen)
{
//unsigned char Usb_Buf;
unsigned char RSecNum;
unsigned char Usb_Buf_Len;
unsigned char i;//,count;
//unsigned char help_view=1;//串口输出,作观察数据
unsigned char xdata str_array[30]={"Now read the nd data block!/n "};
pchar=str_array;
if(BytesLen==0) return 0;
if(BytesLen%512==0)
{
RSecNum=BytesLen<<9 ;
}
else
{
RSecNum=((BytesLen<<9)+1);
}
CH375_CMD_PORT_d_out(CMD_DISK_READ);
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>0)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>8)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>16)&0xff));
CH375_DAT_PORT_d_out((unsigned char)((LbaNo>>24)&0xff));
CH375_DAT_PORT_d_out(RSecNum);
while (1)
{
switch (mWaitInterrupt( ))
{
case USB_INT_DISK_READ:
/* if(BytesLen>=64)
{
Usb_Len=64;
BytesLen=BytesLen-64;
}
else
{
Usb_Len=BytesLen;
BytesLen=0;
}
print_s(pchar,30);
// help_view++;
CH375_Read(pData,Usb_Len);
*/
print_s(pchar,30);
CH375_CMD_PORT_d_out(CMD_RD_USB_DATA);
Usb_Buf_Len=CH375_DAT_PORT_in();//可加溢出检测
for(i=0;i<Usb_Buf_Len;i++)
{
Usb_Buf[i]= CH375_DAT_PORT_in();//需调试纠正
}
if(BytesLen<=Usb_Buf_Len)
{
for(i=0;i<BytesLen;i++)
{
*pData=Usb_Buf[i];
pData++;
}
BytesLen=0;
}
else
{
for(i=0;i<Usb_Buf_Len;i++)
{
*pData=Usb_Buf[i];
pData++;
}
BytesLen=BytesLen-Usb_Buf_Len;
}
CH375_CMD_PORT_d_out(CMD_DISK_RD_GO);
break;
case USB_INT_SUCCESS:
strcpy(pchar,"Read successed!\n");
print_s(pchar,30);
return 1;
break;
default :
strcpy(pchar,"Read failed!\n");
print_s(pchar,30);
return 0;
break;
}
}
}
//*******************************************************
void ComInit()//串口初始化,定时器方式2,串口方式1,波特率19200
{
PCON|=0x80;
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
}
//*******************************************************
void main()
{
unsigned char xdata look_var[6];
unsigned char xdata test_data1[77]={"where is your friend? reply: it's in my heart,my ideal,my memory! "};//12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcba12345edcb512over"};
unsigned char xdata test_data2[70];
unsigned char xdata *pxout=test_data1;//指向外部RAM的指针
unsigned char xdata *pxin=test_data2;
ComInit(); //串口初始化
mCH375Reset();
look_var[0]=mCH375Init();
look_var[1]=mSetMode();
look_var[2]=mDiskInit();
//look_var[3]=mDiskSize();
look_var[3]=CH375_WriteUD(pxout,2048,70);
look_var[4]=CH375_ReadUD(pxin,2048,70);
//look_var[5]=look_var[4];
print_s(test_data2,70);
while(1);
//ACC=c;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -