hardware

【图文】使用C++完成树莓派和ADC的数据交互系列 part1


本文翻译自 halherta 的文章,原文地址来自 hertaville.com

在这篇文章中我将演示如何让树莓派和MCP3008(基于SPI的模数转换集成芯片)进行交互,好让树莓派识别模拟信号–这些信号通常来自于传感器对现实世界的物理量的测量,比如加速度,光照强度和测试等。首先让我们对SPI接口进行个大概的说明。

SPI接口原理图

图1 SPI接口原理图

SPI (Serial Peripheral Interface) 是用于将单一的主设备连接到一个或多个从外围集成电路的通信总线,主设备通常是微控制器或者微处理器。现实中有很多外围SPI IC,他们包括模数转换器(ADC),数模转换器(DAC),通用输入/输出(GPIO)扩展IC ,温度传感器IC,加速计等等。在这点上 SPI 总线有点象 I2C总线。相比I2C总线SPI总线有一个很大的好处就是它可以达到很高的速度。象10Mbps是很常见的甚至它的最大速度还可以达到接口的上限,比如超过50Mbps也是不足为奇的。

但不得不提的,SPI也有自己的缺点,与I2C对比它所需要的连接线也比较多(这在电路设计中是个硬伤,在有限的面积上连接线越多电路越复杂,甚至还有可能采用多层板,增加了复杂度降低了可靠性)。I2C总线是双线总线(2-wire bus)理论上可以连接多达127个设备,如果使用9线方案而不是常规的7线方案可以连接的设备数量更大。而 SPI 是 3+n 形式的总线,这里的 n 是连接到主设备上的从设备的数量。例如图1,总共需要6根信号线,外加主设备上需提供6个管脚,才能完成3个从设备与1个主设备间的连接。这意味着不光是 SPI 总线使用的信号线比 I2C 总线要多,当需要把更多的从设备加到总线上 SPI 总线上的线号信数量也会线性地增加。还有另外一点,每一个从设备都需要4根信号线来连接到 SPI 总线上。

其中三根被从设备共享的信号线分别为

  • Master In Slave Out (MISO),在这条信号线上,数据从从设备流向主设备。
  • Master Out Slave In(MOSI),在这条信号线上,数据从主设备流向从设备。
  • Serial Clock(SCLK),串行时钟,时钟信号由主设备产生用来同步主从设备间的数据传输。

除此以外我们还有 ‘n’ 根信号线对应连接到总线上的 n 个从设备。它们用来传输设备的片选信号(SS或者CS)。每一次只有一个从设备能够接收到主设备发出的片选信号(即一对一模型)。

SPI操作过程

图2 SPI操作过程

SPI总线操作理论上讲很简单。主从设备上都有位移寄存器,当从设备的片选端接收到有效的片选信号(通常是低电位),从设备通过总线的MOSI和MISO信号线连接到主设备的位移寄存器上。时钟脉冲信号(由主设备产生)将使从主设备上的位移寄存器发生循环位移,从而完成主从设备间的数据交换。感觉上就好象是读和写操作同步进行一样。具体来说,就是当主设备把数据位移到从设备上的同时,从设备也把数据位移到了主设备寄存器上。

最后要提的是,SPI有四种模式可以采用。每一种模式都定义了一组特殊的时钟相位(CPHA)和极性(CPOL)。对于这篇文章目的来说我们只使用模式0,这个模式也被表示成 mode(0,0)或者mode( CPHA=0,CPOL=0)

关于更详细的 SPI 说明,读者可以参考下面这些资料

未完,待续…..

hardware
如何为Intel Edison 设置开机自动运行程序,systemd 设置篇
General
3D手势控制又添新成员,nimble UX 即将向开发员发布新的 SDK
hardware
【Gekius】图文 Raspberry Pi 又出新版本,新版A+只需20美元