极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34065|回复: 9

新版 Arduino 1.7.4 IDE 带的 SPI 库使用说明 必应翻

[复制链接]
发表于 2015-6-9 23:59:37 | 显示全部楼层 |阅读模式
SPI库 简介  (这个库只支持主设备模式)

串行外设接口(SPI)简介
串行外设接口(SPI)是一种同步串行数据协议使用的微控制器和一个或多个外围设备迅速在短距离通信。它也可以用于两个单片机之间的通信。
一个SPI连接总是有一个主设备(通常是一个微控制器)控制外围设备。

其中有三条数据线与所有的SPI设备连接,常见:
        1.  MISO(主入从出) 用于从设备发送数据到主设备的线,
        2.  MOSI(主出从入) 用于主设备发送数据到从设备外设的线,
        3.  SCK(串行时钟)  时钟脉冲的同步数据传输线,由主机产生,用于同每一个从设备同步。
4.  SS(从选择)  主设备使用单独的 SS 线端口,启用和禁用特定的 SPI 设备。
        当一个从设备的 SS 端口选择引脚为低电平时,它与主设备通讯。当它被置为高电平时,它忽略主设备。这可以让你有多个SPI设备共享相同的MISO,MOSI,和 SOK时钟线。

        当为一个新的SPI设备并为他写代码时,需要注意几件事:
        1. 最重要的是数据在位移寄存器里是高位在先(MSB)还是低位在先(LSB)?这是通过SPI控制setbitorder()功能实现的。
        2. 时钟空闲时是高电平还是低电平?在时钟脉冲的上升沿或下降沿的取样?这些模式是通过SPIsetdatamode() 功能控制。
        3. SPI的运行速度是什么?这是通过SPI的setclockdivider()功能控制。
        SPI标准松散,每个器件实现有点不同。这意味着你要特别注意在编写代码时设备的数据表。
一般来说,有四种传送模式。这些模式控制数据转移和输出数据时是在时钟信号的上升沿还是下降沿(称为时钟相位),和时钟在闲置时是高电平还是低电平(称为时钟极性)。这四种模式结合的极性和相位如下表:
       
             模式时钟极性(CPOL)时钟相位(CPHA)
        spi_ mode0                   0                                       0
        spi_ mode1                    0                                   1
        spi_ mode2                    1                                   0
        spi_ mode3                    1                                   1

SPI.setdatamode()功能可以让你设置控制时钟极性和相位模式。
        每一个SPI设备具有最大允许的SPI总线速度。SPI.setclockdivider()允许你改变时钟的速度,使您的设备工作正常(默认情况)。
        一旦你的SPI参数设置正确,只需要控制 设备 数据寄存器的功能。这个在您的设备数据表中有说明。

        更多关于SPI,请到维基百科的页面上查询 SPI。

SPI在不同的Arduino板上的引脚线的定义:

Arduino板MOSI ,MISO, SCK, SS(从设备)SS(主设备)

UNO或Duemilanove 11或12或13或icsp-4 icsp-1 icsp-3 10—

mega1280或mega2560 51或icsp-4  50或52或53 icsp-1 icsp-3—
列奥纳多icsp-4 icsp-1 icsp-3——
由于icsp-4 icsp-1 icsp-3 - 4,10,52

值得注意的是,MISO,MOSI,和SCK应在可用的物理位置上保持一致;这是有用的,例如,在连接一个盾板时。

关于 avr 单片机上的从设备选择 (SS) 端口

注意从设备选择(SS)端口 是基于AVR板的,所有基于AVR板都有一个SS引脚,当 SPI 库 作为从设备的外部主控时,(由于这个库只支持主模式),该引脚应设置为输出(他表示自己是主设备),否则SPI接口可以自动把自己设置为从设备模式,使库工作。
        但是,可以使用任何引脚作为选择从机的(SS)端口。例如,Arduino以太网使用引脚4控制SPI接口的板载SD卡和引脚10控制连接到以太网控制器。

适当扩展的 SPI 功能

