搜索
bottom↓
回复: 32

用PIC18F14K50对USB功能的实现

[复制链接]

出0入0汤圆

发表于 2009-12-25 16:44:41 | 显示全部楼层 |阅读模式
有用过/正在用PIC18F14K50对USB功能的实现的吗?
  好像该IC在USB方面性价比较高,算是比较新的IC,欢迎有用过或正的用的朋友一起讨论,本人刚起步,尤其对PIC只能算是初学者(在ouravr算是借用宝地啦,因为这之前一直用mega)

出0入0汤圆

 楼主| 发表于 2010-1-22 14:55:22 | 显示全部楼层
通过这段时间的摸索,小结如下:
基础篇:
Q1:高速USB和USB 2.0有区别吗?哪一种说法是正确的?
# 高速USB和USB 2.0是有区别的,区别在于USB 2.0是一种规范,而“高速USB”仅指在USB 2.0规范中数据传输率为480Mbps的那部分,某个设备可以是符合USB 2.0的设备,同时还可以是全速设备或低速设备。
Q2:USB设备与计算机的通信速度有多快?
# USB 2.0支持低速、全速和高速三种速度,分别为1.5Mbps、12Mbps和480Mbps。
Q3: USB规范定义了哪些数据传输机制(Endpoint Transfer Type)?
四种不同的数据传输机制分别为:
# 控制传输(Control)
  USB主机使用控制传输向USB设备发送命令和询问。当枚举USB设备时,控制传输使用端点0(EP0),这样可强制所有USB设备支持EP0而无需考虑支持速度。控制包的最大容量为8、16、32或64字节。低速USB设备中控制传输的包长度必须为8字节,高速USB
设备必须为64字节,而全速USB设备允许8、16、32或64字节(MicroChip官网对此有错误的说法),也就是说控制传输对于最大包长度有固定的要求。最大包长度信息在“设备描述符”中体现,即wMaxPacketSize为“设备描述符”包的Byte7,它反应了该端点对应的Buffer的大小,当通过一个端点进行数据传输而数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输,并且要求除最后一个包外,所有的包长度均等于该最大包长度,也就是说,如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。但需要注意:Setup包总是8 Bytes的。
# 中断传输(Interrupt)
  中断传输是USB设备向USB主机请求一定轮询速率的方法。在枚举过程中,USB设备向USB主机请求轮询时间。全速设备的最大轮询速率为每毫秒一次,低速设备为每10毫秒一次。低速USB设备的最大数据负载为8字节,全速USB设备为64字节,而高速设备最大数据包为1024字节。这使得全速USB设备的最大吞吐量为64KB/s,低速USB设备为800B/s。确认中断传输可保证数据的传送。如果传输包接收失败,则会重新发送。中断传输是单向传输,但这里的单向传输并不是说只支持一个方向的传输,而是指在某个端点上该传输仅支持一个方向,或输入,或输出,如果需要在两个方向上进行某种单向传输,需要占用两个端点,可分别配置成不同的方向。
# 批量传输(Bulk)
  批量传输是设备传输大量数据的方法,但是不能保证会及时发送。在总线安排传输时,批量传输的优先级最低。当其他传输完成后,余下的带宽复位后将分配给批量传输。与中断传输一样,确认批量传输可保证数据的传送。只有全速和高速设备支持批量传输。对于全速USB设备的端点而言,最大的包容量可为8、16、32或64字节长度。对于高速USB设备的端点而言,最大的包容量可高达512字节长度。
# 同步传输(Isochronous)
  同步传输保证了传输速率。全速同步传输每帧可发送1023字节的数据。同步传输无需确认。因此,同步包有可能并未送达。同步传输的典型应用为音频/视频流,其中最重要的是以丢失包为代价保持视频和音频的进行。全速USB设备的最大传输率为1023Kbps。
Note:HID设备只支持控制传输和中断传输方式。

出0入0汤圆

 楼主| 发表于 2010-1-22 14:56:19 | 显示全部楼层
