spi_control.py
# Dieses Werk ist unter der MIT-Lizenz lizenziert.
# Copyright (c) 2013-2026 OpenMV LLC. Alle Rechte vorbehalten.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# SPI-Steuerung
#
# Dieses Beispiel zeigt, wie man den SPI-Bus verwendet, um das SSD1351-
# OLED-Breakout-Board für den OpenMV AE3 direkt anzusteuern, ohne den eingebauten Display-
# Treiber zu verwenden. Um dieses Beispiel auszuführen, benötigen Sie das OLED-Breakout-Board.
import csi
import time
import struct
from machine import Pin, SPI
WIDTH = 128
HEIGHT = 128
# Pin-Belegung des OLED-Breakout-Boards auf dem OpenMV AE3.
cs = Pin("P3", Pin.OUT, value=1)
rs = Pin("P8", Pin.OUT, value=1) # Daten-/Befehlsauswahl
rst = Pin("P7", Pin.OUT, value=1) # Reset
# Der Hardware-SPI-Bus für das OpenMV-AE3-OLED-Breakout-Board ist SPI-Bus 0.
spi = SPI(0, baudrate=WIDTH * HEIGHT * 60 * 16, polarity=0, phase=0)
def write_command(cmd, *args):
rs.low()
cs.low()
spi.write(bytes([cmd]))
cs.high()
rs.high()
if args:
cs.low()
spi.write(bytes(args))
cs.high()
def write_image(img):
# RGB565-Pixel byteweise vertauschen, um die vom SSD1351 erwartete Big-Endian-Reihenfolge zu erhalten.
pixels = struct.unpack("H" * (img.size() // 2), img)
swapped = struct.pack(">" + "H" * len(pixels), *pixels)
cs.low()
spi.write(swapped)
cs.high()
# LCD zurücksetzen.
rst.low()
time.sleep_ms(100)
rst.high()
time.sleep_ms(100)
# SSD1351-Initialisierungssequenz.
write_command(0xFD, 0x12) # COMMAND_LOCK: MCU-Schnittstelle des IC entsperren
write_command(0xFD, 0xB1) # COMMAND_LOCK: A2, B1, B3, BB, BE, C1 entsperren
write_command(0xB2, 0xA4, 0x00, 0x00) # DISPLAY_ENHANCEMENT
write_command(0xB3, 0xF0) # CLOCK_DIV
write_command(0xCA, 0x7F) # MUX_RATIO
write_command(0xA0, 0x74) # SET_REMAP
write_command(0xA2, 0x00) # DISPLAY_OFFSET
write_command(0xB1, 0x32) # PRECHARGE
write_command(0xBB, 0x1F) # PRECHARGE_LEVEL
write_command(0xC7, 0x0A) # CONTRAST_MASTER
write_command(0xC1, 0xFF, 0xFF, 0xFF) # CONTRAST_ABC
write_command(0xB6, 0x01) # PRECHARGE2
write_command(0xAF) # DISPLAY_ON
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((WIDTH, HEIGHT))
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
write_command(0x5C) # WRITE_RAM
write_image(img)
print(clock.fps())