CH341的SPI接口编程说明

楠兄楠弟* 2024-02-27 18:03:15

CH341的SPI接口特性:(CH347为CH341的升级版,支持最高60MHz的SPI通讯,支持SPI模式1/2/3等)

1、提供3个片选信号,SCS0~SCS2;

2、SPI 默认工作模式0,不支持修改;

3、SPI Clock速率固定,小于2MHz;

4、支持MSB/LSB传输;
引脚序号功能说明1517SCS0SCS218SCK20MOSI22MISO

https://img-blog.csdnimg.cn/450cf69d43314392973314610cc047d5.png

 Windows系统SPI通讯接口函数

HANDLE    WINAPI    CH341OpenDevice(  // 打开CH341设备,返回句柄,出错则无效
    ULONG            iIndex );  // 指定CH341设备序号,0对应第一个设备


VOID    WINAPI    CH341CloseDevice(  // 关闭CH341设备
    ULONG            iIndex );  // 指定CH341设备序号

BOOL    WINAPI    CH341SetStream(  // 设置串口流模式
    ULONG            iIndex,  // 指定CH341设备序号
    ULONG            iMode );  // 指定模式,见下行
//1-位0: I2C接口速度/SCL频率, 00=低速/20KHz,01=标准/100KHz(默认值),10=快速/400KHz,11=高速/750KHz
//2:     SPI的I/O数/IO引脚, 0=单入单出(D3时钟/D5出/D7入)(默认值),1=双入双出(D3时钟/D5出D4出/D7入D6入)
//7:     SPI字节中的位顺序, 0=低位在前, 1=高位在前
// 其它保留,必须为0

BOOL    WINAPI    CH341StreamSPI4(  // 处理SPI数据流,4线接口,时钟线为DCK/D3引脚,输出数据线为DOUT/D5引脚,输入数据线为DIN/D7引脚,片选线为D0/D1/D2,速度约68K字节
/* SPI时序: DCK/D3引脚为时钟输出, 默认为低电平, DOUT/D5引脚在时钟上升沿之前的低电平期间输出, DIN/D7引脚在时钟下降沿之前的高电平期间输入 */
    ULONG            iIndex,  // 指定CH341设备序号
    ULONG            iChipSelect,  // 片选控制, 位70则忽略片选控制, 位71则参数有效: 位1000/01/10分别选择D0/D1/D2引脚作为低电平有效片选
    ULONG            iLength,  // 准备传输的数据字节数
    PVOID            ioBuffer );  // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据

BOOL    WINAPI    CH341StreamSPI5(  // 处理SPI数据流,5线接口,时钟线为DCK/D3引脚,输出数据线为DOUT/D5和DOUT2/D4引脚,输入数据线为DIN/D7和DIN2/D6引脚,片选线为D0/D1/D2,速度约30K字节*2
/* SPI时序: DCK/D3引脚为时钟输出, 默认为低电平, DOUT/D5和DOUT2/D4引脚在时钟上升沿之前的低电平期间输出, DIN/D7和DIN2/D6引脚在时钟下降沿之前的高电平期间输入 */
    ULONG            iIndex,  // 指定CH341设备序号
    ULONG            iChipSelect,  // 片选控制, 位70则忽略片选控制, 位71则参数有效: 位1000/01/10分别选择D0/D1/D2引脚作为低电平有效片选
    ULONG            iLength,  // 准备传输的数据字节数
    PVOID            ioBuffer,  // 指向一个缓冲区,放置准备从DOUT写出的数据,返回后是从DIN读入的数据
    PVOID            ioBuffer2 );  // 指向第二个缓冲区,放置准备从DOUT2写出的数据,返回后是从DIN2读入的数据

BOOL    WINAPI    CH341BitStreamSPI(  // 处理SPI位数据流,4线/5线接口,时钟线为DCK/D3引脚,输出数据线为DOUT/DOUT2引脚,输入数据线为DIN/DIN2引脚,片选线为D0/D1/D2,速度约8K位*2
    ULONG            iIndex,  // 指定CH341设备序号
    ULONG            iLength,  // 准备传输的数据位数,一次最多896,建议不超过256
    PVOID            ioBuffer );  // 指向一个缓冲区,放置准备从DOUT/DOUT2/D2-D0写出的数据,返回后是从DIN/DIN2读入的数据
/* SPI时序: DCK/D3引脚为时钟输出, 默认为低电平, DOUT/D5和DOUT2/D4引脚在时钟上升沿之前的低电平期间输出, DIN/D7和DIN2/D6引脚在时钟下降沿之前的高电平期间输入 */
/* ioBuffer中的一个字节共8位分别对应D7-D0引脚, 位5输出到DOUT, 位4输出到DOUT2, 位2-位0输出到D2-D0, 位7从DIN输入, 位6从DIN2输入, 位3数据忽略 */
/* 在调用该API之前,应该先调用CH341Set_D5_D0设置CH341的D5-D0引脚的I/O方向,并设置引脚的默认电平 */

进行常规的4线SPI 8位数据传输,直接使用 CH341StreamSPI4 接口函数即可。操作流程为:

https://img-blog.csdnimg.cn/d991528ed4bb4b369b4e0ea9341e9286.png

CH341StreamSPI4 函数说明

iLength:需要xfer传输的字节长度

ioBuffer:需要xfer传输的缓冲区,由于SPI是exchange交换传输,因此该缓冲区内容会先经过MOSI信号线对外输出,然后该API成功返回后,其内容是从MISO信号线上采集的数据。

示例:

UCHAR ioBuffer[2] = {0x11, 0x22};

CH341StreamSPI4(0, 0x80, 2, ioBuffer);

对应CH341PAR软件操作:

https://img-blog.csdnimg.cn/9f40e066a5ed415cb5e95e044b028d16.png

 此时,MOSI输出2个字节数据 0x11 和 0x22,然后返回 MISO数据。

图1:MISO悬空(高电平)

https://img-blog.csdnimg.cn/6506b5f52e3a4ca9a0dbf69a8febeaff.png

图2:MISO接GND(低电平)

https://img-blog.csdnimg.cn/de460ecef26c44688f5f8abda6b4168f.png


如上为CH341的SPI功能使用说明,其他平台上Linux和Android系统上接口函数均保持类似,可直接参考移植。

注:如果对SPI功能有更高要求,可选用CH347增强版芯片来实现。链接:

高速USB转JTAG/SPI/I2C/UART/GPIO应用_PC技术小能手的博客-CSDN博客


文章来源: https://blog.csdn.net/WCH_TechGroup/article/details/130928825
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
889 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,702

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 振翅碎流霞
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