📄 ch375host.lst
字号:
C51 COMPILER V7.20 CH375HOST 03/07/2006 16:55:19 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE CH375HOST
OBJECT MODULE PLACED IN CH375Host.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil Uvision V7.20\C51\BIN\C51.EXE CH375Host.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //=================================================================================================
2 //*************************************************************************************************
3 // Module Name : CH375Host.C
4 // Device object:
5 // Create date : 2005-11-07
6 // Modify date : 2005-11-16
7 // Description : USB 1.1 Host for CH375
8 // USB 2.0 Host for CH375
9 // Author : Li yuanzheng
10 // Version : V1.0
11 //*************************************************************************************************
12 //=================================================================================================
13 //
14 // 如果设备端不是CH37X,那么分析描述符
15 // CH375中断为查询方式
16 //
17 //-------------------------------------------------------------------------------------------------
18 // Includes
19 //-------------------------------------------------------------------------------------------------
20
21 #include <regx52.h> // SFR declarations
22 //#include <string.h>
23 //#include <stdio.h>
24 //#include <intrins.h>
25
26 #include "CH375Host.H"
27
28
29 //*************************************************************************************************
30 //*************************************************************************************************
31 // Global VARIABLES
32 //*************************************************************************************************
33 //*************************************************************************************************
34 //
35 unsigned char RECV_LEN; // 刚接收到的数据的长度
36 unsigned char idata RECV_BUFFER[ CH375_MAX_DATA_LEN ]; // 数据缓冲区,用于保存接收到的下传数据,长度为0到64
-字节
37 unsigned char idata *CommandBuffer;
38 unsigned char idata *ReceiveBuffer;
39
40 #define p_dev_descr ( (PUSB_DEV_DESCR)RECV_BUFFER )
41 #define p_cfg_descr ( (PUSB_CFG_DESCR_LONG)RECV_BUFFER )
42
43 unsigned char EndpOutAddr; // USB数据接收端点的端点地址
44 unsigned char EndpOutSize; // USB数据接收端点的端点尺寸
45 unsigned char EndpInAddr; // USB状态发送端点的端点地址,为0则只支持单向接口
46 unsigned char Endp6Mode, Endp7Mode; //
47
48 //=================================================================================================
49 //=================================================================================================
50 // LED Flash
51
52 //=================================================================================================
53 //=================================================================================================
54 //
C51 COMPILER V7.20 CH375HOST 03/07/2006 16:55:19 PAGE 2
55 //=================================================================================================
56 //=================================================================================================
57 //
58 // CH375的INT#引脚连接方式为"查询方式"
59 //-------------------------------------------------------------------------------------------------
60 // 查询 CH375 中断并更新中断状态
61 UINT8 xQueryInterrupt( void )
62 {
*** ERROR C231 IN LINE 62 OF CH375HOST.C: 'xQueryInterrupt': redefinition
63 1 CH375_INT_WIRE = 1;
64 1 while( CH375_INT_WIRE ) // 如果CH375的中断引脚输出高电平则等待
65 1 {
66 2 if( RI==1 ) // 串口接收到数据
67 2 xWriteCH375Cmd( CMD_ABORT_NAK ); // 放弃当前操作
68 2 return( 0xEF );
69 2 }
70 1
71 1 xWriteCH375Cmd( CMD_GET_STATUS ); // 获取当前中断状态
72 1 CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作无意义,用于至少延时2uS
73 1 CH375IntStatus = xReadCH375Data( ); // 获取中断状态
74 1 if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; // 检测到USB设备断开事件
75 1 else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; // 检测到USB设备连接事件
76 1
77 1 return( CH375IntStatus );
78 1 }
*** ERROR C231 IN LINE 78 OF CH375HOST.C: 'xQueryInterrupt': redefinition
79
80 //-------------------------------------------------------------------------------------------------
81 // 设置CH37X的工作模式
82 void CH375_SetUSBMode( unsigned char mode )
83 {
84 1 unsigned char i;
85 1
86 1 xWriteCH375Cmd( CMD_SET_USB_MODE ); // 设置USB工作模式
87 1 xWriteCH375Data( mode );
88 1 Endp6Mode = Endp7Mode = 0x80; // 主机端复位USB数据同步标志
89 1
90 1 for( i=100; i!=0; i-- ) // 等待设置模式操作完成,不超过30uS
91 1 {
92 2 if( xReadCH375Data( ) == CMD_RET_SUCCESS ) return; // 成功
93 2 }
94 1 mStopIfError( 0xFF ); // CH375出错
95 1 }
96
97 //-------------------------------------------------------------------------------------------------
98 // 数据同步
99 // USB的数据同步通过切换DATA0和DATA1实现: 在设备端, USB设备可以自动切换;
100 // 在主机端, 必须由SET_ENDP6和SET_ENDP7命令控制CH375切换DATA0与DATA1.
101 // 主机端的程序处理方法是为设备端的各个端点分别提供一个全局变量,
102 // 初始值均为DATA0, 每执行一次成功事务后取反, 每执行一次失败事务后将其复位为DATA1
103 // (初始值均为80H, 每执行一次成功事务后将位6取反, 每执行一次失败事务后将其复位为80H.)
104 //-------------------------------------------------------------------------------------------------
105 // 主机接收成功后,切换DATA0和DATA1实现数据同步
106 void CH375_ToggleReceive( void )
107 {
108 1 xWriteCH375Cmd( CMD_SET_ENDP6 );
109 1 xWriteCH375Data( Endp6Mode );
110 1 Endp6Mode ^= 0x40; // 位7为1则位6为同步触发位, 否则同步触发位不变
111 1 mDelayuS( 2 );
112 1 }
113
114 //-------------------------------------------------------------------------------------------------
C51 COMPILER V7.20 CH375HOST 03/07/2006 16:55:19 PAGE 3
115 // 主机发送成功后,切换DATA0和DATA1实现数据同步
116 void CH375_ToggleSend( void )
117 {
118 1 xWriteCH375Cmd( CMD_SET_ENDP7 );
119 1 xWriteCH375Data( Endp7Mode );
120 1 Endp7Mode ^= 0x40; // 位7为1则位6为同步触发位, 否则同步触发位不变
121 1 mDelayuS( 2 );
122 1 }
123
124 //-------------------------------------------------------------------------------------------------
125 //-------------------------------------------------------------------------------------------------
126 // 主机接收失败后,复位设备端的数据同步到DATA0
127 unsigned char CH375_ClrStall6( void )
128 {
129 1 xWriteCH375Cmd( CMD_CLR_STALL );
130 1 xWriteCH375Data( 2 | 0x80 ); // 对于IN端点,有效地址是81H~8FH
131 1 // xWriteCH375Data( EndpOutAddr | 0x80 );// 如果设备端不是CH37X芯片,那么需要修改端点号
132 1 Endp6Mode = 0x80;
133 1
134 1 return( xQueryInterrupt( ) );
135 1 }
136
137 //-------------------------------------------------------------------------------------------------
138 // 主机发送失败后,复位设备端的数据同步到DATA0
139 unsigned char CH375_ClrStall7( void )
140 {
141 1 xWriteCH375Cmd( CMD_CLR_STALL );
142 1 xWriteCH375Data( 2 ); // 对于OUT端点,有效地址是01H~0FH
143 1 // xWriteCH375Data( EndpOutAddr ); // 如果设备端不是CH37X芯片,那么需要修改端点号
144 1 Endp7Mode = 0x80;
145 1
146 1 return( xQueryInterrupt( ) );
147 1 }
148
149 //-------------------------------------------------------------------------------------------------
150 // 数据读写, 单片机读写CH372或者CH375芯片中的数据缓冲区
151 //-------------------------------------------------------------------------------------------------
152 // 从CH37X读出数据块
153 unsigned char CH375_ReadUSBData( unsigned char *buffer )
154 {
155 1 unsigned char i, length;
156 1
157 1 xWriteCH375Cmd( CMD_RD_USB_DATA ); // 从CH375的端点缓冲区读取接收到的数据
158 1 i = xReadCH375Data( ); // 后续数据长度( 0--64B )
159 1 length = i;
160 1
161 1 while( i-- )
162 1 {
163 2 *buffer++ = xReadCH375Data( );
164 2 }
165 1
166 1 return( length );
167 1 }
168
169 //-------------------------------------------------------------------------------------------------
170 // 向CH37X写入数据块
171 void CH375_WriteUSBData( unsigned char length, unsigned char *buffer )
172 {
173 1 xWriteCH375Cmd( CMD_WR_USB_DATA7 ); // 向CH375的端点缓冲区写入准备发送的数据
174 1 xWriteCH375Data( length ); // 后续数据长度, length不能大于64
175 1
176 1 while( length-- )
C51 COMPILER V7.20 CH375HOST 03/07/2006 16:55:19 PAGE 4
177 1 {
178 2 xWriteCH375Data( *buffer++ );
179 2 }
180 1 }
181
182 //-------------------------------------------------------------------------------------------------
183 // 主机操作
184 //-------------------------------------------------------------------------------------------------
185 // 执行USB事务
186 unsigned char CH375_IssueToken( unsigned char EndpAndPID )
187 {
188 1 unsigned char status;
189 1
190 1 // 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功
191 1 xWriteCH375Cmd( CMD_ISSUE_TOKEN );
192 1 xWriteCH375Data( EndpAndPID ); // 高4位目的端点号, 低4位令牌PID
193 1 status = xQueryInterrupt( ); // 等待CH375操作完成
194 1
195 1 return( status );
196 1 }
197
198 //-----------------------------------------------
199 // 执行USB事务,适用于CH375A
200 unsigned char CH375_IssueToken_X( unsigned char EndpAndPID, unsigned char toggle )
201 {
202 1 unsigned char status;
203 1
204 1 // 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功
205 1 xWriteCH375Cmd( CMD_ISSUE_TOKEN_X );
*** ERROR C202 IN LINE 205 OF CH375HOST.C: 'CMD_ISSUE_TOKEN_X': undefined identifier
206 1 xWriteCH375Data( toggle ); // 同步标志的位7为主机端点IN的同步触发位, 位6为主机端点OUT的同步触
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -