通过haas了解SPI,并在OLED上显示hello world
SPI
SPI通讯线路介绍
SPI信号数量共有4个,由1个主设备可以链接N个从设备,通过CS线(片选信号,连接主、从设备,通过选择不同的CS信号,来达到选择与哪个从设备通信的效果)连接到从设备,SCLK为时钟信号,可以控制工作速率的大小;MOSI为从主设备输出数据到从设备的线路,MISO相反。
![image-20221110142540880](https://i-blog.csdnimg.cn/blog_migrate/8bae6e9034501a0241b1eb6e1d98d531.png)
SPI多设备通讯介绍
普通连接
主设备与多个从设备连接时,为N个CS线,1个SCLK\MOSI\MISO线,如图所示与其他设备进行连接,需要注意的是,SPI只能一个接一个的与从设备通讯,当给CS0置低电平,CS1置高电平时,则与CS0进行通讯
![image-20221110143128757](https://i-blog.csdnimg.cn/blog_migrate/be9c516b6b076fbf6ef43a2eea2d2a9d.png)
菊花链连接
![image-20221110143527463](https://i-blog.csdnimg.cn/blog_migrate/91363c29db6227dd31daefd9e950d127.png)
SPI工作模式
由时钟极性CPOL、时钟相位CPHA组合而成
![image-20221110144108391](https://i-blog.csdnimg.cn/blog_migrate/6b41cbf105f961a6178706fa6db0787f.png)
CPOL=1时,空闲阶段为高电平、CPOL=0时,空闲阶段为低电平;CPHA=1,第一个沿进行采样(CPOL=1,为下降沿,CPOL=0,为上升沿),CPHA=0,为第二个沿进行采样
![image-20221110144705643](https://i-blog.csdnimg.cn/blog_migrate/cf9a0d1eca858953fe993093483e1d47.png)
标准为在一根线上传输数据,即一个Byte(一个字节有8位)的8个bit在一根线,Dual SPI将一个Byte分为两根线进行传输,如下图所示,QualSPI同理
![image-20221110144726416](https://i-blog.csdnimg.cn/blog_migrate/c2b7b9f37ed2f7d23565ec72a447846c.png)
![image-20221110144855532](https://i-blog.csdnimg.cn/blog_migrate/6992c76e04cea444814aa2ad992e0fb9.png)
SPI与OLED的配合调用
OLED在Haas里面的管教连线
![image-20221114183011358](https://i-blog.csdnimg.cn/blog_migrate/a92e8235f980d3606c2c492ec41bf8ab.png)
SPI类的创建与打开
from driver import SPI
spi = SPI()
如果创建成功,返回SPI对象,创建失败抛出ENOMEN异常
Board.json的配置
Board.json
{
"name": "board-name",
"version": "1.0.0",
"io": {
"spi_bmp280": {
"type": "SPI",
"port": 3,
"mode": "master",
"freq": 200000 }
}
}
通过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()