各位哥哥姐姐,小弟現(xiàn)在遇到一點問題;由于是第一次用ch375b來進行開發(fā),所以有不懂或者存在錯誤之處請多指教;我的文字比較多,請大家耐心閱讀;
該程序主要是為了用單片機控制ch375作為主機來讀取cp2102輸出的數(shù)據(jù);
1 程序的實際設計流程是:先設置430的端口初始化375硬件復位 設置ch375初始化,并設置模式6 檢測是否有信號連接 設置模式7 設置模式6 獲取設備描述符; 這只usb設備地址; 獲取配置描述符:包括配置描述符,接口描述符,以及兩個端點描述符 設置配置值:set_config(1) 數(shù)據(jù)發(fā)送; 數(shù)據(jù)接收;
2 我發(fā)送數(shù)據(jù)從ch375主機的主機端口endp6、7發(fā)送接收數(shù)據(jù),設備端的 cp2102只有端點1的兩個地址:1和81; 現(xiàn)在的現(xiàn)象:到set_config(1)能夠正常運行;但是在數(shù)據(jù)傳輸以及接收的時候就不能夠正常運行了;其中發(fā)送后沒有反應,讀取中斷后也是0下4,不是0x0a;
3 發(fā)送空數(shù)據(jù)包提示cp2102發(fā)送數(shù)據(jù),但是發(fā)送空數(shù)據(jù)包后沒有產(chǎn)生中斷:標志就是ch375的p9.7(int#)沒有置低,無法繼續(xù)運行; 接收數(shù)據(jù)時也是遇到了同樣的問題,當發(fā)送完數(shù)據(jù)后,收到的產(chǎn)生中斷的標志,ch375的p9.7(int#)沒有置低,無法繼續(xù)運行; 其中通過issue——token命令發(fā)送的接收令牌為:19;發(fā)送令牌為:11;端點號為cp2102的端點1; 4 我現(xiàn)在不明白是不是我和通訊傳輸?shù)膆ost——send或者host——recv函數(shù)編寫有錯誤,具體是哪里不對自己找不到原因; 還是我的枚舉過程有錯誤????
程序代碼如下所示:
#include /*引用5438的頭文件*/ #include "CH375INC.H" /* 定義CH375命令代碼及返回狀態(tài) */ #include /* 以下為通用的單片機C程序,引用51單片機中的頭文件 */ #include /* 以下為通用的單片機C程序 */
unsigned char descrm_Readdata[64]; unsigned char buffer[64]; /* 公用緩沖區(qū) */ 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; /* 設備數(shù)據(jù)接收端點的端點尺寸 */
/* 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輸出高電平,不觸發(fā)中斷*/ P9OUT |=BIT7; //p9.7置高,防止產(chǎn)生中斷 P6SEL = 0x00; /* 設置P6為普通IO口 */ P6DIR = 0x00; /* 設置P6口8位并口輸入 */ }
/* 基本操作 */
void WriteCH375Cmd( unsigned char mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { _NOP( ); _NOP( );_NOP( );_NOP( ); _NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ P3DIR |= 0x0F; /* 設置P1口A0,CS,WR,RD為輸出控制信號 */ A01; /*指向命令端口*/ P6OUT = mCmd; /* 向CH375的并口輸出命令數(shù)據(jù) */ P6DIR = 0xFF; /* 寫操作所以數(shù)據(jù)輸出 */ 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; /* 禁止數(shù)據(jù)輸出 */ A00; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ }
/* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ void WriteCH375Data( unsigned char mData ) { _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ P3DIR |= 0x0F; /* 設置P1口A0,CS,WR,RD為輸出控制信號 */ A00; /*指向數(shù)據(jù)端口*/ P6OUT = mData; /* 向CH375的并口輸出數(shù)據(jù) */ P6DIR = 0xFF; /* 寫操作所以數(shù)據(jù)輸出 */ 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; /* 禁止數(shù)據(jù)輸出 */ A01; _NOP( ); _NOP( ); _NOP( ); _NOP( );_NOP( ); _NOP( ); /* 至少延時2uS,實際由于模擬I/O較慢而只需少量延時 */ }
/* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ unsigned char ReadCH375Data( void ) { _NOP( );_NOP( );_NOP( );_NOP( );_NOP( ); /* 至少延時1uS,實際由于模擬I/O較慢而不一定有必要 */ P3DIR |= 0x0F; /* 設置P1口A0,CS,WR,RD為輸出控制信號 */ A00; /*指向數(shù)據(jù)端口*/