由于SPI功能的扩展,Arduino的SPI接口工作原理不同于任何其他的Arduino板。SPI库可以 以相同的方法应用于其他Arduino板或使用扩展方法。扩展的方法利用了SAM3x硬件和允许一些有趣的功能,如:
        自动处理不同的设备配置 (时钟速度、 数据模式等) 所以每个设备可以有它自己的配置被自动选中。
        Arduino        系列板 有三个预定义的从设备选择(SS)引脚线(引脚pin 4,10,52),相对于不同的Arduino板。


函数
1. begin() 
2. begintransaction() 
3. endtransaction() 
4. setbitorder() 
5. setclockdivider() 
6. setdatamode() 
7. spisettings() 
8. transfer() 
9. usinginterrupt()



函数说明    http://labs.arduino.org/tiki-index.php?page=SPI.begin

SPI 描述

串行外设接口总线或 SPI 总线是同步串行数据连接标准,由摩托罗拉命名,在全双工模式下运行。设备在哪里主设备启动数据帧的主从模式进行通信。带有个人的从设备(芯片选择) 选择线为每个设备使用 pin 允许有多个从属设备。以Begin () 方法启动 SPI 通信。

语法
一     SPI.begin()函数: begin()

描述:

用法: SPI.begin(slaveSelectPin)(Arduino Due only)

参数:slaveSelectPin:  控制从设备的 SS 端口  适用于(Arduino Due only)

返回;  没有

二.  SPI.END()

函数: end()

描述:

用法: SPI.end()       SPI.end(slaveSelectPin)(Arduino Due only)

参数: slaveSelectPin:  控制从设备的 SS 端口  适用于(Arduino Due only)


返回: 没有

三    SPI.BEGINTRANSACTION
函数: beginTransaction()

描述: 初始化使用  SPISettings 定义的 SPI 总线。

用法: SPI.beginTransaction(mySettings);  根据 mySettings 所选的参数 设置

返回: 没有


四.  SPI.ENDTRANSACTION

函数: endTransaction()  

描述: 停止使用 SPI 总线。允许 SPI 总线使用其他库。

用法:SPI.endTransaction()

参数: 没有

返回: 没有

五:SPI.SETBITORDER

函数:setBitOrder()

描述:

用法: SPI.setBitOrder(order)       SPI.setBitOrder(slaveSelectPin, order)(Arduino Due only)

参数:slaveSelectPin = 从设备端口
      Order = 指定数据是以LSB 低位在先 还是 MSB 高位在先
     (order: LSBFIRST or MSBFIRST)

返回:没有


六. SPI.SETCLOCKDIVIDER

函数:setClockDivider()

描述:设置相对于系统时钟的 SPI 时钟分频器。基于 avr 单片机主板上可用的分隔是 2、 4、 8、 16、 32、 64或 128。默认设置为 SPI_CLOCK_DIV4,将 SPI 时钟设置为四分之一系统时钟 (4 兆赫为 16/4  mhz) 的频率。
以Arduino 使用的系统时钟,可以除以从 1 到 255 之间的值。默认值是 21,这将设置时钟至 4 兆赫,像其他 Arduino板。
Arduino 适当扩展的方法,如果您使用 setClockDivider() 函数 指定了Arduino 的 从设备选择 (SS) 端口,时钟设置只适用于连接到指定的 SS pin 的设备。



用法:SPI.setClockDivider(divider)      SPI.setClockDivider(slaveSelectPin, divider)(Arduino Due only)

参数:用法 1
divider:  
SPI_CLOCK_DIV2   (On AVR boards  在Avr 单片机主板上)
SPI_CLOCK_DIV4
SPI_CLOCK_DIV8
SPI_CLOCK_DIV16
SPI_CLOCK_DIV32
SPI_CLOCK_DIV64
SPI_CLOCK_DIV128

用法2
slaveSelectPin: 从设备 SS pin端口 (Arduino Due only)
divider: 从 1 到 255 之间的数字(Arduino Due only)


返回:


七.  SPI.SETDATAMODE

函数:  setDataMode()

