各位哥哥姐姐,小弟现在遇到一点问题;由于是第一次用ch375b来进行开发,所以有不懂或者存在错误之处请多指教;我的文字比较多,请大家耐心阅读;
该程序主要是为了用单片机控制ch375作为主机来读取cp2102输出的数据;
1 程序的实际设计流程是:先设置430的端口初始化375硬件复位 设置ch375初始化,并设置模式6 检测是否有信号连接 设置模式7 设置模式6 获取设备描述符; 这只usb设备地址; 获取配置描述符:包括配置描述符,接口描述符,以及两个端点描述符 设置配置值:set_config(1) 数据发送; 数据接收;
2 我发送数据从ch375主机的主机端口endp6、7发送接收数据,设备端的 cp2102只有端点1的两个地址:1和81; 现在的现象:到set_config(1)能够正常运行;但是在数据传输以及接收的时候就不能够正常运行了;其中发送后没有反应,读取中断后也是0下4,不是0x0a;
3 发送空数据包提示cp2102发送数据,但是发送空数据包后没有产生中断:标志就是ch375的p9.7(int#)没有置低,无法继续运行; 接收数据时也是遇到了同样的问题,当发送完数据后,收到的产生中断的标志,ch375的p9.7(int#)没有置低,无法继续运行; 其中通过issue——token命令发送的接收令牌为:19;发送令牌为:11;端点号为cp2102的端点1; 4 我现在不明白是不是我和通讯传输的host——send或者host——recv函数编写有错误,具体是哪里不对自己找不到原因; 还是我的枚举过程有错误????
程序代码如下所示:
#include /*引用5438的头文件*/ #include "CH375INC.H" /* 定义CH375命令代码及返回状态 */ #include /* 以下为通用的单片机C程序,引用51单片机中的头文件 */ #include /* 以下为通用的单片机C程序 */
unsigned char descrm_Readdata[64]; unsigned char buffer[64]; /* 公用缓冲区 */ unsigned char endp_descr[2]; unsigned char showdata[64]; unsigned char dev_buffer[64],descr[64],m_readdata[256]; unsigned char m_writedata[64]={1,2,3,4,5,6,7,8,9,10,10,9,8,7,6,5,4,3,2,1, 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,40,41,42,43,44,45,46,47,48,49,50,51};
#define p_cfg_descr ((PUSB_CFG_DESCR_LONG)descrm_Readdata) #define USB_INT_RET_NAK 0x2A /* 00101010B,返回NAK */ #define UCHAR unsigned char #define USHORT unsigned short
unsigned int k; unsigned char mData; unsigned char mCmd; unsigned char endp_out_addr;//CP2102shuju fasongdian unsigned char endp_in_addr; //CP2102shuju jieshoudian unsigned char endp6_mode, endp7_mode; unsigned char endp_out_size; /* 设备数据接收端点的端点尺寸 */
/* MSP430单片机的引脚 CH375芯片的引脚 P9.7 INT# P3.3 RD# P3.2 WR# P3.1 A0 P3.0 CS# P6(8位端口) D7-D0 */
#define WR0 (P3OUT &=~BIT2)//p3.2=0 #define WR1 (P3OUT |=BIT2) //p3.2=1 #define RD0 (P3OUT &=~BIT3)//p3.3=0 #define RD1 (P3OUT |=BIT3) //p3.3=1 #define CS0 (P3OUT &=~BIT0)//p3.0=0 #define CS1 (P3OUT |=BIT0) //p3.0=1 #define A00 (P3OUT &=~BIT1)//p3.1=0 #define A01 (P3OUT |=BIT1) //p3.1=1 #define CH375_INT_WIRE (P9IN & BIT7) #define TRUE 1 #define FALSE 0
//#define INT1 (P9OUT |=BIT7) //p9.7=1
/* 主机端的程序示例,C语言,CH375中断为查询方式 */
//定义描述符 typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; } USB_DEV_DESCR, *PUSB_DEV_DESCR;
typedef struct _USB_CONFIG_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; USHORT wTotalLength; UCHAR bNumInterfaces; UCHAR bConfigurationValue; UCHAR iConfiguration; UCHAR bmAttributes; UCHAR MaxPower; } USB_CFG_DESCR, *PUSB_CFG_DESCR;
typedef struct _USB_INTERF_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bInterfaceNumber; UCHAR bAlternateSetting; UCHAR bNumEndpoints; UCHAR bInterfaceClass; UCHAR bInterfaceSubClass; UCHAR bInterfaceProtocol; UCHAR iInterface; } USB_ITF_DESCR, *PUSB_ITF_DESCR;
typedef struct _USB_ENDPOINT_DESCRIPTOR { UCHAR bLength; UCHAR bDescriptorType; UCHAR bEndpointAddress; UCHAR bmAttributes; UCHAR wMaxPacketSize; UCHAR wMaxPacketSize1; UCHAR bInterval; } USB_ENDP_DESCR, *PUSB_ENDP_DESCR;
typedef struct _USB_CONFIG_DESCRIPTOR_LONG { USB_CFG_DESCR cfg_descr; USB_ITF_DESCR itf_descr; USB_ENDP_DESCR endp_descr[2]; } USB_CFG_DESCR_LONG, *PUSB_CFG_DESCR_LONG;
/* 延时m微秒,不精确 */ void delaymus(int m) { unsigned char i; for ( i = m; i != 0; i -- ); }
/* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ void MSP430ANDCH375_PORT_INIT( ) { P3SEL &=~BIT3+BIT2+BIT1+BIT0; /* 设置P3.0--P3.3为普通IO口 */ P3OUT |= BIT3+BIT2+BIT0; /* 设置A0为低电平,CS,WR,RD默认为高电平 */ P3DIR |= BIT3+BIT2+BIT1+BIT0; /* 设置CS,WR,RD,A0为输出 */ P9SEL = 0x00; /* 设置P9为普通IO口 */ P9DIR = 0x7F; /* 设置INT#为输入,其余为输出*/ P9OUT &=~BIT6+BIT5+BIT4+BIT3+BIT2+BIT1+BIT0; /* 设置P9.7输出高电平,不触发中断*/ P9OUT |=BIT7; //p9.7置高,防止产生中断 P6SEL = 0x00; /* 设置P6为普通IO口 */ P6DIR = 0x00; /* 设置P6口8位并口输入 */ }
/* 基本操作 */
void WriteCH375Cmd( unsigned char mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { _NOP( ); _NOP( );_NOP( );_NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ P3DIR |= 0x0F; /* 设置P1口A0,CS,WR,RD为输出控制信号 */ A01; /*指向命令端口*/ P6OUT = mCmd; /* 向CH375的并口输出命令数据 */ P6DIR = 0xFF; /* 写操作所以数据输出 */ CS0; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0(P3.1)=1; CS(P3.0)=0; WR=(P3.2)=0; RD(P3.3)=1; */ WR0; RD1; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); WR1; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P3.1)=1; CS(P3.0)=1; WR=(P3.2)=1; RD(P3.3)=1; */ CS1; P6DIR = 0X00; /* 禁止数据输出 */ A00; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ }
/* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ void WriteCH375Data( unsigned char mData ) { _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ P3DIR |= 0x0F; /* 设置P1口A0,CS,WR,RD为输出控制信号 */ A00; /*指向数据端口*/ P6OUT = mData; /* 向CH375的并口输出数据 */ P6DIR = 0xFF; /* 写操作所以数据输出 */ CS0; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0(P3.1)=1; CS(P3.0)=0; WR=(P3.2)=0; RD(P3.3)=1; */ WR0; RD1; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度为100nS */ _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); WR1; /* 输出无效的控制信号, 完成操作CH375芯片, A0(P3.1)=1; CS(P3.0)=1; WR=(P3.2)=1; RD(P3.3)=1; */ CS1; P6DIR = 0X00; /* 禁止数据输出 */ A01; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 至少延时2uS,实际由于模拟I/O较慢而只需少量延时 */ }
/* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ unsigned char ReadCH375Data( void ) { _NOP( );_NOP( );_NOP( );_NOP( );_NOP( ); /* 至少延时1uS,实际由于模拟I/O较慢而不一定有必要 */ P3DIR |= 0x0F; /* 设置P1口A0,CS,WR,RD为输出控制信号 */ A00; /*指向数据端口*/