}
有人可能奇怪,为什么没有端口0和端口2的IN处理,呵呵,这是USB传输的关键所在,如果希望从上位机读取设备的数据,
程序设计者必须自定义帧格式或帧协议,比如自定义一个帧,它的第一个字节为命令字节,如果该字节为0x11,则表示上位机是请求接收数据,如果是其他,则表示上位机是其他操作。
上位机发送OUT帧(writeFile)—>USB发生端口OUT中断->固件程序检测OUT包的第1个字节是否为0x11,如果是,则将RAM缓冲区的数据写到USB硬件缓冲区,然后发送->上位机再执行一个ReadFile函数,就把在PC缓冲区的数据读出来了。
(5)usbuser.c
这个文件定义了很多端口处理函数。里面有个很酷的写法:
#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)
/* USB Endpoint Events Callback Pointers */
void (* const USB_P_EP[16]) (U32 event) = {
P_EP(0),
P_EP(1),
P_EP(2),
P_EP(3),
P_EP(4),
P_EP(5),
P_EP(6),
P_EP(7),
P_EP(8),
P_EP(9),
P_EP(10),
P_EP(11),
P_EP(12),
P_EP(13),
P_EP(14),
P_EP(15),
};
##符号会连接两个符号,从而产生新的符号(词法层次)。
就是说,你调用USB_P_EP[2] ,就是调用函数USB_EndPoint2,而且还可以带参数。
USB_P_EP是一个只读型指针数组,其每个元素都是一个指向函数的指针。
由于我只用到端口2,将USB_EndPoint2 函数改写如下
void USB_EndPoint2 (U32 event) {
USB_BulkOut();
}
(6)
usb_trans.h中
#define EP_BULK_IN 0x82
#define EP_BULK_OUT 0x02
usb_trans.c中
void USB_BulkOut(void)
{
U8 BulkLen;
BulkLen = USB_ReadEP(EP_BULK_OUT, usbWBuffer);//读端口2的OUT端点数据
if(usbWBuffer[0]==0x11)//如果是收到上位机读请求,则将数据放到端口2的IN端点,并发送
{ USB_WriteEP(EP_BULK_IN, usbRBuffer, 64);}
}
(7)
main函数中,只要编写以下代码,固件就编写完了。
USB_Init();
USB_Connect(__TRUE); /* USB Connect */
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-36858-3.html
你妈
最好看
马云个数学都考不及格的主儿随便说几句话那么就当回事来听