CH347 SPI读写操作的几个函数区别是什么?

CH347 提供了4个读写函数CH347SPI_Write(),CH347SPI_Read(),CH347SPI_WriteRead,CH347StreamSPI4但开发手册里对函数的描写太简单了,我的疑问

1)spi_read函数 iLength为PULONG型的变量,看起来像是个指针。参数说明里的描述是“准备读取的数据字长度”那么iLength里面存放的到底是告诉read函数需要读取字节的数量还是read函数读结束后将读到的实际字节数量写入到iLength,如果是后一种情况很容易内存溢出如何防止?

2)WriteRead()函数ioBuffer参数说明“ 指向一个缓冲区,放置准备从MOSI 写出的数据,返回后是从MISO 读入的数据”这个函数是先写后读,CH347SPI_Read函数也是先写后读且写的长度都可以指定那么这两个函数的区别是什么?是read函数读取长度可以自己指定,WriteRead函数读取长度不能指定么?

3)CH347StreamSPI4 也是ioBuffer: 指向一个缓冲区,放置准备从MOSI 写出的数据,返回后是从MISO 读入的数据 那么这个函数同WriteRead()有什么区别呢?


能否解释下这几个函数的具体区别?



附:

CH347SPI_Read(

ULONG iIndex,

ULONG iChipSelect,

ULONG oLength,

PULONG iLength,

PVOID ioBuffer);

参数说明

oLength: 准备发出的数据字节数

iLength: 准备读取的数据字长度

ioBuffer: 指向一个缓冲区,放置准备从MOSI 写出的数据,返回后是从MISO 读入的数据


CH347SPI_WriteRead( ULONG iIndex,

ULONG iChipSelect,

ULONG iLength,

PVOID ioBuffer );

参数说明

iLength: 准备传输的数据字节数

ioBuffer: 指向一个缓冲区,放置准备从MOSI 写出的数据,返回后是从MISO 读入的数据


CH347StreamSPI4(ULONG iIndex,

ULONG iChipSelect,

ULONG iLength,

PVOID ioBuffer );

iLength: 准备传输的字节数

ioBuffer: 指向一个缓冲区,放置准备从MOSI 写出的数据,返回后是从MISO 读入的数据


您好,关于您的疑问:

1、CH347SPI_Read中iLength首先为本次read需要读取的数据长度,其次读取结束后会将实际读取的数据长度赋值到iLength,正常情况下实际读取的数据不会大于最初指定的iLength。

2、CH347SPI_Read函数主要功能是用于读取SPI数据,其附加的写入功能是为了面对某些SPI器件需要先下发相关指令再进行读取的情况。CH347SPI_WriteRead则是作为流模式读写方式,实现同时读写操作,其读取写入的长度也是可自行指定的。

3、CH347StreamSPI4其API为适应此前调用方式,功能与CH347SPI_WriteRead一致。



多谢解答。从你的解答中我了解到WriteRead函数读写是在同一时间进行。我如果要给设备先发一个命令然后才开始读取设备返回的情况只能用read函数,这样理解对吧?


是很奇怪,我感觉直接不需要write函数了,反正read和write只是某一bit为0还是1的区别。我直接在写的操作中吧buffer数组中某一位改为1不就行了。遍历寄存器也可以用read,反正发送几个byte的数据可以自己配置


您好,因SPI总线底层硬件是交换传输,所以事实上单独的SPI写或读函数是可以直接被 CH347SPI_WriteRead 函数替代使用的。

之所以提供单独的 CH347SPI_Read 和 CH347SPI_Write 函数是考虑到实际应用有需要单向操作的场景,此类函数使用会更直观些。


SPI_read()函数,指定一个buffer[]数组,波形都没问题,就是读取结果为FF,然后用SPI_WriteRead()函数,更奇怪了,buffer[0]是后发送的,buffer[1]先发送,然后返回值是先读取的赋给buffer[1]

这些都是什么逻辑?

另外,我buff这么声明OK的吧

image.png

image.png

发送两个字节,读取两个字节。16个clk,读取的两个字节是前八个和后八个clk对应的MISO信号是吧?问题到底在哪


看到您其他贴已解决。

——————————

后续,如有问题随时与我们沟通。遇问题,结合硬件SPI排查会更快些。

相关SPI编程参考:https://blog.csdn.net/WCH_TechGroup/article/details/132173785 



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