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上运行

解决办法:

相关推荐
进击的阿尔法猿8 小时前
visual studio生成动态库DLL
ide·visual studio
Qian丶Xi10 小时前
Visual Studio旧版直链
ide·visual studio
珊瑚里的鱼1 天前
第九讲 | 模板进阶
开发语言·c++·笔记·visualstudio·学习方法·visual studio
慢一点会很快2 天前
【FFmpeg】介绍+安装+VisualStudio配置FFMpeg库
ide·ffmpeg·visual studio
程序猿多布2 天前
使用Visual Studio将C#程序发布为.exe文件
c#·visual studio
半青年3 天前
华为鸿蒙电脑能否作为开发机?开发非鸿蒙应用?
ide·华为·编辑器·电脑·idea·harmonyos·visual studio
battlestar3 天前
Visual studio 打包方法
ide·visual studio
算法歌者4 天前
Visual Studio 项目 .gitignore 文件指南
git·visual studio
伐尘4 天前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio
jiunian_cn4 天前
【c++】异常详解
java·开发语言·数据结构·c++·算法·visual studio