请教一个问题,CH375用于设备外置固件模式,枚举时怎么不产生USB_INT_EP0_IN啊?

帮帮忙吧,我用CH375做U盘马上就要答辩了,可是我连枚举都没完成那? 谢谢了?

(1)先前的Setup中断,数据包不是8字节的问题解决没? (2)USB_INT_EP0_IN是这样产生的:分析完Setup包,首先把相关数据用WR_USB_DATA3写入端点0的上传缓冲区,当数据被计算机取走,才会产生这个中断


另外: 下载CH372EVT.ZIP,,里面有XFRIM文件夹,参考这个程序就可以了,你也可以先把这个程序跑起来,然后修改一下描述符,在进行一些协议处理就可以了.


哥们我还是没找到原因啊,读出来的还是0X07,我也不知道是怎么回事都跳好几天了 能不能是硬件的事啊


把你的程序贴出来看看.


我用的是atmega64L.8M晶振

#include #include #include #include #include #define uint unsigned int #define uchar unsigned char

#define CH375_CS_PORT PORTD #define CH375_CS_BIT PD2

#define CH375_INT_PIN PIND #define CH375_INT_BIT PD3

#define CH375_WR_PORT PORTD #define CH375_WR_BIT PD4

#define CH375_RD_PORT PORTD #define CH375_RD_BIT PD5

#define CH375_A0_PORT PORTD #define CH375_A0_BIT PD6

#define CH375_DDR DDRA #define CH375_PIN PINA #define CH375_PORT PORTA #define CH375_WR_H CH375_WR_PORT |= 1<#define CH375_WR_L CH375_WR_PORT &= ~(1< #define CH375_RD_H CH375_RD_PORT |= 1<#define CH375_RD_L CH375_RD_PORT &= ~(1< #define CH375_A0_H CH375_A0_PORT |= 1<#define CH375_A0_L CH375_A0_PORT &= ~(1< #define CH375_CS_H CH375_CS_PORT |= 1<#define CH375_CS_L CH375_CS_PORT &= ~(1< #define CH375_INT_ACTIVE (CH375_INT_PIN &= 1< #define CH375_TO_MCU CH375_DDR = 0x00 #define MCU_TO_CH375 CH375_DDR = 0xff

#define CH375_DAT_OUT CH375_PIN #define CH375_DAT_IN CH375_PORT

