最近在研究I.MX6U-ALPHA这块开发板,板上已有一片USB转串口芯片CH340,通过文档我才知道大学时实验室人手一块的小神器原来是沁恒这家公司生产的。考虑到后期项目需要使用串口和不同信号电压的设备进行通讯,选取一款能支持多串口信号电压的USB转串芯片则很重要。
1、USB转串口芯片选型
通过访问沁恒的官网USB - 南京沁恒微电子股份有限公司 (wch.cn)发现USB转串口类有很多芯片可供选择,还好他们提供了选型表。
通过仔细斟酌了我的需求和以后可能使用到的功能后,最终我选择了CH9102这款芯片。
初次接触,肯定从手册先进行了解。
CH9102支持波特率从50bps~4Mbps,且串口IO独立供电支持多种电源电压。自身的TNOW引脚支持RS485切换,若外加电平还可实现RS232接口,可见扩展性很不错。
通过查看技术手册可知,当我以5V电源供电时候,结合CH9102的V3引脚,则我就已经拥有了5V与3.3V的串口IO电压输出,也相当于节省了部分LDO电路,若再外加1.8V的电源到其VIO引脚上,则我的串口信号电压就可支持5V、3.3V和1.8V,满足了我对多电压下串口通信的需求。奈斯。
当然我选择CH9102这片IC还有一个原因,是发现它的封装和引脚分布与cp2102大同小异。如图左侧为CP2102的两种封装,右侧则为与之对应的同封装的CH9102,我旋转对比了一下图片,于是得到了下图,哈哈。
通过对比,可以看出其CH9102对比cp2102已经做到了引脚兼容,其中0号引脚实则为地。顺带我也和CP2104的比较了一下
既然如此,若直接更换掉cp2102是否能正常使用呢?
出于好奇,我找到很久之前手上坏掉的CP2102的小板,既然封装引脚都差不多,就直接替换了板上芯片,出乎意料发现竟然可以直接使用!
也就证明我可以使用CH9102完全替代CP2102,且无需其他电路上的修改,那以前做过的设计所使用的CP2102都可以直接更换成CH9102了。毕竟在国内市场购买CH9102真的要方便很多,最重要的性价比很奶思。
接下来还是得主要验证其在Arm-Linux板上的使用体验。
2、移植驱动到Linux板上
首先,从https://github.com/WCHSoftGroup/ch343ser_linux
获取到CH9102的驱动,然后在Ubuntu上进行交叉编译,源码里的Makefile记得修改架构以及编译链工具
修改Makefile内容,将KERNELDIR指向开发板Linux源码目录,如下所示:
KERNELDIR := /home/oidcat/develop_pro/linux/source
PWD :=$(shell pwd)
obj-m := ch343.o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
#rm -rf *.mk .tmp_versions Module.symvers *.mod.c *.o *.ko .*.cmd Module.markers modules.order
load:
insmod ch343.ko
unload:
rmmod ch343
install: default
mkdir -p /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial/
cp -f ./ch343.ko /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial/
depmod -a
uninstall:
rm -rf /lib/modules/$(shell uname -r)/kernel/drivers/usb/serial/ch343.ko
depmod -a
生成.ko文件后,将其拷贝到NFS共享目录下;
使用 insmod ch343.ko
加载驱动
通过内核信息可知驱动已加载成功,但有个地方需要注意的是,一般我们在做内核移植时,都会带有CDC类驱动,所以当我们插入设备时需要先使用 rmmod cdc_acm
卸载掉CDC类驱动,这样才能加载其他的串口VCP驱动,不然此时加载的设备节点为下图所示的ttyACM0
。
卸载掉CDC类驱动后再插入设备即可看见此时设备节点名已经为ttyCH343USB0
了。
至此,驱动加载成功,接着先简单验证一下串口通讯的功能。
因为是在Linux板上进行串口收发,所以我使用了由沁恒提供的C语言版本的串口调试助手:https://github.com/WCHSoftGroup/tty_uart
来进行收发测试,设定波特率为4Mbps,可见收发一致。至此功能验证完成🆗。
3、功能探索
在选择CH9102时,通过查阅其技术手册,是发现两种型号的CH9102都有GPIO可控制,那基于此,在使用串口功能之外,也可以通过USB做IO扩展,还可以使用GPIO模拟一些自定义时序来达成自己的功能设计。
同时还发现CH9102拥有WAKEUP引脚即唤醒功能脚,当被唤醒时则退出可低功耗模式,要知道设备也可以唤醒host,也就是说我们还可以使用该功能唤醒待机状态下的主机。通过以上功能的结合,就可以在设计物联网智能产品时,对其进行巧妙使用达到一些有意义的目的。
本次初体验也让我感慨,小小的USB转串口芯片里面大有乾坤,也让我对以后的项目设计有了一些新鲜的想法,期待在这段时间的使用中,可以挖掘出一些实际的应用。