lpc2378_lpc2378厂家_lpc1788(3)

电脑杂谈  发布时间:2017-03-10 16:12:59  来源:网络整理

}

有人可能奇怪,为什么没有端口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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 堀秀行
      堀秀行

      马云个数学都考不及格的主儿随便说几句话那么就当回事来听

    • 徐安国
      徐安国

      你妈

    • 任泉
      任泉

      最好看

    热点图片
    拼命载入中...