一、任务要求
使用本板卡实现一个滑动控制器,用手指左右滑动时,电脑的音量、亮度或视频进度条等可以变化。
二、bsp移植
提前说一下移植注意事项,后续会详细说明
移植注意事项:
不要在bsp里面初始化debug串口和capsense-tuner的i2c
在基于已有bsp修改时不要增加/删除原有bsp的依赖库
修改bsp时如果下边有提示一定不要忽略,想办法解决
移植流程:
首先使用如下bsp创建我们的bsp。
修改主控芯片为CY8C624ALQI-S2D42。
打开DeviceConfigurator。
其中与dap连接的i2c和串口所属的scb2和scb6不需要使能,例程中有初始化代码,如果我们在这里使能,bsp会生成初始化代码,例程中的再次初始化会被pdl库检测到,陷入死循环。
打开CAPSENSE Configuraor,删除两个button。
capsense中的capsense sensors按照原理图中选择,cmod引脚在p71、p72、p77中任选其一(芯片只能选这三个引脚),原理图上三个引脚皆是一个电容对地,因此可以随便选择。注意:CMOD引脚并不是原理图中的MCU_CSS_TX。
i2c,led,debug_uart引脚别名我们按照这样修改,这几个引脚也不要勾选,出现命名冲突将原有的删掉即可。
system这里我们要将wco关掉(硬件没有wco),同时也要将debug的swo关掉(引脚与i2c冲突)。
这个提示是因为原有bsp所用芯片在我们新建的bsp上没有,我们直接删除,其他提示比如时钟不符合要求我们就要修改对应外设以满足要求,不然编译时仍会报此错误。
三、例程
基于我们新建的bsp创建示例工程,需要CAPSENSE_Buttons_and_Slider和emUSB-Device_HID_Generic两个例程
1、CAPSENSE_Buttons_and_Slider
1) 编译
因为没有板子没有触摸按键,因此删除button相关代码;
原有bsp只有一个CYBSP_USER_LED,我们需要将代码里的CYBSP_USER_LED修改为CYBSP_USER_LED1或者CYBSP_USER_LED2。
基本就能编译通过了,如果有报错,如果是recipe-make not found(如果不像我手贱把bsp里的recipe-make库删掉是不会有这个问题的),选中当前工程,打开左下角tools里的Library Manager检查里面是否有recipe-make这个库没有的话添加上保存,然后在下方Terminal串口选中当前工程的页面,执行
make getlibs
其他报错仔细分析报错信息,问题不大。
2) 运行
该例程执行现象为手滑动滑条,led的亮度会根据手的位置变化
3) 调试
如果没有反应,我们可以使用调试功能进行单步调试,我遇到的几个问题:
retarget_io失败:使用单步一步一步往里找,最后找到CYHAL_UART_RSLT_ERR_INVALID_PIN这个错误,参考CYHAL_UART_RSLT_ERR_INVALID_PIN error ,也就是因为bsp初始化占用了这个pin,和例程初始化冲突了。
capsense-tunner初始化失败也是同样的原因。
capsense初始化失败:单步执行找到CY_CAPSENSE_STATUS_BAD_PARAM这个错误,网上搜索找到Psoc 6 - Capsense CMOD pin assignement ,原因在于我误将原理图中的MCU_CSS_TX当作capsense-cmod引脚
2、emUSB-Device_HID_Generic
该例程唯一问题在于要在bsp里面初始化usb外设,并配置好时钟。
只要电脑成功识别该usb设备,就可以认为例程成功跑起来了。需要测试该例程需要相关调试软件,不过这个例程只是把收到数据发送回去,没太大必要。
四、最终实现
基于emUSB-Device_HID_Generic创建新的工程,打开Library Manager添加capsense库,并将capsense例程中的相关函数复制过来
1、HID设备报告描述符
首先在f411上移植CherryUSB,并跑通hid键盘例程,以为修改下hid上报内容就可以了,网上搜了半天搜出来的关键词都离不开【hid report descriptor】。
简单的来说就是hid类设备包含太多类型,键盘、鼠标、游戏摇杆等都属于hid设备,而每种hid设备的报文结构又不相同,因此需要hid报文描述符描述设备类型以及报文的数据结构。
在网上搜索后找到如下hid报文描述符:
static const U8 usb_hid_generic_report[] = {
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x09, 0xEA, // Usage (Volume Decrement)
0x09, 0xE9, // Usage (Volume Increment)
0x75, 0x01, // Report Size (1)
0x95, 0x02, // Report Count (2)
0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position)
0x75, 0x06, // Report Size (6)
0x95, 0x01, // Report Count (1)
0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
0xC0, // End Collection
// 27 bytes
};
上边的描述符表示有音量减和音量加两个按键,各占一个bit,另外再加6个占位bit,当我们需要按键时,将对应bit置为1发送,需要取消按键时,对应bit置0发送,比如我们要按一下音量减,则我们需要发送一次0x01再发送一次0x00。
在f411上验证成功后,仅需要替换例程中的hid报告描述符。
相关链接:
HID报告描述符教程 手把手教你编写HID报告描述符 - USB中文网 (usbzh.com)
HID音量控制报告描述符 - USB中文网 (usbzh.com)
2、处理逻辑
五、优化方向
hid设备无法获取系统音量,需要想办法获取系统音量才能实现绝对音量控制。
capsense读取数据以及usb发送数据均会造成mcu死等循环,因此可以添加多线程,将capsense和usb放到两个线程处理。