范例直接下载:https://download.csdn.net/download/u010875635/10689882
在设备通信中,UART非常常见,也是最简单的,但是,PC尤其是笔记本基本都舍弃了传统的UART端口,只能使用usb转UART的IC来做信号转换,这样效率低,而且还要针对IC安装专门的驱动,非常不方便,而在有些特殊设备上,甚至驱动无法安装,是否可以不安装驱动与PC通信呢?
当然可以!
在USB盛行的今天,USB通信变得极其简单,而在USB中有一个重要的通信标准,就是HID(Human Interface Device),常见的鼠标键盘就是采用HID通信。由于它的标准性,几乎所有PC系统(Windows、Linux、OSX)都集成了它的驱动,所以,可以将它看做一个免驱的设备,类似的还有USB大容量存储。下面我们就用PIC32MZ2048EFH芯片实现USB HID的接口(PIC32MZ EF Start Kit开发板),与PC进行通信,PC端采用C#以及C++分别在windows和linux下实现hid读写,本篇不做描述,详细参考我的其它博客,关于两个平台的hid程序。
接口使用的是micro usb(j4接口)。
1、配置时钟(略)
2、配置USB Library,以及device configuration,下面两图中红色部分要修改,其它默认。
(若是要LED显示,或者显示到LCD,请自行配置,需要注意的是,USB或使用的默认第一个Dynamic Timer,若是有其它功能使用到Dynamic Timer,请多设置一个Timer,并将第一个(instance0)预留不用,否则其它功能无法正常使用)
3、生成code,并添加自己的code。
添加usb-hid.c与usb-hid.h。
需要执行usb初始化和while循环的task任务,接收可以修改为回调函数,放到usb-hid接收函数中,发送直接调用发送函数即可,注意包大小要与客户端发送的大小一致,可以考虑在包内加标识判断数据大小。
usb-hid.h
#ifndef _USB_HID_H
#define _USB_HID_H
#define hidMaxBufferSize 64
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include "system_config.h"
#include "system_definitions.h"
typedef enum
{
USB_HID_STATE_INIT,
/* Application is waiting for configuration */
USB_HID_STATE_WAIT_FOR_CONFIGURATION,
/* Application is running the main tasks */
USB_HID_STATE_MAIN_TASK,
/* Application is in an error state */
USB_HID_STATE_ERROR
}USB_HID_STATE;
typedef struct
{
/* The application's current state */
USB_HID_STATE state;
/* Device layer handle returned by device layer open function */
USB_DEVICE_HANDLE usbDevHandle;
/* Recieve data buffer */
uint8_t * receiveDataBuffer;
/* Device configured */
bool deviceConfigured;
/* Send report transfer handle*/
USB_DEVICE_HID_TRANSFER_HANDLE txTransferHandle;
/* Receive report transfer handle */
USB_DEVICE_HID_TRANSFER_HANDLE rxTransferHandle;
/* Configuration value selected by the host*/
uint8_t configurationValue;
/* HID data received flag*/
bool hidDataReceived;
/* HID data transmitted flag */
bool hidDataTransmitted;