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

解决办法:

相关推荐
海清河晏1112 天前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio
蜕变的土豆4 天前
Visual Studio编译器调试信息格式详解:PDB文件的重要性与发布环境配置指南
visual studio
不负信仰4 天前
Visual Studio 三月更新 —— 打造专属自定义 Agent
ide·visual studio
祸心依旧4 天前
Visual Studio 五月更新 —— 计划、评审、优化
运维·人工智能·visual studio
慕容引刀4 天前
告别Commit信息纠结:使用Git AI Commit插件实现规范化提交
人工智能·git·github·visual studio code·visual studio
蜕变的土豆5 天前
Visual Studio Release模式下如何调试
visual studio
唠叨的蜜粉5 天前
无需离开 Visual Studio 即可审阅拉取请求
ide·visual studio
纸小铭5 天前
Azure MCP 工具现已内置集成至 Visual Studio 2022,无需额外安装扩展
microsoft·azure·visual studio
海清河晏1117 天前
数据结构 | 二叉搜索树
数据结构·c++·visual studio