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

在这里插入图片描述

解决办法:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660714.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript百炼成仙自学笔记——1

我要成神,成为前后端都会的神 《JavaScript百炼成仙》是清华大学出版社出版的一部图书,作者是杨逸飞JavaScript百炼成仙_百度百科《JavaScript百炼成仙》是清华大学出版社出版的一部图书,作者是杨逸飞。https://baike.baidu.com/item/JavaSc…

Flink checkpoint 源码分析- Checkpoint barrier 传递源码分析

背景 在上一篇的博客里,大致介绍了flink checkpoint中的触发的大体流程,现在介绍一下触发之后下游的算子是如何做snapshot。 上一篇的文章: Flink checkpoint 源码分析- Flink Checkpoint 触发流程分析-CSDN博客 代码分析 1. 在SubtaskCheckpointCoo…

笔记-word导出PDF老是更新域导致图片和表格题注发生变化

问题描述:微软word 导出PDF时,老是更新域,导致图片和表格题注否跟着变化 以下是解决方法的具体描述。 目录 一、准备工作二、操作步骤 一、准备工作 1、工具版本:微软 word 2016(其他微软word版本也OK) …

WebP格式:图片压缩的新标准

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

蓝桥杯如何准备国赛?

目录 一、赛前准备 1、如何刷题,刷哪些题? 2、记录(主要看个人习惯) CSDN博客 写注释 3、暴力骗分 4、从出题人的角度出发,应该如何骗分 二、赛中注意事项 一、赛前准备 1、如何刷题,刷哪些题&…

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy(策略)定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…

【论文阅读】ChipNeMo中的数据集处理

前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》,然后又继续仔细看了论文中的领域适配分词和领域数据微调的预训练检索模型,对于数据集的处理,也需要仔细看一下。 提炼重点:1)对于数据集&#xff0…

ROS1快速入门学习笔记 - 11参数的使用与编程方法

目录 一、参数模型(全局字典) 二、使用方法 1. 创建功能包 2. 参数命令行的使用 3. 通过C实现参数设置 4. 在CMakeLists中进行编译 5. 运行程序 6. 编程方法(Python) 一、参数模型(全局字典) 每个节…

[学习笔记]CyberDog小米机器狗 开发学习

1、机器狗本身是UbuntuROS2系统 2、控制机器人只需要了解lcm和Ros topic通讯 3、传感器数据(包括一些imu(/imu)、激光雷达(/scan))会进行topic的一个广播。 仿真环境通信接口: -命令输入(见后续运控说明) 运控lcm数据接口 Motion man…

在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文将说明如何在离线环境中将 CentOS 7.5 升级并迁移至 RHEL 7.9。为了简化准备过程,本文前面将在在线环境中安装用到的各种所需验证软件,而在后面升级迁移的时候再切换到由 ISO 构成的离线 Yum Repo…

【STM32】F405/407的模块总览图,记录查看

从STM32F405/407数据手册中提取,方便以后查看。主要是什么外设连接在什么总线上,时钟频率是多少。 TIM2、3、4、5、12、13、14在APB1上,最大频率84M TIM1、8、9、10、11在APB2上,最大频率168M

Android(Java)项目支持Kotlin语言开发

Android(Java)项目通过相关Kotlin设置后,允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境: Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项: 第一步:在项…