CH341的SPI功能

DLL里面有关SPI的函数是“通过USB函数的位控制函数来实现”还是“硬件直接里面有移位寄存器,直接以字节为单位来传输”?(看前面的帖子说位操作很慢)

一般SPI都是传输完所有Bit后,那条CS控制线才变一下。但我看CH341的SPI函数都是以字节为单位,但如果是12bit或者其他8Bit的能否传输,每次SPI传输8bit后那条SPI的CS控制线会不会都变一下

不是通过USB函数的位控制函数来实现的, 通过我们驱动来控制CH341芯片内的硬件来模拟spi时序.我们网上提供了一个例程,您可以参考.ch341evt.zip\exam\exam.c


SPI控制线有一条CSn控制线,在传输数据时是有效,传输完数据时就变无效。

但我看CH341的SPI函数都是传输8bit的,如果我要传输12bit,是不是要分为两次,那么发了前8bit后,这条CSn控制线会不会变复位,然后再发下8bit,CSn又产生一个周期? 简单的说就是CSn一个有效周期内能否产生非8bit的传输数据?


在我们动态库里提供了CH341BitStreamSP(),主要是处理SPI位数据流,4线/5线接口,对于非整八位的数据传输,可以用这个函数来实现.此时CS由函数来控制变化. 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方向,并设置引脚的默认电平 */

缓冲区内的每个字节对应于下面相应的引脚: SPI <=> CH341 字节位 DIN <=> D7 7 DIN2 <=> D6 6 DOUT <=> D5 5 DOUT2 <=> D4 4 DCK <=> D3 3 CS1 <=> D2 2 CS2 <=> D1 1 CS3 <=> D0 0 具体的函数说明请见ch341dll.h,例程请看ch341evt.zip\exam\exam.c.


这样子这个函数用起来很麻烦,前面准备部分要做很多工作,

“速度约8K位*2”指的是DCK这个时钟线上面的时钟频率?如果是8KHz左右,那么的确较慢,还快不过串行口。


其实用起来也就是几个函数,不复杂.可能只是说明文字多了点,看似复杂.8K是时钟.速度不可能很快,毕竟是USB接口传输数据是1ms 1帧,没办法.


准备这个数据结构我觉得麻烦,例如16bit的SPI输出,要将这一个字里面逐bit分解到16个字节相应bit,读进来又要将分散在16字节中的bit组合成字。


只有登录才能回复,可以选择微信账号登录