查看: 2311|回复: 0

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

[复制链接]
  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2017-2-6 21:56:59 | 显示全部楼层 |阅读模式
    分享到:
    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_02125425.jpg
    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. }
    复制代码
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-23 13:36 , Processed in 0.129503 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.