📅  最后修改于: 2020-12-27 09:57:06             🧑  作者: Mango
SPI(串行外围设备接口)是串行数据协议。微控制器使用串行协议在短距离内与一个或多个外围设备进行快速通信。
SPI所需的连接是全双工,允许设备同时发送和接收数据。它使用四个导体进行数据接收,数据发送,同步和设备选择进行通信。
SPI使用主从结构,其中一个主设备控制外围设备。
SPI有四行,下面列出:
它代表主输入/从输出。 MISO引脚中的从机线路用于将数据发送到主机。
它代表主输出/从输入。
MOSI和SCK由主机驱动。
它代表串行时钟。这些是时钟脉冲,用于同步数据传输。
在从机中,它用作时钟发生器的输入。在主设备中,它用作输出时钟。主设备生成的数据由SCK同步。
它代表Slave Select 。它是从站选择线,由主站使用。它充当使能线。
什么时候,
SS =低
SS为低电平时,设备与主机的接口。
SS =高
设备不会通知主机。它使我们可以与倍数SPI器件共享相同的MISO,CLK和MOSI。
SPI是一种同步接口,具有一个主机和多个从机通信的结构。
SPI使用上面列出的四条通讯线(MISO,MOSI,CLK和SS)。连接中的主机通常是微控制器,而从机可以是传感器,ADC(模数转换器), LCD (液晶显示器),DAC(数模转换器)等。
让我们了解主SPI与从器件的连接。
考虑以下示例。
考虑下图:
MISO的箭头方向相反,因为它是一条从线,将数据发送到主线。
所有其他线路仅从主站引导。
此处,SPI主设备正在与两个SPI从设备通信。 SPI主设备的各个引脚连接到每个从设备的SS。
让我们讨论一下Arduino板上的SPI Master和Slave引脚。
ICSP接头连接器包括6个引脚。结构如下所示:
SPI引脚的引脚号如下所示:
MOSI- 4
MISO- 1
SCK- 3
下面列出了不同Arduino板上的SPI引脚:
Arduino UNO
MOSI- 11
MISO- 12
SCK- 13
Arduino到期
MOSI- 4
MISO- 1
SCK- 3
Arduino的零
MOSI- 4
MISO- 1
SCK- 3
Arduino Mega2560或Mega1280
MOSI- 51
MISO- 50
SCK- 52
SPI的库为:
# include
SPI库允许我们作为主设备与Arduino和SPI设备进行通信。
SPI有四种模式,它们结合了时钟相位(CPHA)和时钟极性(CPOL)。这些模式称为SPI中的四种传输模式。
时钟相位确定为数据时钟信号,时钟极性确定高或低信号的空闲状态。
SPI模式控制移入和移出状态。该状态位于时钟极性和时钟相位的上升沿和下降沿。
下面讨论这四种模式:
模式0-此处,时钟极性为0(CPOL = 0),而时钟相位为0(CPHA = 0)。在上升沿捕获数据,而输出沿下降。
模式1-在这里,时钟极性为0(CPOL = 0),而时钟相位为1(CPHA = 1)。数据在下降沿捕获,输出沿在Rising 。
模式2-在这里,时钟极性为1(CPOL = 1),而时钟相位为0(CPHA = 0)。数据在下降沿捕获,输出沿在Rising 。
模式3-在这里,时钟极性为1(CPOL = 1),而时钟相位为1(CPHA = 1)。在上升沿捕获数据,而输出沿下降。
在开始使用Arduino中的SPI编程之前,我们必须声明SPI库。
SPI自动使用最佳速度,该速度小于或等于SPISettings中指定的速度编号。如果我们使用15MHz的码片速率,则可以使用15000000的数据速度。
如果我们使用20MHz的码片速率,则可以使用20000000的数据速率。
SPI编程使用的功能如下:
SPI.begin()函数用于通过将SS,SCK和MOSI引脚设置为输出来初始化总线。
它以如下所示的状态拉线:
SS =高
SCK,MOSI =低
语法为:
SPI.begin()
该对象用于配置特定SPI设备的SPI端口。它包括三个与该对象组合的参数。
语法为:
SPI.beginTransaction(SPISettings(12000000, MSBFIRST, SPI_MODE0))
如果三个参数是常量,则可以在SPI.beginTransaction()函数直接声明SPISettings。如果任何设置都是变量,我们可以创建SPISettings对象。
语法为:
SPISettings mySettting(speedMaximum, dataOrder, dataMode)
哪里,
speedMaximum =定义最大通讯速度。
dataOrder = LSBFIRST(最低有效位第一)或MSBFIRST(最高有效位)。
SPI中的大多数数据位使用MSBFirst。
dataMode =它包括四个模式。
SPI_MODE1,SPI_MODE2,SPI_MODE3和SPI_MODE4
beginTransaction()函数用于通过使用定义的SPISettings初始化SPI总线。
语法为:
SPI.beginTransaction(mysettings);
end()函数用于在不更改引脚模式的情况下禁用SPI总线。
语法为:
SPI.end()
transfer()函数用于传输数据。我们可以多次调用函数。
endTransaction()函数用于停止总线。
语法为:
SPI.endTransaction()
setClockDivider()函数用于相对于系统时钟设置时钟分频器。
可以用可用的分频器值2、4、8、16、32、64和128来分频AVR板上的时钟。默认值为4,表示为SPI_CLOCK_DIV4(例如,板在20MHz时为5MHz) )。同样,将代表其他值。
Arduino Due中的时钟可以用1到255之间的可用分频器值进行分频,其中21为默认值。
语法为:
SPI.setClockDivider(divider value)
setDataMode()函数用于在SPISettings中设置数据模式。
语法为:
SPI.setDataMode()
setBitOrder()函数用于设置位的顺序。这些位移入和移出串行外围设备接口总线。
位的顺序设置为LSBFirst(最低有效位在前)或MSBFirst(最高有效位在前)。
语法为:
SPI.setBitOrder(order)