2回答

2收藏

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

#线上活动 #线上活动 2468 人阅读 | 2 人回复 | 2016-12-14

本帖最后由 wambob 于 2016-12-14 16:35 编辑

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

兼容Arduino ICSP。

   
    SPI与外设的连线:
   

      从模拟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的写时序图:

在setup()中初始化SPI、设置位序、设置SPI时钟、设置数据模式(上升沿采集,0模式和3模式可用)、其它引脚和OLED的初始化。

其中的发送数据函数从模拟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 (2.39 MB, 下载次数: 41)

IMG_20161214_161641.jpg

评分

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

查看全部评分

分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

wambob

发表于 2016-12-14 16:36:29 | 只看该作者

沙发占下,模拟和硬件SPI比较,嗨是硬件的快
板凳

limale

发表于 2016-12-15 09:39:13 | 只看该作者

wambob 发表于 2016-12-14 16:36
沙发占下,模拟和硬件SPI比较,嗨是硬件的快

硬件肯定爽歪歪,刷屏飕飕的。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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