CH341的SPI接口特性:
1、提供3个片选信号,SCS0~SCS2;
2、SPI 默认工作模式0,不支持修改;
3、SPI Clock速率固定,小于2MHz;
4、支持MSB/LSB传输;
引脚序号 | 功能说明 |
15~17 | SCS0~SCS2 |
18 | SCK |
20 | MOSI |
22 | MISO |
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, // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/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, // 片选控制, 位7为0则忽略片选控制, 位7为1则参数有效: 位1位0为00/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 接口函数即可。操作流程为:
CH341StreamSPI4 函数说明
iLength:需要xfer传输的字节长度
ioBuffer:需要xfer传输的缓冲区,由于SPI是exchange交换传输,因此该缓冲区内容会先经过MOSI信号线对外输出,然后该API成功返回后,其内容是从MISO信号线上采集的数据。
示例:
UCHAR ioBuffer[2] = {0x11, 0x22};
CH341StreamSPI4(0, 0x80, 2, ioBuffer);
此时,MOSI输出2个字节数据 0x11 和 0x22,然后返回 MISO数据。
图1:MISO悬空(高电平)
图2:MISO接GND(低电平)
如上为CH341的SPI功能使用说明,其他平台上Linux和Android系统上接口函数均保持类似,可直接参考移植。
注:如果对SPI功能有更高要求,可选用CH347增强版芯片来实现。链接:
高速USB转JTAG/SPI/I2C/UART/GPIO应用_PC技术小能手的博客-CSDN博客