Q4: 什么是令牌包?
# USB协议定义了四种类型的包:
帧起始、令牌、数据 与 握手,而其中的令牌有三种不同的形式包。
IN   —— 通知USB设备,主机欲读取信息
OUT —— 通知USB设备,主机欲发送信息
Setup —— 通知设备,主机要进行控制传输
Q5: 什么是枚举过程?
#  USB主机通过枚举过程可了解有新的USB设备与总线相连。在应用开始前,主机向设备询问各种信息,以确定设备的类型、载入设备所需的设备驱动程序以及设备的功率需求等。在枚举过程中,USB主机还为连接的设备分配地址。在地址设定后,USB主机将与位于该地址的设备进行通信。枚举过程的最终任务之一是把设备设定为某一具体运行配置。枚举过程的详细内容在USB规范的9.1.2节中给出。
Q6:  USB主机如何识别USB设备的速度?
# USB主机在两根通信线(D+和D-)上均有弱下拉电阻。如果设备要以全速模式运行,将会用较大的上拉电阻上拉D+。如果设备要运行在低速模式下,则会上拉D-。两种情况中的上拉电阻的标称值为1 kΩ(PIC18F1xK50 Datasheet规定该电阻为1.5Kohm)。
Q7: USB主机如何对USB设备进行复位?
# 将D+和D-拉低至少10毫秒,USB主机就会对设备进行复位。当D+和D-拉低时间超过2.5微秒,USB设备就可认为已发生复位。一旦USB设备检测到了复位,在USB主机移除复位后将马上进入默认状态。该复位仅用于USB复位,不可复位控制器。
Q8: 什么是VID和PID?
# VID指的是厂商ID,PID指的是产品ID。通过支付费用,USB-IF会发出VID。USB-IF要求每个厂商拥有自己的VID,以便销售其产品。当所使用的VID/PID不是惟一时,可能会发生法律和技术上的纠纷。
Q9: USB2.0支持三种传输速率:
低速(Low Speed),习惯称为USB1.0,传输速率为1.5Mbps;
全速(Full Speed),习惯称为USB1.1,传输速率为12Mbps;
高速(High Speed),习惯称为USB2.0,传输速率为480Mbps;

Q10. USB接口有三种形式,分别为USB Type A、Type B和Mini-USB,对于AB两种类型来说,都只有四条接线,而Mini-USB却有五条连线,其外观图如下图所示:
        Type-A:                                Type-B:

Mini-USB:

出0入0汤圆

 楼主| 发表于 2010-1-22 14:56:41 | 显示全部楼层
◆USB 底层程序设计中的几个概念:
端点(Endpoint):是USB设备中的一个独特的概念,它是USB设备与USB Host交换数据的硬件单元,不同的端点其传输数据的能力不同,适用于不同的应用场合;a USB Device Endpoint uses only one data transfer method;每个设备描述符下应当有多个端点描述符。一般的USB 芯片都会提供几个标准的端点,每个端点都支持单一的总线传输方式,其中端点0必须支持控制传输。
配置(Configuration):是用于定义设备的功能,如果一个设备有几种不同的功能,则每个功能都需要一个配置,配置是接口的集合;
接口(Interface):是指定设备中哪些硬件与USB交换数据,每一个与USB交换数据的硬件就叫一个端点,因此,接口是端点的集合。

◆HID设备的特点:
        交换的数据存储在报告结构内,设备必须支持HID报告格式;
每笔事务可以携带小量或中量的数据,低速设备每笔事务最大为8Bytes,全速设备每笔最大为64Bytes(??),高速设备最大为1024Bytes;
有最大传输速度的限制:低速设备最快10ms一笔事务,最高速度为800Bytes/s,全速设备最快1ms一笔事务,最高速度为64KBytes/s;高速设备最快125us一笔事务,最高速度为24.576MByts/s。
没有传输速度的保证。
◆ 为了把一个设备识别为HID类别,设备在定义描述符的"类别"字段必须设备为0x03以表示是HID类别,这样主机就会继续请求获得设备的HID描述符和报告描述符。
◆ USB分层结构如下图所示,对应于“设备”、“配置”、“接口”与“端点”都有相应的“描述符”。

