用户工具

站点工具


reference:library:spi

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
reference:library:spi [2019/07/30 15:40] 弘毅reference:library:spi [2023/06/07 04:24] (当前版本) – 外部编辑 127.0.0.1
行 1: 行 1:
 +====== SPI库 ======
 +
 +这个库可以让你将控制器作为主设备,其他外围设备作为从设备与主设备以串行方式进行通信及交换信息。
 +===== 同步串行外设接口总线(SPI)的简介 =====
 +
 +同步串行外设接口总线(SPI)是用于MCU(微控制器)与一个或多个外围设备进行短距离快速通讯的同步串行数据协议。它也可以用于两个微控制器之间的通信。
 +SPI的连接始终是由一个主设备(通常是一个微控制器)来控制外围设备来进行。通常在所有设备上都有三条线,
 +  * Master In Slave Out (MISO) -主设备数据输入,从设备数据输出,
 +  * Master Out Slave In (MOSI) -主设备数据输出,从设备数据输入,
 +  * Serial Clock(SCK)-串行时钟,数据传输的时钟基于主处理器产生的时钟脉冲,
 +  * Slave Select(SS) -从属选择,从设备的管脚控制信号线,由主设备进行使能控制。当从设备的SS引脚置为低电平时,它与主设备进行通信。当从设备的SS引脚置为高电平时,断开与主设备的通信。因此,SPI允许一个主设备和多个从设备进行通信,主设备通过不同的SS信号线选择不同的从设备进行通信。
 +
 +给一个新的SPI设备写程序,你需要注意以下几点:
 +  * 串行数据传输时,是先传输高位(MSB)还是先传输低位(LSB),这是由  SPI.setBitOrder()函数来控制的。
 +  * 数据时钟SCK在空闲时,是高电平还是低电平?
 +  * 采样时,是在时钟脉冲的上升沿还是下降沿?这是由   SPI.setDataMode() 函数来控制的
 +  * SPI是在怎样速度下运行的,即SCLK提供多大的时钟脉冲使SPI运行?这是由 SPI.setClockDivider() 函数来控制的。
 +
 +SPI标准是不严格的,所以每个设备实现功能时稍有不同。这意味着当你写代码时,要特别注意设备的数据表。一般来说,有三种传输模式。这些模式控制着数据是在SCK的上升沿采样,还是在SCK的下降沿采样(称为时钟相位),时钟信号在空闲时,是高电平还是低电平(称为时钟极性)。由相位和极性组合得到三种模式。SPI.setDataMode() 函数用于控制时钟极性和相位,根据此表:
 +^模式^时钟极性(CPOL)^时钟相位 (CPHA)^
 +|0|0|0|
 +|1|0|1|
 +|2|1|0|
 +|3|1|1|
 +
 +当你的SPI参数设置正确,你只需要选择好需要的函数去控制你的设备,然后开始你的作品制作。这将被解释为您的设备数据表。
 +===== 连接 =====
 +
 +在基于ATmega168 / 328的板子上,SPI总线使用引脚10(SS),引脚11(MOSI),引脚12(MISO)和引脚13(SCK)。而在Mega2560板上,使用的是引脚50(MISO),引脚51(MOSI),引脚52(SCK)和引脚53(SS)。需要注意的是,即使你不使用SS引脚,必须将它的模式设置为输出;否则,SPI系统将会认为有一个外部主机将自己选择为从设备(从属模式),从而使库文件的控制失效。
 +
 +它有可能使用其他脚比10脚,作为从机选择引脚SS。例如,OCROBOT的以太网扩展板使用引脚4来控制的SPI连接到主板上的SD卡,用引脚10来控制连接到以太网控制器。
 +
 +===== 函数 =====
 +
 +  * [[reference:library:SPIBegin|begin()]]
 +  * [[reference:library:SPIEnd|end()]]
 +  * [[reference:library:SPISetBitOrder|setBitOrder()]]
 +  * [[reference:library:SPISetClockDivider|setClockDivider()]]
 +  * [[reference:library:SPISetDataMode|setDataMode()]]
 +  * [[reference:library:SPITransfer|transfer()]]
 +
 +===== 参见 =====
 +
 +  * shiftOut()
 +  * shiftIn()