USB转串口芯片

CH9344是一款USB转4串口控制芯片,提供4组全双工的异步串口UART0/1/2/3,用于为计算机扩展异步串口,或者将普通的串口设备升级到USB总线。和它类似的还有CH348,可以实现 USB 转八个异步串口 UART0/1/2/3/4/5/6/7 功能,用于为计算机扩展异步串口。

驱动安装

他们共用一个驱动CH9344SER_LINUX.ZIP

解压后目录文件如下:

当前目录,打开终端

1
2
3
4
5
6
7
8
cd driver

# 执行make 自动安装,没有命令则需要安装
sudo make

# 卸载
sudo make uninstall

安装驱动后,查看/dev下是否生成相关节点
例如:ttyCH9344USB1
ttyCH9344USB开头,这些是串口节点

还有 ch9344_iodev0
这些是用来控制的节点,配置GPIO。详细使用看下文。

demo编译

demo 目录下有ch9344_demo_gpio.c文件,这个是官方参考文件。同时在lib目录下有着不同架构平台的库文件与头文件。如下:

我用的是gcc编译,如果单独运行会找不到头文件。

可以把驱动源码中头文件“ch9344_lib.h”,拷贝到系统下/usr/include目录,或者直接把ch9344_demo_gpio.c文件移动到 lib目录进行编译。还需要把libch9344.a一起编译。

1
2
# 命令
gcc ./ch9344_demo_gpio.c ./libch9344.a -o demo

你会发现目录下已经有一个 demo的可执行文件。

demo测试与开发

1
sudo ./demo /dev/ch9344_iodev0 

查看提供的简易demo代码发现,程序仅仅支持批量设置。

按键 功能说明
e 使能所有 GPIO 组CH9344L/Q:每组只使能 bit0其他芯片:每组使能全部 8 位
d 禁用所有 GPIO 组
o 把所有 GPIO 设置为输出模式
i 把所有 GPIO 设置为输入模式
h 把所有 GPIO 输出电平设置为 高电平(1)
l 把所有 GPIO 输出电平设置为 低电平(0)
g 读取所有 GPIO 电平,并打印:gpio0: high/lowgpio1: high/low…
q 退出程序

自己根据需要可以修改。
主要库函数如下:

  • 打开 GPIO 设备
1
fd = libch9344_open(argv[1]);

功能:打开 ch9344_iodev 设备
参数:设备路径 /dev/ch9344_iodev0
返回:成功:返回文件句柄 fd(正数);失败:返回负数

  • 关闭设备
1
ret = libch9344_close(fd);

功能:关闭打开的 GPIO 设备
参数:fd = 设备句柄
返回:0 = 成功,非 0 = 失败

  • 获取芯片类型
1
libch9344_get_chiptype(fd, &chiptype);

功能:获取当前芯片型号(CH9344 / CH348 / CH9344L / CH9344Q)
参数:fd:句柄,chiptype:输出芯片类型
返回:0 = 成功,非 0 = 失败

  • 获取芯片支持的 GPIO 数量
1
gpiocount = libch9344_get_gpio_count(chiptype);

功能:获取这片芯片一共有几个 GPIO 脚
参数:chiptype 芯片类型
返回:GPIO 总数(如 8/10/12 等)

  • 获取芯片的 GPIO 分组数
1
gpiogroup = libch9344_get_gpio_group(chiptype);

功能:获取 GPIO 分为几组(CH9344 一般是 1~3 组)
参数:chiptype
返回:group 数量

  • 使能 / 禁用 GPIO 组
1
2
libch9344_gpioenable(fd, i, 0x01);
libch9344_gpioenable(fd, i, 0x00);

功能:使能或关闭某一组 GPIO
参数:
fd:句柄
i:组号
0x00:禁用
0x01 / 0xff:使能
返回:0 = 成功

  • 设置 GPIO 方向(输入 / 输出)
1
2
libch9344_gpiodirset(fd, i, 0x01);  // 输出
libch9344_gpiodirset(fd, i, 0x00); // 输入

功能:设置第 i 号 GPIO 是输入还是输出
参数:
i:GPIO 编号(0、1、2…)
0x01:输出模式
0x00:输入模式
返回:0 = 成功

  • 设置 GPIO 输出电平(高 / 低)
1
2
libch9344_gpioset(fd, i, 0x01);  // 高电平
libch9344_gpioset(fd, i, 0x00); // 低电平

功能:输出模式下设置电平
参数:
i:GPIO 号
1:高
0:低
返回:0 = 成功

  • 读取 GPIO 电平
1
libch9344_gpioget(fd, i, &gpioval);

功能:读取当前 GPIO 电平
参数:i:GPIO 号;&gpioval:输出 0 或 1
返回:0 = 成功

上位机开发需要根据场景需求进行更改。