出0入0汤圆

 楼主| 发表于 2010-1-22 14:57:27 | 显示全部楼层
应用篇:
HID分为Standard HID与 Custom-Build HID,对于前者,比如说mouse/Key board都属于该类型,而Custom-Build HID则为用户自定义所用的HID,以下是对Standard HID实例Mouse类采用PIC18F14K50 MCU程序设计示例说明。
该项目需要借助MicroChip提供的USB架构(包含了USB的部分公用驱动底层程序),建立工程项目如下步骤进行:
前提:搭建IDE及MPLAB C18开发环境,笔者所采用版本为:MPLAB IDE v8.40、MPLINK           v4.34、MPLABC C18 v3.34;另外还需要下载《Microchip USB Application Libraries v2009-08-31.EXE》并安装到C:\目录下。
Step1:建立项目文件夹,如在E:\Programe\PIC 目录上建立以PICUSB_Lab2为名的文件夹;
Step2:将以下15个文件拷贝到该文件夹下:
enumeration.c、usb_descriptors.c、usb_device.c、usb_function_hid.c、Compiler.h、        GenericTypeDefs.h、HardwareProfile.h、usb.h、usb_ch9.h、usb_common.h、usb_config.h、        usb_device.h、usb_function_hid.h、usb_hal.h、usb_hal_pic18.h。
Step3:打开MPLAB IDE并建立新项目(有两种方式,在这里暂用Project -> New),在Project         Name一栏写入项目名(如:PICUSB-Lab2),在Project Directory采用"Browse"引导的方        式导引到刚才所建立的项目文件夹处,如下图所示:

然后“OK”;
Step4:在MPLAB IDE中选中"View->Project"就会出现“项目文件管理”工具,右击"Source Files-        >Add Files...",在向导框中选中刚才拷贝的那4个C 文件,此时“项目文件管理”工具如下所示:
Step5:采用Step4的方式,将刚才拷贝的11个.H文件加载到Header Files文件夹下,如下图所示:

Step6:在MPLAB IDE中"Configure->Select Device..."之后的"Select Device"对话框中选中        Device为PIC18F14K50;
Step7:编译选项(Build Options)的配置:在MPLAB IDE中"Project -> Build Options...->Project"        就会出现Build Options对话框,在Directories选项卡中选择Show directories for:的        "Output Directory",然后点击"New"以添加新的路径,选中当前工程目录,并建立以_output为名的文件夹,如下图所示(注:该步骤并非必须,这样做的目的在于将编译生成的*.hex文件放到_output文件夹下,以便管理,如果忽略该步,则编译生成的*.hex文件自动放在该工程目录下);

Step8:在上一步的基础上选中Show directories for的下拉菜单内的"Include Search Path",按        Step7的方法,将C:\MCC18\h目录、C:\Microchip Solutions\Mircochip\Include目录及该        工程目录(E:\Programe\PIC\PICUSB_Lab2)都加载进来,如下图所示;

Step9:在Step7的基础上选中Show directories for的下拉菜单内的"Library Search Path",按        Step7的方法,将C:\MCC18\lib目录加载进来,如下图所示;

Step10:在Step7的基础上选中Show directories for的下拉菜单内的"Linker Search Path",按        Step7的方法,将C:\MCC18\bin\LKR目录加载进来,如下图所示;

点击"应用"-> "确定"然后就可以编译了。
注意:上述过程中所用到的enumeration.c是针对"枚举"过程而定义的C文件,也可以认为是"应用程序文件",如果欲实现Mouse/KeyBoard等功能时,需要修改该文件,主要的应用程序开发也是在该文件上进行的。

出0入0汤圆

 楼主| 发表于 2010-1-22 14:58:14 | 显示全部楼层
采用PIC18F14K50对Custom-Build HID USB设备的开发实例
  前提:因为该类项目可以以“USB Device - HID - Custom Demos”下的“Generic HID - Firmware”为基础进行修改,因此所需要的文件有:main.c usb_descriptors.c 及HardwareProfile - Low Pin Count USB Development Kit.h HardwareProfile.h usb_config.h,以及lkr文件:rm18f14k50.lkr(注意:以下有些步骤相似于上述Standard HID示例)。
