554 字
3 分钟
CH340x自动下载电路调试心得
问题1 识别问题
大多串口插件比较离谱的筛选规定 只能识别ttyS..和ttyUSB..(ttyCH341USB0:那我走?) 导致默认不显示,自己去open比较麻烦 于是修改驱动,将设备名称命名为ttySCH341USBxx
问题2 自动复位电路调试记录
TIP问题的本质 CH340X的DTR#虽然有两种模式,分别是默认为低和高,但Linux驱动会自己设置默认值😂
有RST#和DTR#引脚(注意这里的#号,代表相反的意思)
默认初始状态或者close以后的状态是全0,即DTR,RST都是低电平,DTR#和RST#都是高电平
RST#倒是正好,因为单片机的复位逻辑也是RST#
但DTR#为高就比较麻烦,也就是BOOT引脚为高(和单片机BOOT逻辑正好相反,单片机在下载模式),导致单片机无法正常启动,此时手动按复位键也没有用
ps:也有的单片机BOOT逻辑是BOOT#,这个要看清楚,如果是这样的就不用修改
遂修改一下驱动(开源yyds)
static void ch341_port_shutdown(struct tty_port *port){ struct ch341 *ch341 = container_of(port, struct ch341, port); struct urb *urb; struct ch341_wb *wb; int i;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0)) usb_autopm_get_interface_no_resume(ch341->data); ch341->data->needs_remote_wakeup = 0; ch341->ctrlout = CH341_CTO_D;//add ch341_set_control(ch341, ch341->ctrlout);//add usb_autopm_put_interface(ch341->data); //******existing code //对于内核版本较小的修改也是类似的}经过测试一切正常,单片机可以正常启动
另外附一段软件复位
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/ioctl.h>#include <stdlib.h>
int main() { const char *serial_port = "/dev/ttySCH341USB0"; // 修改为你的串口设备 int fd = open(serial_port, O_RDWR | O_NOCTTY); if (fd < 0) { perror("open"); return EXIT_FAILURE; }
int status;
// 获取当前控制线状态 if (ioctl(fd, TIOCMGET, &status) == -1) { perror("TIOCMGET"); close(fd); return EXIT_FAILURE; }
// 拉高 DTR status |= TIOCM_DTR;
// 拉高 RTS(RTS# = 低电平,置0) status |= TIOCM_RTS;
if (ioctl(fd, TIOCMSET, &status) == -1) { perror("TIOCMSET (DTR low, RTS low)"); close(fd); return EXIT_FAILURE; }
printf("DTR# 已拉低,RTS# 已拉低(复位开始)\n");
// 延时100ms(可根据需要修改) usleep(100000); // 100,000微秒 = 100ms //拉低RST status &= ~TIOCM_RTS;
if (ioctl(fd, TIOCMSET, &status) == -1) { perror("TIOCMSET (RTS high)"); close(fd); return EXIT_FAILURE; }
printf("RTS# 已拉高(复位完成)\n");
// 保持状态(可根据需要修改延时或退出前清理) sleep(1);
close(fd); return EXIT_SUCCESS;}gcc set_dtr_rts_reset.c -o set_dtr_rts_reset CH340x自动下载电路调试心得
https://blog.zyfang.top/posts/toothbrush/ch340x自动下载电路调试心得/