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; //命令码0x06
if (CH341StreamSPI4(index, chip_select, 1, buffer) == FALSE) return(FALSE);
return(TRUE);
}
- 先发送数据,再读数据
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、编写代码
设备的示例代码基础上,开发自己需要的功能,例如:
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上运行
解决办法: