通过haas了解SPI,并在OLED上显示hello world

通过haas了解SPI,并在OLED上显示hello world

SPI

SPI通讯线路介绍

SPI信号数量共有4个,由1个主设备可以链接N个从设备,通过CS线(片选信号,连接主、从设备,通过选择不同的CS信号,来达到选择与哪个从设备通信的效果)连接到从设备,SCLK为时钟信号,可以控制工作速率的大小;MOSI为从主设备输出数据到从设备的线路,MISO相反。

通过haas了解SPI,并在OLED上显示hello world_第1张图片

SPI多设备通讯介绍

普通连接

主设备与多个从设备连接时,为N个CS线,1个SCLK\MOSI\MISO线,如图所示与其他设备进行连接,需要注意的是,SPI只能一个接一个的与从设备通讯,当给CS0置低电平,CS1置高电平时,则与CS0进行通讯

通过haas了解SPI,并在OLED上显示hello world_第2张图片

菊花链连接

通过haas了解SPI,并在OLED上显示hello world_第3张图片

SPI工作模式

由时钟极性CPOL、时钟相位CPHA组合而成

通过haas了解SPI,并在OLED上显示hello world_第4张图片

CPOL=1时,空闲阶段为高电平、CPOL=0时,空闲阶段为低电平;CPHA=1,第一个沿进行采样(CPOL=1,为下降沿,CPOL=0,为上升沿),CPHA=0,为第二个沿进行采样

通过haas了解SPI,并在OLED上显示hello world_第5张图片

标准为在一根线上传输数据,即一个Byte(一个字节有8位)的8个bit在一根线,Dual SPI将一个Byte分为两根线进行传输,如下图所示,QualSPI同理

通过haas了解SPI,并在OLED上显示hello world_第6张图片 通过haas了解SPI,并在OLED上显示hello world_第7张图片

SPI与OLED的配合调用

OLED在Haas里面的管教连线

通过haas了解SPI,并在OLED上显示hello world_第8张图片

SPI类的创建与打开

from driver import SPI
spi = SPI()

如果创建成功,返回SPI对象,创建失败抛出ENOMEN异常

Board.json的配置

通过haas了解SPI,并在OLED上显示hello world_第9张图片

Board.json
{
  "name": "board-name",
  "version": "1.0.0",
  "io": {
      "spi_bmp280": {
      "type": "SPI",
      "port": 3,
      "mode": "master",
      "freq": 200000      }
  }
}

image-20221114183513656

通过SPI.open(node)打开对象,通过SPI.close()关闭SPI设备,成功则返回值0

SPI类读写

SPI.read(buf),功能从SPI总线接收数据,返回0or正整数:为真实接收到的数据

SPI.write(buf)向SPI总线发送数据

SPI.readAfterWrite(buf, data)

属性字段 数据型 必选项? 字段说明
buf bytearry 接收数据的存储数组,期待接收的字节数为buf的长度
data bytearry 发送数据的存储数组,期待发送的字节数为data的长度。

利用SPI通讯在OLED上显示

本次小实验需要使用sh1106.py芯片库文件,现已上传到CSDN,可供下载

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import time
from driver import SPI
from driver import GPIO
import sh1106
# OLED屏幕示例
def oled_init():
    print("oled init")
    oled_spi = SPI()
    oled_spi.open("oled_spi")

    oled_res = GPIO()
    oled_res.open("oled_res")

    oled_dc = GPIO()
    oled_dc.open("oled_dc")
    
    global oled
    oled = sh1106.SH1106_SPI(132, 64, oled_spi, oled_dc, oled_res)
    oled.fill(0)
    oled.text('Inite....', 2, 24, 1)
    oled.show()
    time.sleep(10)


def oled_test():
    global oled
    while True:
        print("------------Oled test---------") 
        oled.fill(0)
        oled.text("Hello", 10, 2, 1)
        oled.text("World", 50, 16, 1)
        oled.show()
        print("Hello world")
        time.sleep(5)
        print("---------test end--------------")


if __name__ == '__main__':

    oled = None
    oled_init()
    oled_test()









你可能感兴趣的:(单片机,嵌入式硬件)