typedef union _REQUEST_PACK { unsigned char buffer[8]; struct { unsigned char bmReuestType; //标准请求字 unsigned char bRequest; //请求代码 unsigned int wValue; //特性选择高 unsigned int wIndx; //索引 unsigned int wLength; //数据长度 }r; } mREQUEST_PACKET, *mpREQUEST_PACKET;

//设备描述符 unsigned char DevDes[]={ 0x12 //描述符大小 ,0x01 //常数DEVICE ,0x10 //USB规范版本信息 ,0x01 ,0x00 //类别码, ,0x00 //子类别码 ,0x37 //协议码 ,0x08 //端点0的最大信息包大小 ,0x48 //厂商ID ,0x43 ,0x37 //产品ID ,0x55 ,0x00 //设备版本信息 ,0x01 ,0x00 //索引值 ,0x00 ,0x00 ,0x01 //可能配置的数目 ,0x00 //无意义 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 }; //配置描述符 unsigned char ConDes[]={ //配置描述符 0x09 //描述符大小 , 0x02 //常数CONFIG , 0x27 //此配置传回所有数据大小 , 0x00 // , 0x01 //接口数 , 0x01 //配置值 , 0x00 //索引 , 0x80 //电源设置 , 0x40 //需要总线电源 //接口描述符 , 0x09 //描述符大小 , 0x04 //常数INTERFACE , 0x00 //识别码 , 0x00 //代替数值 , 0x02//0x03 //支持的端点数 , 0x08//0xFF //类别码 , 0x06//0x80 //子类别码 , 0x50//0x37 //协议码 , 0x00 //索引 //端点描述符 , 0x07 //述符大小 , 0x05 //常数ENDPOINT , 0x82 //端点数目及方向 , 0x02 //支持的传输类型 , 0x40 //支持的最大信息包大小 , 0x00 , 10//0x00 //帧等待时间 , 0x07 , 0x05 , 0x02 , 0x02 , 0x40 , 0x00 , 0x00

}; //配置描述符 unsigned char LangDes[]={0x04,0x03,0x09,0x04}; //语言描述符 //unsigned char SerDes[]={0x12,0x03,'C',0,'H',0,'3',0,'7',0,'5',0,'U',0,'S',0,'B',0}; //字符串描述符 unsigned char SerDes[14]= { 14, //该描述符的长度为14字节 0x03, //字符串描述符的类型编码为0x03 0x55, 0x00, //U 0xd8, 0x76, //盘 0x14, 0x20, // 0xf3, 0x77, // 0x6f, 0x66, // 0xcc, 0x53 // };

unsigned char mVarSetupRequest; // ;USB请求码 unsigned char mVarSetupLength; // ;后续数据长度 unsigned char * VarSetupDescr; // ;描述符偏移地址

unsigned char VarUsbAddress ; //设备地址

unsigned char CH375FLAGERR; //错误标志 unsigned char CH375CONFLAG; //配置标志

mREQUEST_PACKET request; //CH375写命令 void CH375_WriteCMD(uint CMD) { //CH375_CS_L(); //使能芯片 MCU_TO_CH375; CH375_A0_H; CH375_DAT_IN = CMD; CH375_WR_L; asm("nop"); //asm("nop"); //asm("nop;"); //asm("nop;"); CH375_WR_H; Delay1us(); }

//CH375写数据 void CH375_WriteDAT(uint DAT) { //CH375_CS_L(); MCU_TO_CH375; CH375_A0_L; CH375_DAT_IN = DAT; CH375_WR_L; asm("nop"); //asm("nop"); //asm("nop;"); //asm("nop;"); CH375_WR_H; //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;");

//_delay_us(1); }

//CH375读数据 uint CH375_ReadDAT(void) { uint temp; CH375_TO_MCU; CH375_A0_L; CH375_RD_L; asm("nop"); //asm("nop"); //asm("nop;"); //asm("nop;"); temp = CH375_DAT_OUT; //写命令 CH375_RD_H; //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;"); //asm("nop;");

//_delay_us(1); return temp; } /* 延时2微秒,不精确 */ void Delay1us() { ; }

void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); }

