Arduino 中的 shiftIn() 和 shiftOut()
shiftIn() 和 shiftOut() 命令在 Arduino 中,从非常宽泛的角度来说,是 SPI 的软件实现。当然,SPI 的速度要快得多,但 SPI 只能在 Arduino 的某些特定引脚上工作。shiftIn() 和 shiftOut() 可以使用 Arduino 的任意两个 GPIO(而不是像 SPI 一样的一些特定引脚)。
shiftIn() 和 shiftOut() 都需要两个数字引脚,一个 dataPin 和一个 clockPin。dataPin 将一次一位地移入或移出一字节(8 位)数据。clockPin 同步数据传输。它通常保持低电平,并且在每次比特传输时,它变为高电平,然后恢复到低电平。上升沿(从低电平到高电平)是发生比特传输的时间点。
语法
shiftOut 的语法如下:
shiftOut(dataPin, clockPin, bitOrder, value)
其中 dataPin 和 clockPin 表示用于移位操作的两个引脚。bitOrder 可以是 MSBFIRST 或 LSBFIRST,指示从哪里开始传输。value 是需要移出的字节(8 位)数据。
类似地,shiftIn 的语法如下:
byte incoming = shiftIn(dataPin, clockPin, bitOrder)
在这里,我们读取一个比特,而不是发送。因此,它只接收 3 个参数,并输出一个字节。
请注意,对于 shiftOut(),dataPin 必须定义为 OUTPUT,对于 shiftIn(),则必须定义为 INPUT。在两种情况下,clockPin 都必须定义为 OUTPUT。当与由上升沿时钟控制的设备接口时,请确保在调用 shiftOut() 之前,时钟引脚处于低电平 (digitalWrite(clockPin,LOW))。
应用
如上所述,shiftIn() 和 shiftOut() 就像 SPI 的软件实现。它们有助于减少数据传输所需的引脚数量。与其通过 8 条线并行发送 8 位,不如通过一条线逐位串行发送,操作由时钟线同步。
一个常见的应用是与 74HC595 移位寄存器接口,该寄存器用于串行到并行转换。一个很好的例子可以在 这里找到。