SPI通信中MPSSE库的SPI_ReadWrite函数功能是什么?
SPI函数的信号层差异与
SPI_ReadWrite的价值 SPI本质是同步全双工总线,硬件层面每个时钟周期必然同时完成1位数据的输出(MOSI线)和输入(MISO线),你提到的三个库函数只是对这个固有硬件行为做了不同的上层封装,信号层面的差异如下:
SPI_Write:仅处理用户传入的发送数据,将数据逐位输出到MOSI线,同时期MISO线上输入的所有数据会被库直接丢弃,不会返回给调用方。信号层面依然存在MISO输入动作,只是上层未做保留。SPI_Read:仅返回MISO线上的输入数据,调用时库会自动在MOSI线上输出固定的占位数据(通常是0x00或0xFF,由库的默认配置决定),该占位数据不会暴露给调用方。信号层面依然存在MOSI输出动作,只是输出内容为无意义的填充值。SPI_ReadWrite:同时保留收发两侧的数据,将调用方传入的发送缓存内容输出到MOSI,同时将相同时钟周期内MISO的输入数据写入接收缓存返回给调用方,无数据丢弃或填充动作。
SPI_ReadWrite的存在主要有两个核心意义:
- 满足特定从设备的协议要求
很多SPI从设备的通信协议本身要求全双工交互,比如SPI接口的ADC/DAC,你在MOSI上输出DAC配置值的同时,MISO就会同步返回ADC的采样结果;再比如部分Flash、传感器器件,你发送读指令、地址的同时,MISO会同步返回器件状态位,这类场景下单独的读/写函数根本无法满足协议要求,必须用同时收发的接口。 - 大幅提升通信效率
就算是逻辑上需要“先写指令/地址、再读数据”的串行场景,用SPI_ReadWrite也可以合并为单次传输:你可以把要发送的指令、地址和读阶段需要的占位数据拼成一个连续的发送序列,单次调用SPI_ReadWrite,之后丢弃接收缓存中对应发送阶段的无效数据,保留后续的读数据即可。这种方式只需要拉一次片选、走一次USB传输(你使用的MPSSE是USB转SPI方案),比拆分调用SPI_Write+SPI_Read少了一次USB交互和片选切换开销,延迟更低、吞吐量更高。
内容的提问来源于stack exchange,提问作者yeuop
相关产品推荐
相关产品推荐

