查看: 1921|回复: 2

【赚周年币】技术贴-----(10)Fireduino 的串行外设接口SPI学习

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-12-14 16:03:32 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 wambob 于 2016-12-14 16:35 编辑

           前面已经使用过模拟的SPI驱动了OLED。在没有SPI接口的但单片上,常模拟SPI接口驱动SPI外设
          Fireduino 提供了一个SPI接口。
           SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,在主芯片的管脚上主要占用四根线。
    MOSI – 主设备数据输出,从设备数据输入;
    MISO – 主设备数据输入,从设备数据输出;
    SCLK – 时钟信号,由主设备产生;
    SS – 从设备使能信号,由主设备控制

    兼容Arduino ICSP。
    1.JPG 2.JPG
       
        SPI与外设的连线:
        FireDuino_02125425.jpg
          从模拟SPI驱动移植成串行SPI接口驱动很方便,只需要改动驱动库发送数据函数和引脚定义。
           Fireduino 提供了SPI库,路径:D:\arduino-.6.8\portable\packages\Firefly\hardware\arm\1.3.0\libraries\SPI
           更底层的驱动被封装了,只在ard_spi.h提供了接口供SPI使用。
    官网提供了API说明:http://wiki.t-firefly.com/index.php/Fireduino/spi
    驱动OLED主要使用的API:  
        begin()
    说明:   根据参数初始化SPI总线。
    语法: SPI.begin()
          SPI.begin(10)
    参数: 1.无       2.片选返回: 无
    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_DIV64128      
    返回:无  
    transfer(...)
    多种格式其中之一原型:
    1. unsigned char transfer(unsigned char _data, SPITransferMode _mode = SPI_LAST)
    复制代码
    说明:发送一个8bit数据
    语法:SPI.transfer(参数1,参数2);
    参数:参数1:unsigned char类型的数据
              参数2:发送模式SPI_CONTINUE或者SPI_LAST。
    返回值:unsigned char类型的数据
    写一个程序关于SPI必须注意的问题有:
    1. 字节的传输是从最高位(MSB)传输,还是从最低位(LSB)传输呢?这是由SPI.setBitOrder()函数进行设置的。
    2. 当数据不传输时,时钟线是高还是低?
    3. 触发方式是上升沿触发还是下降沿触发呢?这个由SPI.setDataMode()函数进行设置。
    4. SPI运行的速度是多快呢?这个由SPI.setClockDivider()函数进行设置
    OLED的写时序图:
    6.JPG
    在setup()中初始化SPI、设置位序、设置SPI时钟、设置数据模式(上升沿采集,0模式和3模式可用)、其它引脚和OLED的初始化。
    5.JPG
    其中的发送数据函数从模拟SPI函数修改:
    1. void WriteCommand(uint8_t cmd)
    2. {
    3. //        CS_L();
    4.         DC_L();
    5.         SPI.transfer(cmd,SPI_CONTINUE);
    6.         //delay(1);
    7. //        CS_H();
    8. }
    9. void WriteData(uint8_t dat)
    10. {
    11. //
    12. //        CS_L();
    13.         DC_H();
    14.         SPI.transfer(dat,SPI_CONTINUE);
    15.         //delay(1);
    16. //        CS_H();
    17. }
    复制代码
    IMG_20161214_161641.jpg

    评分

    参与人数 1 +25 收起 理由
    loveeeboard + 25

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2016-12-14 16:36:29 | 显示全部楼层
    沙发占下,模拟和硬件SPI比较,嗨是硬件的快
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-3 21:23
  • 签到天数: 2449 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2016-12-15 09:39:13 | 显示全部楼层
    wambob 发表于 2016-12-14 16:36
    沙发占下,模拟和硬件SPI比较,嗨是硬件的快

    硬件肯定爽歪歪,刷屏飕飕的。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-3-28 22:29 , Processed in 0.160536 second(s), 24 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.