如何正确使用ch9328型号的产品?
CH9328是一款串口转HID芯片,在电脑上识别为标准的USB HID类键盘设备,它主要用于单向数据传输,可以接收串口发送过来的数据(如ASCII码),并按照HID类键盘设备规范,将数据打包成标准的键盘码值通过USB口上传给计算机,通过提供的上位机软件,用户也可自行配置芯片的VID、PID,以及各种字符串描述符,以下是详细的使用方法:
一、引脚介绍
CH9328的部分引脚说明如下:
IO1:用于配置芯片的上传速度,上电时该引脚为高电平则速度配置为普通模式,上电时该引脚为低电平则速度配置为高速模式。
IO2、IO3、IO4:用于设置工作模式,具体组合方式见下表。
二、工作模式
CH9328支持多种工作模式,不同的工作模式下功能有所不同:
工作模式 | IO2电平 | IO3电平 | IO4电平 | 功能说明 |
模式0 | 1 | 1 | 1 | 仅支持将可见ASCII码(如az、09、@、#、$等)对应的字符转成标准的USB键值,特殊功能:接收到的串口数据包如果遇到0x1B时,则丢弃当前包中0x1B之后的数据,并将0x1B转换成回车键。 |
模式1 | 1 | 0 | 1 | 仅支持将可见ASCII码(如az、09、@、#、$等)对应的字符转成标准的USB键值。 |
模式2 | 1 | 1 | 0 | 仅支持将可见ASCII码(如az、09、@、#、$等)对应的字符转成标准的USB键值,特殊功能:接收到的串口数据包如果遇到0x28时,将0x28转换成回车键。 |
模式3 | 0 | 1 | 1 | 透传模式,不仅仅用于传输可见ASCII码字符,该模式下可以实现标准的USB全键盘功能,串口数据每8个字节组成一包,芯片每接收到8个字节后,直接打包通过USB口上传,即芯片为透传模式,不分析转换串口数据,直接按8个字节一包上传,故串口数据必须按照标准的USB键盘数据包进行发送。 |
三、电路连接
CH9328的典型电路连接原理图包括与单片机的连接、与电脑的USB连接以及电源和晶振的连接,具体的电路连接可以参考数据手册中的电路原理图。
四、数据格式
在模式3(透传模式)下,一次向CH9328发送8个字节的数据,数据格式为:
[ byte1 ] [ byte2 ] [ byte3 ] [ byte4 ] [ byte5 ] [ byte6 ] [ byte7 ] [ byte8 ]
其中第一个字节(byte1)用来标识特殊按键,其余字节为普通按键的键值。
五、驱动程序
在使用CH9328之前,需要定义一个缓存空间来存储要发送的键码值。
uint8_t key_code[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
根据需要创建键码数组,定义键盘上每个按键对应的键码。
六、使用示例
以下是一个简单的使用示例,演示如何使用CH9328实现开机自动输入密码的功能:
#include "reg52.h" sbit k1 = P2^5; sbit k2 = P2^6; sbit k3 = P2^7; void sendbyte(unsigned char b) // 串口发送字符 { SBUF = b; while (!TI); TI = 0; } void init() // 初始化函数 { SCON = 0x50; // 设置为工作方式1 TMOD = 0x20; // 设置计数器工作方式2 PCON = 0x80; // 波特率加倍 TH1 = 0xFA; // 计数器初始值设置,波特率9600 TL1 = TH1; TR1 = 1; // 打开计数器 } void main() // 主函数 { unsigned char key[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; Timer0Init(); // 初始化定时器 init(); // 初始化串口 delay(1500); // 延时以等待系统稳定 // 以下是开机自动输入密码的程序,一直到第二个enter结束 key[2] = 0x00; key[2] = 0x28; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // enter键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); key[2] = 0x00; key[2] = 0x1A; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // w键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); key[2] = 0x00; key[2] = 0x04; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // a键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); key[2] = 0x00; key[2] = 0x11; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // n键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); key[2] = 0x00; key[2] = 0x0A; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // g键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); key[2] = 0x00; key[2] = 0x28; for (int i = 0; i < 8; i++) sendbyte(key[i]); delay(100); // enter键按下 key[2] = 0x00; // 按键松开后 for (int i = 0; i < 8; i++) sendbyte(key[i]); P2 = 0xFF; // 恢复P2端口状态 while (1) { delay(20); // 按键消抖处理 if (k1 == 0) { delay(20); key[8] = 0x00; delay(1); ... } } }
这个示例程序实现了开机自动输入密码“wang”的功能,每隔一段时间自动按下ctrl+s(即保存),并且具有和电脑键盘的ctrl c v一样的功能,可组合使用。
七、常见问题解答(FAQs)
问题1:CH9328在PC端识别不稳定是什么原因?如何解决?
答:CH9328在PC端识别不稳定可能由多种原因造成,包括但不限于以下几点:
供电问题:确保CH9328的供电稳定且符合规格要求,可以尝试更换电源或检查电源线是否接触良好。
驱动问题:确保已经安装了正确的驱动程序,并且驱动程序是最新版本,可以尝试重新安装驱动程序或从官方网站下载最新驱动。
硬件兼容性问题:某些电脑可能与CH9328存在兼容性问题,可以尝试更换电脑或使用其他USB接口测试。
电路设计问题:检查电路设计是否正确,特别是晶振的选择和布线是否合理,建议参考官方提供的电路原理图进行设计。
解决方法:针对上述可能的原因逐一排查并解决,如果问题依然存在,建议联系技术支持或查阅更详细的技术文档。
问题2:如何修改CH9328的默认波特率?
答:CH9328的默认波特率可以通过上位机软件进行配置,具体步骤如下:
确保已经安装了CH9328的上位机软件。
打开上位机软件并连接到CH9328设备。
在软件界面中找到波特率设置选项。
根据需要选择合适的波特率并进行保存。
修改波特率后需要重新连接设备才能生效,确保单片机端的串口通信波特率与CH9328的设置一致。
作者:豆面本文地址:https://www.jerry.net.cn/articals/3203.html发布于 2024-12-21 05:26:40
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司