回答

收藏

【赚周年币】技术帖——Fireduino学习6、SPI

#线上活动 #线上活动 2602 人阅读 | 0 人回复 | 2017-02-06

Serial Peripheral Interface(SPI)
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,在主芯片的管脚上主要占用四根线。
MOSI    – 主设备数据输出,从设备数据输入;
MISO    – 主设备数据输入,从设备数据输出;
SCLK   – 时钟信号,由主设备产生;
SS       – 从设备使能信号,由主设备控制
其中MOSI/MISO/SCLK三根线实现全双工的通信,简单高效了,由于器件的寻址通过一个SS片选脚来指定,当连接多台SPI设备时,需要多个片选信号。
SCLK提供时钟脉冲,MOSI,MISO则基于此脉冲完成数据传输。数据输出通过 MOSI线,数据在时钟上升沿/下降沿时改变,在紧接着的下降沿/上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟的改变(上沿和下沿为一次),就可以完成8位数据的传输。
SS线是用于一根使能线,特别是接多个外围设备的时候,可以通过控制SS线,对不同的外围设备进行通信

Fireduino SPI API
SPISettings(speed, dataOrder, dataMode)
   speed:CLK 时钟速率
   dataOrder: MSBFIRST or LSBFIRST
   dataMode : SPI_MODE0, SPI_MODE1, SPI_MODE2, or SPI_MODE3
begin()
   说明       根据参数初始化SPI总线。
   语法
        SPI.begin()
       SPI.begin(10)
   参数
        1.无
       2.片选
   返回
       无
beginTransaction()
   说明
        使用定义SPISettings 初始化 SPI总线。
   语法
        SPISettings  mySettings = SPISettings(14000000, MSBFIRST, SPI_MODE0);
        SPI.beginTransaction(mySettings);
       or
       SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))
   参数
        mySettings:
           SPISettings 类型设置参数
   返回
        无
endTransaction()
   说明
        停止使用SPI总线。
   语法
        SPI.endTransaction()
   参数
        无
   返回
       无
transfer(...)
transfer16(...)
   说明
        用于在SPI总线上传输数据,包括发送与接收。
   语法
        receivedVal = SPI.transfer(val)
       receivedVal16 = SPI.transfer16(val16)
       SPI.transfer(buffer, size)
   参数
       val:在总线上传输的字节
       val16:在总线上传输的半字
       buffer:在总线上传输的buffer
   返回
        从SPI总线上接收的数据值
end()
   说明
        停止SPI总线的使用(保持引脚的模式不改变)。
   语法
        SPI.end()
   参数
        无
   返回
        无
setBitOrder(...)
   说明
        设置串行数据传输时,先传输高位还是低位,有LSBFIRST(最低位在前)和MSBFIRST(最高位在前)两种类型可选。   语法
        SPI.setBitOrder(order)
   参数
        order:LSBFIRST(最低位在前)或MSBFIRST(最高位在前)
   返回
        无
setDataMode(...)
   说明
        设置SPI的数据模式,即:时钟极性和时钟相位。
        时钟极性:表示时钟信号在空闲时是高电平还是低电平;
        时钟相位:决定数据是在SCK的上升沿采样还是在SCK的下降沿采样。
        包含四种数据模式(详见参数),采样时,应先准备好数据,再进行采样。
   语法
        SPI.setDataMode(mode)
   参数
        mode:
            SPI_MODE0(上升沿采样,下降沿置位,SCK闲置时为0),
           SPI_MODE1(上升沿置位,下降沿采样,SCK闲置时为0),
           SPI_MODE2(下降沿采样,上升沿置位,SCK闲置时为1),
           SPI_MODE3(下降沿置位,上升沿采样,SCK闲置时为1)。
   返回
        无   
setClockDivide(...)
   说明
       设置SPI串行通信的时钟。通信时钟是由系统时钟分频而得到,分频值有2,4,8,16,32,64或128。默认设置是SPI_CLOCK_DIV4,设置SPI串行通信时钟系统时钟的四分之一,即400000。
   语法
        SPI.setClockDivider(divider)
   参数
        divider:
            SPI_CLOCK_DIV2
           SPI_CLOCK_DIV4
           SPI_CLOCK_DIV8
           SPI_CLOCK_DIV16
          SPI_CLOCK_DIV32
           SPI_CLOCK_DIV64
           SPI_CLOCK_DIV128
   返回
        无   
SPI 示例程序
  1. #include <Arduino.h>
  2. #include "SPI.h"
  3. #define SPI_CS
  4. const int chipSelectPin = 10;
  5. const int chipResetPin = 9;
  6. void setup() {
  7.         Serial.begin(115200);
  8. #ifdef SPI_CS
  9.         Serial.print("\r\nSPI_CS  YES...\r\n");
  10.         SPI.begin(10);
  11. #else
  12.         Serial.print("\r\nSPI_CS  NO...\r\n");
  13.         SPI.begin();
  14.         pinMode(chipSelectPin, OUTPUT);
  15.         digitalWrite(chipSelectPin, LOW);
  16. #endif
  17.         SPI.setBitOrder(MSBFIRST);
  18.         SPI.setClockDivider(2);
  19.         SPI.setDataMode(SPI_MODE0);

  20.         pinMode(chipResetPin, OUTPUT);
  21.         digitalWrite(chipResetPin, LOW);        
  22.         delay(10);
  23.         digitalWrite(chipResetPin, HIGH);        
  24.         delay(10);
  25. }
  26. void loop() {
  27.         unsigned char version;
  28. #ifdef SPI_CS
  29.         SPI.transfer(0x00,SPI_CONTINUE);
  30.         SPI.transfer(0x39,SPI_CONTINUE);
  31.         SPI.transfer(0x00,SPI_CONTINUE);
  32.         version = SPI.transfer(0x00);
  33. #else
  34.         digitalWrite(chipSelectPin, LOW);
  35.         SPI.transfer(0x00);
  36.         SPI.transfer(0x39);
  37.         SPI.transfer(0x00);
  38.         version = SPI.transfer(10,0x00);
  39.         digitalWrite(chipSelectPin, HIGH);
  40. #endif

  41.         Serial.print("version:");
  42.         Serial.println(version);
  43.         delay(1000);
  44. }
复制代码
关注下面的标签,发现更多相似文章
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条