第一步:新建项目:
第二步:加载上述两个c文件与三个h文件:

第三步:修改编译选项,使Include Search Path包含:C:\MCC18\h,C:\Microchip Solutions\Microchip\Include以及该项目所在路径,如:E:\Programe\PIC\Generic HID - Firmware,如下图所示:

第三步:修改Library Search Path为C:\MCC18\lib,如下图所示:

第四步:加载C:\Microchip Solutions\Microchip\Usb下的usb_device.c和
        C:\Microchip Solutions\Microchip\Usb\HID Device Driver下的usb_function_hid.c

第五步:加载rm18f14k50.lkr文件,如下所图所示(注意:如果该文件不加载,编译可能不会出错,但功能可能不正常,比如说UART通信收到数据就不正确):

第六步:选择programme工具:

第七步:选择release版本:

第八步:编译下载即可执行,这样下载后的文件可使PC识别到PIC18F14K50,此时对应的PC机测试软件为C:\Microchip Solutions\USB Device - HID - Custom Demos\Generic HID - HID DLL - PC Software\Microsoft Visual C++ 2008 Express,运行程序如下图所示:

当点击Toggle Led(s)时,PC发送一个0x80给PIC18F14K50,可以由此设计相应的应用软件。
第九步:应用软件开发:
   在usb_descriptors.c文件中找到"产品技术符"并修改如下:
//Product string descriptor
ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd002={
sizeof(sd002),USB_DESCRIPTOR_STRING,
{
//'S','i','m','p','l','e',' ','H','I','D',' ',
//'D','e','v','i','c','e',' ','D','e','m','o'

'S','i','m','p','l','e',' ','H','I','D',' ',
'D','e','m','o',' ','B','y',' ','H','m','s'
}
};
下载到18F14K50之后,断开MCU系统电源及下载线,插入USB接头,PC机识别如下图:

在18F14K50的main.c文件中找到void ProcessIO(void)函数,在其下的if(!HIDRxHandleBusy(USBOutHandle))
{
//加载用户自己的应用程序
}
在这里可以加入用户的应用程序,比笔者在这里加入了以下代码,将18F14K50通过HID USB自PC接收到的16 bytes数据通过UART发送出去。
//***********************************
    for(i=16;i>0;i--)
      usend[i-1]=ReceivedDataBuffer[i-1];
        USART_Send(usend, 16);
//***********************************
也就是说,18F14K50通过HID USB自PC接收到数据存放在ReceivedDataBuffer[]数组中,其相应的接收函数为:
HIDRxPacket(HID_EP,(BYTE*)&ReceivedDataBuffer,64);
(接收“端点”为HID_EP,接收数据保存在ReceivedDataBuffer[],而一次接收长度为64)
而18F14K50通过HID USB向PC发送数据的函数为:
HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64);
(发送“端点”为HID_EP,发送的数据在ToSendDataBuffer[],而一次发送的长度为64)
这样,18F14K50就可以实现HID USB的方式与PC机进行信息交换。
Note:在上述实验第九步中,可以采用“USB-HID描述符工具”修改usb_descriptors.c中的
“设备描述符”-USB_DEVICE_DESCRIPTOR
“配置描述符”-configDescriptor1
“HID类描述符”-ROM struct{BYTE report[HID_RPT01_SIZE];}hid_rpt01={};
以满足自己的要求。

出0入0汤圆

 楼主| 发表于 2010-1-22 15:01:57 | 显示全部楼层
上面有些图片可能无法正常显示,以下是上述小结的PDF文档,有需要的请下载.
希望对采用PIC18F13K50 14K50开发USB系统的朋友有所帮助.

PIC18F13K50 14K50 usb系统开发入门ourdev_527255.pdf(文件大小:677K) (原文件名:HID-USB开发.pdf)

出0入0汤圆

