查看: 145|回复: 2

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

[复制链接]

56

主题

1

好友

2280

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 10:52
  • 签到天数: 686 天

    连续签到: 2 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 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 人评分 收起 理由
    loveeeboard + 25

    总评分:  + 25   查看全部评分

    回复

    使用道具 举报

    56

    主题

    1

    好友

    2280

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 10:52
  • 签到天数: 686 天

    连续签到: 2 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

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

    使用道具 举报

    27

    主题

    13

    好友

    1562

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    开心
    6 分钟前
  • 签到天数: 152 天

    连续签到: 14 天

    [LV.7]常住居民III

    爱板会员勋章 活跃会员勋章

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

    硬件肯定爽歪歪,刷屏飕飕的。
    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-5-23 00:32 , Processed in 0.122328 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部