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

2024-05-01 09:20

本文主要是介绍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为例:

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

2.4、编写代码

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

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

在这里插入图片描述

解决办法:

在这里插入图片描述

这篇关于Visual studio 2019 编程控制CH341A芯片的USB设备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/951311

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us