本帖最后由 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(...)
多种格式其中之一原型:- 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函数修改:- void WriteCommand(uint8_t cmd)
- {
- // CS_L();
- DC_L();
- SPI.transfer(cmd,SPI_CONTINUE);
- //delay(1);
- // CS_H();
- }
- void WriteData(uint8_t dat)
- {
- //
- // CS_L();
- DC_H();
- SPI.transfer(dat,SPI_CONTINUE);
- //delay(1);
- // CS_H();
- }
复制代码 |