描述:SPI通讯是以主从模式,在全双工模式下运行,允许有多个从属设备, 主设备以启动数据帧的方式进行通信的。 主设备使用单独的 SS 端口与多个从设备一对一的进行通讯。  带有自己的从设备 SS (芯片选择) 选择端口 。

SetDataMode() 函数 设置 SPI 通信模式:
SPI_MODE0 (上升沿采样,下降沿置位,SCK闲置时为0),
SPI_MODE1 (上升沿置位,下降沿采样,SCK闲置时为0),
SPI_MODE2 (下降沿采样,上升沿置位,SCK闲置时为1),
SPI_MODE3 (下降沿置位,上升沿采样,SCK闲置时为1)。

SPI_MODE3 是 SPI.begin() 不带任何参数的默认数据模式。对 SPI 线路板 v1 的针脚: SS = 24,MOS I= 25,MISO = 26 和 SCK = 27

用法: SPI.setDataMode(mode)                SPI.setDataMode(slaveSelectPin, mode)(Arduino Due only)

参数:mode:
SPI_MODE0
SPI_MODE1
SPI_MODE2
SPI_MODE3

slaveSelectPin: 用于选择从设备的主设备 SS 端口, 适用(Arduino Due only)


返回:没有

八  SPI.SPISETTINGS

函数:SPISettings

描述: 使用新的 SPI 库,每个 SPI 设备可以被配置一次作为一个 SPISettings 对象。

用法:SPISettings mySettting(speed, dataOrder, datamode)


参数:
speed:  通讯的速度
dataOrder:MSBFIRST 或 LSBFIRST
datamode:SPI_MODE0、 SPI_MODE1、 SPI_MODE2 或SPI_MODE3

返回:

回复

使用道具 举报

发表于 2015-6-10 08:33:50 | 显示全部楼层
樓主說的 IDE, 應該是 1.6.4 吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 00:44:24 | 显示全部楼层
Super169 发表于 2015-6-10 08:33
樓主說的 IDE, 應該是 1.6.4 吧.

1.7.4 按 Arduino 的升级提醒,就能直接进入下载页面
回复 支持 反对

使用道具 举报

发表于 2015-6-11 09:08:18 | 显示全部楼层
没有收到什么升级提示,到官网看看,还是1.6.4
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-11 13:52:40 | 显示全部楼层
小张 发表于 2015-6-11 09:08
没有收到什么升级提示,到官网看看,还是1.6.4

我是用 1.7.3 版本时看到的升级提示,下面是链接,不会是假的吧,望验证并回复
http://arduino.org/downloads
回复 支持 反对

使用道具 举报

发表于 2015-6-12 14:04:45 | 显示全部楼层
arduino 分两家,已经打过官司了,你下的是另一家的。。现在软件的东家是http://www.arduino.cc/,你的是ORG哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-12 15:08:33 | 显示全部楼层
小张 发表于 2015-6-12 14:04
arduino 分两家,已经打过官司了,你下的是另一家的。。现在软件的东家是http://www.arduino.cc/,你的是OR ...

老顽童孤陋寡闻,想问一下它们之间不相容吗?
回复 支持 反对

使用道具 举报

发表于 2015-10-29 13:26:24 | 显示全部楼层
楼主你好  , 我是一个刚刚开始使用arduino due板子的新手 之前也没有接触过相关东西,最近要做一个MPU-9250与arduino板子 利用spi通信的工程,有些问题,可以请楼主指点吗?   我Q835791452
回复 支持 反对

使用道具 举报

发表于 2016-4-5 09:32:44 | 显示全部楼层
fengrenaiaiai 发表于 2015-10-29 13:26
楼主你好  , 我是一个刚刚开始使用arduino due板子的新手 之前也没有接触过相关东西,最近要做一个MPU-925 ...

你好,请问解决了吗?我也有问题想请教
回复 支持 反对

使用道具 举报

发表于 2016-6-10 18:30:47 | 显示全部楼层
请教一下楼主usinginterrupt() 这个函数是做什么用的。。中断嘛。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 00:23 , Processed in 0.036824 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表