Visual studio 2019 编程控制CH341A芯片的USB设备

1、硬件

买了个USB可转IIC、或SPI、或UART的设备,主芯片是CH341A

主要说明USB转SPI的应用,绿色跳线帽选择IIC&SPI,用到CS0、SCK、MOSI、MISO这4个引脚

2、软件

2.1、下载CH341A的驱动

点CH341A官网https://www.wch.cn/downloads/CH341PAR_ZIP.html,下载64位DLL库和驱动。

解压下载的文件得到CH341DLL.H、CH341DLL.LIB。

设备连接到电脑后,双击SETUP.exe安装驱动

2.2、 新建visual studio项目

参照链接:https://blog.csdn.net/qq_34414144/article/details/126598125?spm=1001.2014.3001.5502

新建项目和导入外部库

把 2.1节得到的.h和lib文件放到Project目录下

2.3、接口介绍

CH341DLLA64.h里的接口定义,有详细注释,主要用到以下接口

函数 功能
CH341OpenDevice 打开CH341A设备
CH341SetStream 设置串口流模式
CH341StreamSPI4 处理SPI数据流

CH341StreamSPI4 的2种用法,以操作flash为例:

  • 只发送数据
cpp 复制代码
unsigned char write_enable(unsigned char* buffer)
{
	*((unsigned char*)buffer + 0) = WREN;  //命令码0x06
	if (CH341StreamSPI4(index, chip_select, 1, buffer) == FALSE) return(FALSE);
	return(TRUE);

}
  • 先发送数据,再读数据
cpp 复制代码
unsigned char read_status_register(unsigned char* buffer)
{
	*((unsigned char*)buffer + 0) = RDSR;  //命令码0X05
	if (CH341StreamSPI4(index, chip_select, 1 + 2, buffer) == FALSE) return(FALSE);
	
	// 因为CH341的SPI是数据流,所以实际返回数据应该去掉自己发出的1个字节(命令和地址)
	memmove(buffer, (unsigned char*)buffer + 1, 2);  
	return(TRUE);
}

2.4、编写代码

设备的示例代码基础上,开发自己需要的功能,例如:

cpp 复制代码
ULONG index = 0; //设备号
ULONG chip_select = 0x80; //启动片选
unsigned char buffer_write[4096]; //全局缓冲区

void Select()
{
	char     inputr;   // 输入一个选择号
	unsigned char    a;
	unsigned char* temp1 = &a;
	printf("\n");
	printf("          *******请输入测试的选项*******\n");
	printf("0.退出程序\n");
	printf("1.测试1\n");
	printf("2.测试2\n");
	printf("请输入测试的选项:");
	do {
		inputr = getchar();
		switch (inputr)
		{
		case '0':
			printf("*** CH341CloseDevice \n");
			CH341CloseDevice(0);
			printf("\nExit.\n");
			exit(0);    //退出
		case '1':
			printf("*** test1 \n");
			test1();
			break;
		case '2':
			printf("*** test2 \n");
			test2();
			break;
		
		default:
			break;
		}
	} while (1);
}

//程序入口
void main()
{
	HANDLE hOut;
	WORD attText = FOREGROUND_GREEN | FOREGROUND_INTENSITY; // 文本属性
	hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
	SetConsoleOutputCP(936); // 设置代码页
	SetConsoleTextAttribute(hOut, attText); // 设置命令行窗口属性
	printf("\nCH341 OPERATION SPI FLASH EN25T80 TEST PROGRAM V1.0\n");
	printf("Copyright (C) TECH32 2009.3\n");
	printf("*** Load DLL: CH341DLLA64.DLL \n");
	if (LoadLibrary("CH341DLLA64.DLL") == NULL) return;  // 加载DLL失败,可能未安装到系统中
	printf("*** CH341OpenDevice: 0# \n");
	if (CH341OpenDevice(0) == INVALID_HANDLE_VALUE) return;  // 使用之前必须打开设备
	if (CH341SetStream(0, 0x81) == 0) return; //高位先发
	Select(); //测试选择
	CloseHandle(hOut); // 关闭标准输出设备句柄
}

2.5、程序运行结果

3、问题解决

3.1、调试窗口打不开

原因:没有安装64位的驱动,请按2.1节步骤安装

3.2、程序未正常运行

原因:可能是程序填写的lib名不对,或lib缺失

3.3、Windows10上正常工作的工具,无法在Windows7上运行

解决办法:

相关推荐
我不是懒洋洋7 天前
【C++】string(string的成员变量、auto和范围for、string常用接口的说明、OJ题目、string的模拟实现)
c语言·开发语言·c++·visual studio
C++ 老炮儿的技术栈8 天前
Ubuntu root账号自动登陆
linux·运维·服务器·c语言·c++·ubuntu·visual studio
A.零点8 天前
【2个月 C 语言从入门到精通:零基础系统教程】第十二讲:深入了解指针(五)
c语言·开发语言·网络·笔记·visual studio
彷徨而立8 天前
【VS2026】介绍 Visual Studio 几个重要配置项
visual studio
AndyHuang19768 天前
【避坑指南】Visual Studio 插件报错 “Windows Terminal (wt.exe) was not found in PATH“ 完美解决
ide·windows·visual studio
彷徨而立8 天前
【Visual Studio】msbuild 使用举例
ide·visual studio
blueman88889 天前
VS2022 切换定义(F12 / Go to Definition)反应慢
c++·visual studio
周杰伦fans9 天前
记一次 Visual Studio 突然报错“未能加载 Microsoft.Internal.VisualStudio.Interop”的奇葩经历
microsoft·log4j·visual studio
x1387028595710 天前
c语言中srtlen(指针使用计算字符长度)、传值和传址调用
c语言·开发语言·算法·visual studio
robot_???11 天前
Visual studio2022:找不到指定的SDK“Microsoft.NET.Sdk”
microsoft·.net·visual studio