GD32F303基于USBD库的usb custom hid 双向通讯实现

默认已经建立好需要移植的GD32F303空白工程

环境:keil  

GD库版本:V2.1.4

通讯工具:

链接:https://pan.baidu.com/s/1Ukuy0u52C9ufPGz9QcHONA 
提取码:d9rf


正文开始

USBD库植步骤:

找到GD官网的软件包

本文中用的是GD32F30x_Firmware_Library_V2.1.4

将Firmware\GD32F30x_usbd_library 文件夹全部拷贝至工程目录

然后添加C文件,参考官方customhid demo 是这样

 添加H文件路径

 需要在官方customhid demo找到这俩两个头文件,加到自己工程里

这俩文件随意放,我是放在自己的inc文件夹里,这俩文件是关于USB参数配置,硬件配置。

需要去掉#inlcude "gd32f303e_eval.h"这句

以上移植完成,编译没报错就算成功了


 接下来是修改USBD库,实现双向通讯。官方的demo是拿来做键盘用,比较固定,我们需要实现的是类似串口的随意收发。

找到custom_hid_core.c文件里这个数组,修改USB报文

改成下面这个,里面rev_len send_len是我自己定义的宏定义,这个代表单次收发长度(长度8的倍数,其他没验证成功)

const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] =
{
  /* USER CODE BEGIN 0 */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x00,                    // USAGE (Undefined)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x00,                    //   USAGE (Undefined)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, 0x08,                    //   REPORT_COUNT (64)
    0x75, rev_len,                    //   REPORT_SIZE (8)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x00,                    //   USAGE (Undefined)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x95, send_len,                    //   REPORT_COUNT (64)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)
  /* USER CODE END 0 */
  	0xC0    /*     END_COLLECTION	             */
};

然后找到usbd_conf.h 文件,将下面两个宏定义改为需要收发的长度,本文中收发长度都是8


	#define CUSTOMHID_IN_PACKET                8U
	#define CUSTOMHID_OUT_PACKET               8U   

报文和收发长度设置基本上就改好了,下面是实现收发的具体代码

1、首先在main函数中添加USBD初始化部分

    /* system clocks configuration */
    rcu_config();       //配置USB时钟

    /* GPIO configuration */
    gpio_config();       //PULL引脚配置

    //custom_hid_itfop_register(&usbd_custom_hid, &fop_handler);    //这部分是官方代码,用不着

    /* USB device configuration */
    usbd_init(&usbd_custom_hid, &custom_hid_desc, &custom_hid_class);

    /* NVIC configuration */
    nvic_config();

    /* enabled USB pull-up */
    usbd_connect(&usbd_custom_hid);

    while (USBD_CONFIGURED != usbd_custom_hid.cur_status) {
        /* wait for standard USB enumeration is finished */
    }

2、在 gd32f30x_it.c中添加USBD的中断回调函数=

void USBD_LP_CAN0_RX0_IRQHandler (void)
{
    usbd_isr();
}

 3、接收部分:在custom_hid_core.c文件里找到custom_hid_data_out函数,去掉官方的代码,改成如下rev_len为长度宏定义,rev_buf为接收缓存,这里有一个转移过程,可以改成自己的接收处理函数

static void custom_hid_data_out (usb_dev *udev, uint8_t ep_num)
{
    int i=0;
    custom_hid_handler *hid = (custom_hid_handler *)udev->class_data[CUSTOM_HID_INTERFACE];

    if (CUSTOMHID_OUT_EP == ep_num){

        usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid->data, rev_len);              
         for(i=0;i<rev_len;i++)
        {
            rev_buf[i]=hid->data[i];
        }
    }
}

4、发送部分:比较简单就不多说了

 custom_hid_report_send (&usbd_custom_hid, Send_Buffer1, 8);

最后是测试结果

接收测试:

发送测试:

 

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
GD32F303是一种基于ARM Cortex-M4核心的微控制器,它具有丰富的外设接口,包括SPI (Serial Peripheral Interface)通信接口。 SPI是一种全双工的同步串行通信协议,用于在微控制器之间或与外部设备之间传输数据。GD32F303芯片具有多个SPI接口,并且可以配置为主模式或从模式。 在主模式下,GD32F303负责控制SPI通信的时钟,并向外部设备发送数据;而在从模式下,GD32F303则被外部设备控制,并接收来自外部设备的数据。 使用SPI通信,需要以下步骤: 1. 配置SPI接口的时钟和引脚:选择合适的GPIO引脚作为SPI通信引脚,并设置时钟源和时钟分频器,以确保SPI通信的稳定性和可靠性。 2. 配置SPI接口的通信参数:设置传输模式(全双工、半双工、单向),数据位宽,时钟极性(CPOL)和时钟相位(CPHA),以及数据传输的顺序(MSB先传输或LSB先传输)。 3. 使能SPI接口:通过设置控制寄存器,使能SPI接口,并选择主从模式。 4. 传输数据:在SPI传输数据时,首先将数据写入数据寄存器,然后等待传输完成。如果SPI接口配置为主模式,GD32F303会自动向外部设备发送时钟信号,并接收来自外部设备的数据;如果SPI接口配置为从模式,GD32F303将接收来自外部设备的时钟信号,并将数据传输回主设备。 5. 关闭SPI接口:当SPI通信完成后,可以通过清除控制寄存器中的使能位,来关闭SPI接口,以节省能源。 总的来说,GD32F303芯片具有强大的SPI通信功能,可以轻松实现与外部设备的稳定和可靠的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值