发表于 2010-2-26 16:15:27 | 显示全部楼层
标记,

出0入0汤圆

发表于 2010-5-11 17:19:40 | 显示全部楼层
标记,好文章

出0入0汤圆

发表于 2010-5-11 22:56:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-15 23:19:28 | 显示全部楼层
可以提供附有详细注释的范例程序吗?

出0入0汤圆

发表于 2010-5-23 16:43:41 | 显示全部楼层
mark 图片 没有啊 是不是 挂了啊

出0入0汤圆

发表于 2010-5-24 07:55:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-24 10:26:17 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-7-5 13:52:38 | 显示全部楼层
To: 12288144
    图片及资料全部整理为PDF文档了,在6楼可以找到.

出0入0汤圆

发表于 2011-1-10 19:49:43 | 显示全部楼层
楼主好,向您学习。在这我有点问题,您用PIC18F14K50对USB功能的实现,具体都实现了什么功能?比如PIC18F14K50读写U盘,能存什么样的数据?我们能从电脑上读取表格吗?小弟有很多不是很懂

出0入0汤圆

发表于 2011-1-16 15:45:29 | 显示全部楼层
有没有有 汇编写的固件?

出0入0汤圆

发表于 2011-2-13 12:23:23 | 显示全部楼层
楼主用的调试器是Microchip原装的吗? 我用你的方法测试了一下,发现有如下的提示:
ICDWarn0087:  To prevent device damage, the Programming Adapter product (AC164114) is mandatory when using any Microchip Programmer with PIC18F13K50 or PIC18F14K50 parts (except the PIC18F14K50 Processor Extension Pak emulation header) and the target Vdd is above 3.6 volts.

请问这个怎么解决?

出0入0汤圆

发表于 2011-2-13 12:29:21 | 显示全部楼层
补充一下,Programmer中选择的是ICD2

出0入0汤圆

发表于 2011-2-13 12:38:31 | 显示全部楼层
这个东西我记得是有官方的USB软件包的.

出0入0汤圆

发表于 2011-2-13 18:01:27 | 显示全部楼层
官方USB包是软件、只是代码示例吧。上面的提示说为了不损坏器件,还需要一个AC164114适配器才能烧写程序,楼主也不在,不知道是不是这样,我用的是ICD2

出0入0汤圆

 楼主| 发表于 2011-3-9 15:19:52 | 显示全部楼层
3jiami,
  不好意思现在才回复!我用PIC的也不多,做这个项目时公司直接从US买了原装的ICD3,因此没有遇到你所说的问题,我也没用过ICD2,因此不敢轻易评价.其实你可以借一个ICD3试试作个对比,看看情况是否会不一样呢?

出0入0汤圆

发表于 2011-3-11 22:17:29 | 显示全部楼层
谢谢回复,后来我换了一个PICKIT3用

出0入228汤圆

发表于 2011-3-12 09:39:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-9 21:47:53 | 显示全部楼层
我也在用这个IC,学习中,很好的文章

出0入0汤圆

发表于 2012-2-7 15:23:17 | 显示全部楼层
这个好。可以好好学习下。

出0入0汤圆

发表于 2012-6-13 14:51:48 | 显示全部楼层
coolhe 发表于 2010-1-22 15:01
上面有些图片可能无法正常显示,以下是上述小结的PDF文档,有需要的请下载.
希望对采用PIC18F13K50 14K50开发 ...

现在还是下载不了啊

出0入0汤圆

发表于 2012-7-2 10:30:25 | 显示全部楼层
很不错的。赞!

出0入0汤圆

发表于 2012-11-3 20:56:49 | 显示全部楼层
那里有官方软件包呢?

出0入0汤圆

发表于 2013-3-11 15:07:06 | 显示全部楼层
学习,写的很好

出0入0汤圆

发表于 2013-6-7 11:21:40 | 显示全部楼层
很有总结性,对我有用。

出0入0汤圆

发表于 2013-10-26 12:24:06 | 显示全部楼层
学习!学习!

出0入0汤圆

发表于 2014-7-10 15:50:42 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 19:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表