/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); } int USART_putchar(char CH) { while ( !( UCSR0A & (1< UDR0=CH; return 0; }

int USART_getchar(void) { while ( !(UCSR0A & (1< return UDR0; }

void COM_Initial(void) { UBRR0H = 0; UBRR0L =51;//XTAL=8M 波特率=9600 UCSR0B = (1<} void putstring(unsigned char *s)//输出字符串 { unsigned int i,j=strlen(s); for(i=0;i USART_putchar(*s++); USART_putchar(0x0d); USART_putchar(0x0a); } /* CH375初始化子程序 */ void CH375_Init( ) { uint RD_Data,k; /* 设置USB工作模式, 必要操作 */ CH375_WriteCMD( CMD_SET_USB_MODE ); CH375_WriteDAT(1); /* 设置为使用外置固件的USB设备方式 */ for ( ;; ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_ReadDAT( )==CMD_RET_SUCCESS ) { //putstring("mode ok"); break; } else {} //putstring("mode error"); } for( k=100; k!=0; k-- ) {CH375_WriteCMD( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */ CH375_WriteDAT( 0xAA ); /* 写入测试数据 */ RD_Data = CH375_ReadDAT(); if ( RD_Data == 0x55 ) { //putstring("test ok"); break; } else { //putstring("test error"); } } } //*********************************************************

//********************************************************* //端点0数据上传 void mCh375Ep0Up() { uint i,len; //putstring("mCh375Ep0Up"); if(mVarSetupLength) { //长度不为0传输具体长度的数据 if(mVarSetupLength<=8) { len=mVarSetupLength; mVarSetupLength=0; } //长度小于8则按实际要求的长度输出 else { len=8; mVarSetupLength-=8; } //长度大于8则传输8个,切总长度减8 CH375_WriteCMD(CMD_WR_USB_DATA3); //发出写端点0的命令 CH375_WriteDAT(len); //写入长度 for(i=0;i!=len;i++) CH375_WriteDAT(request.buffer[i]); //循环写入数据 //putstring("shangchuan"); } else { CH375_WriteCMD(CMD_WR_USB_DATA3); //发出写端点0的命令 CH375_WriteDAT(0); //上传0长度数据,这是一个状态阶段 } }

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

//复制描述符以便上传 void mCh375DesUp(){ unsigned char k; for (k=0; k!=8; k++ ) { request.buffer[k]=*VarSetupDescr; //依次复制8个描述符, VarSetupDescr++; } }

/* CH375中断服务程序INT3 */ SIGNAL(SIG_INTERRUPT3) //否则用查询,修改熔丝位去掉103模式,对引脚设置成上拉电阻否则进中断就出不来了 { unsigned char InterruptStatus; unsigned char length, c1, len,i; uint a[16]; //unsigned char *pBuf; //unsigned char mBuf[64]; //putstring("INT"); CH375_WriteCMD(CMD_GET_STATUS); InterruptStatus =CH375_ReadDAT(); switch(InterruptStatus) { // 分析中断状态 case USB_INT_EP2_OUT: // 批量端点下传成功 CH375_WriteCMD(CMD_UNLOCK_USB); // putstring("EP2 IN");


你说的七个字: CH375_WriteCMD(CMD_RD_USB_DATA); length=CH375_ReadDAT(); for(len=0;len!=length;len++)request.buffer[len]=CH375_ReadDAT(); // 取出数据 是指length=7个? 另外你先不用着急去修改描述符,描述符号已经被你修改错误了.


我说的是length=0x07,而应该是等于0x08才对吧,要不if(length==0x08)这个语句进不去啊


是需要你确认length到底是多少,先前你不是说是7么?


读出来的第一个数据即长度就是7


不好意思说错了,我说的是长度,不是读出来的数据


if(length==0x08)到底进去了没有,如果您提供的信息是错误的,甚至不可能产生的现象,我们分析不出来具体的问题出在那里


确实没进去,读出来的长度等于0x07,把if(length==0x08)改成if(length==0x07)就进去了 能不能是我的芯片有问题啊


(1)这个现象很奇怪,按USB协议规定,是不可能产生的,把三个读写子函数调整一下试试 void CH375_WriteCMD(uint CMD) { CH375_DAT_IN = CMD; MCU_TO_CH375; CH375_A0_H; CH375_WR_L; asm("nop"); asm("nop"); CH375_WR_H; CH375_A0_L; _delay_us( 1 ); }

//CH375写数据 void CH375_WriteDAT(uint DAT) { CH375_DAT_IN = DAT; MCU_TO_CH375; CH375_A0_L; CH375_WR_L; asm("nop"); asm("nop"); CH375_WR_H; _delay_us( 1 ); }

//CH375读数据 uint CH375_ReadDAT(void) { uint temp;

CH375_TO_MCU; CH375_A0_L; CH375_RD_L; asm("nop"); asm("nop"); temp = CH375_DAT_OUT; //写命令 CH375_RD_H; _delay_us(1); return temp; } (2)在length=CH375_ReadDAT()后把length用串口打印出来 还是不行的话,就换个芯片试试吧


哥们我调整一下子函数以后下MCU里就好使了 真是太感谢了,说真的你们的服务真是太到位了 你们辛苦了!!


哥们,能留一个联系方式吗?更你一样的境遇。。。


只有登录才能回复,可以选择微信账号登录