📄 chap_9.lst
字号:
196 1 }
197
198
199 void get_descriptor(void)
200 {
201 1 INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue); //读取请求的描述符类型
202 1
203 1 if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
204 1 {//获取设备描述符
205 2 code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
206 2
207 2 }
208 1 else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
209 1 {//获取其它描述符
210 2 if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
211 2 {
212 3 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
213 3 }
214 2 code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
215 2 //发送描述符内容
216 2 }
217 1 else
218 1 stall_ep0();
219 1 }
220
221
222 void get_configuration(void)
223 {
224 1 INT8U c = bEPPflags.bits.configuration; //取出配置值
225 1 single_transmit(&c, 1); //发送配置值
226 1 }
227
228
229 void set_configuration(void)
230 {
231 1 if (ControlData.DeviceRequest.wValue == 0)
232 1 {//配置值不对,设备进入未配置状态
233 2 single_transmit(0, 0);
234 2 DISABLE();
235 2 bEPPflags.bits.configuration = 0;
236 2 ENABLE();
237 2 init_unconfig(); //进入地址状态,禁止0除外的所有端点
238 2 }
239 1 else if (ControlData.DeviceRequest.wValue == 1)
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 5
240 1 {
241 2 single_transmit(0, 0);
242 2 init_unconfig();
243 2 init_config();
244 2 DISABLE();
245 2 bEPPflags.bits.configuration = 1;
246 2 ENABLE();
247 2 }
248 1 else
249 1 stall_ep0();
250 1 }
251
252
253 void get_interface(void)
254 {
255 1 INT8U txdat = 0; //本设备只有一个接口
256 1 single_transmit(&txdat, 1); //发送一个字节
257 1 }
258
259
260 void set_interface(void)
261 {
262 1 if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
263 1 single_transmit(0, 0);
264 1 else
265 1 stall_ep0();
266 1 }
267
268
269 void control_handler(void) //协议控制子程序
270 {
271 1 INT8U type, req;
272 1
273 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK; //读取请求代码
274 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
275 1 if (type == USB_STANDARD_REQUEST)
276 1 (*StandardDeviceRequest[req])(); //标准请求处理
277 1 else
278 1 stall_ep0();
279 1 }
280
281
282 void ep0_rxdone(void) //端点0接收数据
283 {
284 1 INT8U ep_last, i;
285 1 INT8U req[sizeof(DEVICE_REQUEST)];
286 1
287 1 ep_last = D12_ReadLastTransactionStatus(0); //清除中断寄存器状态,取得最后处理状态
288 1 if (ep_last & D12_SETUPPACKET)
289 1 { //如果收到了建立包(Setup包)
290 2 ControlData.wLength = 0; //传输字节总数清0
291 2 ControlData.wCount = 0; //传输字节计数器清0
292 2 if(D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req)
293 2 != sizeof(DEVICE_REQUEST) )
294 2 {
295 3 //从端点0读8个字节失败
296 3 D12_SetEndpointStatus(0, 1); //停止控制端点0
297 3 D12_SetEndpointStatus(1, 1); //停止控制端点1
298 3 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
299 3 return;
300 3 }
301 2 /******* 以下语句通信中的解决大小端问题,使该函数与编译器无关 ****/
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 6
302 2 ControlData.DeviceRequest.bmRequestType = req[0];
303 2 ControlData.DeviceRequest.bRequest = req[1];
304 2 ControlData.DeviceRequest.wValue = req[3] * 256 + req[2];
305 2 ControlData.DeviceRequest.wIndex = req[5] * 256 + req[4];
306 2 ControlData.DeviceRequest.wLength = req[7] * 256 + req[6];
307 2
308 2 /******** 接收建立包成功 **********/
309 2 D12_AcknowledgeEndpoint(0); //对控制端点0进行建立包应答
310 2 D12_AcknowledgeEndpoint(1); //对控制端点1进行建立包应答
311 2 ControlData.wLength = ControlData.DeviceRequest.wLength; //取出要传输数据的总字节数
312 2
313 2 if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK)
314 2 {
315 3 //如果控制传输是控制读取
316 3 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
317 3 bEPPflags.bits.control_state = USB_TRANSMIT; //设置为发送状态
318 3 }
319 2 else
320 2 { //控制传输是控制写入
321 3 if (ControlData.DeviceRequest.wLength == 0)
322 3 {
323 4 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
324 4 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
325 4 }
326 3 else
327 3 {
328 4 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
329 4 { //数据长度出错
330 5 bEPPflags.bits.control_state = USB_IDLE; //设置为等待状态
331 5 D12_SetEndpointStatus(0, 1); //停止控制端点0
332 5 D12_SetEndpointStatus(1, 1); //停止控制端点1
333 5 }
334 4 else
335 4 bEPPflags.bits.control_state = USB_RECEIVE; //设置为接收状态
336 4 }
337 3 }
338 2 }
339 1 else if (bEPPflags.bits.control_state == USB_RECEIVE)
340 1 { //控制写入的数据阶段
341 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
342 2 ControlData.dataBuffer + ControlData.wCount);
343 2 ControlData.wCount += i;
344 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
345 2 { //数据接收完毕
346 3 bEPPflags.bits.setup_packet = 1; //通知control_handler()处理Setup包
347 3 bEPPflags.bits.control_state = USB_IDLE;
348 3 }
349 2 }
350 1 else
351 1 bEPPflags.bits.control_state = USB_IDLE;
352 1 }
353
354
355
356 void ep0_txdone(void)
357 {
358 1 INT16 i = ControlData.wLength - ControlData.wCount; //计算未发送的字节数
359 1
360 1 D12_ReadLastTransactionStatus(1); //清除中断寄存器标志位
361 1
362 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
363 1 { //非发送状态
C51 COMPILER V7.06 CHAP_9 09/15/2008 18:19:55 PAGE 7
364 2 single_transmit(0, 0);
365 2 return;
366 2 }
367 1
368 1 if( i >= EP0_PACKET_SIZE)
369 1 { //未发送字节数大于16,发送16个字节
370 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
371 2 ControlData.wCount += EP0_PACKET_SIZE;
372 2 bEPPflags.bits.control_state = USB_TRANSMIT;
373 2 }
374 1 else if( i != 0)
375 1 { //发送所有未发送的字节
376 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
377 2 ControlData.wCount += i;
378 2 bEPPflags.bits.control_state = USB_IDLE;
379 2 }
380 1 else if (i == 0)
381 1 {
382 2 D12_WriteEndpoint(1, 0, 0);
383 2 bEPPflags.bits.control_state = USB_IDLE;
384 2 }
385 1 }
386
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1001 ----
CONSTANT SIZE = 48 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 35 25
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -