Прошу помочь разобраться с подключением дисплея от нокии 5110 к микропитоновской плате.
Проект микропитона (МП) здесь: http://micropython.org/
Написал заготовку драйвера на питоне. От дисплея нет совершенно никакой реакции.
Из языков знаю только питон, поэтому читая исходные тексты библиотек для ардуино или других контроллеров ничего толком не понимаю.
У меня 3 вопроса:
1) На МП SPI интерфейс настраивается следующими параметрами (из документации):
spi.init(mode, baudrate=328125, *, polarity=1, phase=0, bits=8, firstbit=SPI.MSB, ti=False, crc=None)
где:
mode - мастер или ведомый (SPI.MASTER, SPI.SLAVE)
baudrate - частота
polarity - логический уровень CLK в простое (0 или 1)
phase - в начале или в конце шага CLK считывать бит (0 или 1)
bits - кол-во бит на байт, вроде так, не документировано (по умолчанию 8 )
ti - не знаю что это такое, не документировано (по умолчанию False)
firstbit - старший или младший бит сначала (SPI.LSB, SPI.MSB)
crc - не знаю что это такое, не документировано (по умолчанию None)
Для ардуин ни о polarity ни о phase ничего не нашел. Я перепробовал все возможные сочетания параметров: без результата.
Как правильно настроить параметры?
2) Может быть я неправильно делаю запуск: в документации говорится, что если неправильно запускать, то экранчик может испортиться. В интернете встречаются самые разные интерпретации документации, кто говорит нужно ждать несколько наносекунд, кто микро, кто милли.
Я руководствовался наработками с этого сайта:
http://mcuoneclipse.com/2012/12/16/zero ... dom-board/
- Setting RES and SCE to HIGH
Waiting for 10 ms
Setting RES to LOW
Waiting 100 ms
Setting RES to HIGH again
Код: Выделить всё
self.ce.high()
self.rst.high()
pyb.delay(10) // подождать 10 миллисекунд, udelay() - микросекунд, нано нет
self.rst.low()
pyb.delay(100)
self.rst.high()
Как правильно запускать?
3) Может быть я неправильно дальше настраиваю. На том же сайте написано, что при питании от 3В нужно посылать:
With 3V power supply, the sequence is 0x21 0xC8 0x13 0x20 0x09
Я посылаю тоже самое.
Код: Выделить всё
self.ce.low()
self.dc.low()
self.spi.send(b'\x21')
self.spi.send(b'\xC8')
self.spi.send(b'\x13')
self.spi.send(b'\x20')
self.spi.send(b'\x09')
Как его настроить?
Надеюсь, что дисплейчик ещё жив. Внешних повреждений нет, только из магазина.
Благодарю за внимание и за любую помощь.
Вот картинка расположения выводов: А это моя заготовка драйвера:
Спойлер
Код: Выделить всё
# -*- coding: utf-8 -*-
# библиотека для работы с дисплеем Nokia 5110
# автор: Евгений
# для информации смотри:
# http://4a4ik.blogspot.com/2014/07/nokia-5110-lcd.html
# http://mcuoneclipse.com/2012/12/16/zero-cost-84x48-graphical-lcd-for-the-freedom-board/
# адресация дисплея Y 0-5, X 0-83. Один байт - вертикальный столбик, младший бит сверху.
#
# определение выводов
# display pyboard state
# DIN -> Y7
# CLK -> Y6
# RST -> Y4 active 0
# CE -> Y5 must be 0 or gnd
# DC -> Y3 commands 0, data 1
# VCC -> 3.3V
# LIGHT -> Y2 active 0
# GND -> GND
import pyb # модуль для работы с железом
SPI = pyb.SPI(1)
RST = pyb.Pin('Y4')
CE = pyb.Pin('Y5')
DC = pyb.Pin('Y3')
LIGHT = pyb.Pin('Y2')
class Display:
def __init__(self, spi, rst, ce, dc, light):
# init the SPI bus and pins (1 вопрос)
spi.init(spi.MASTER, baudrate=328125, bits=8, polarity=1, phase=0, firstbit=spi.MSB)
rst.init(rst.OUT_PP, rst.PULL_NONE)
ce.init(ce.OUT_PP, ce.PULL_NONE)
dc.init(dc.OUT_PP, dc.PULL_NONE)
light.init(light.OUT_PP, light.PULL_NONE)
# store the pins
self.spi = spi
self.rst = rst
self.ce = ce
self.dc = dc
self.light = light
# initialization (2 вопрос)
self.ce.high()
self.rst.high()
pyb.delay(10)
self.rst.low()
pyb.delay(100)
self.rst.high()
self.light.high()
# for 3V power suply sequence is 0x21 0xC8 0x13 0x20 0x09 (3 вопрос)
self.ce.low()
self.dc.low()
self.spi.send(b'\x21')
self.spi.send(b'\xC8')
self.spi.send(b'\x13')
self.spi.send(b'\x20')
self.spi.send(b'\x09')
# default example from datasheet p.22
#self.ce.low()
#self.dc.low()
#self.spi.send(b'\x90')
#self.spi.send(b'\x20')
#self.spi.send(b'\x0C')
#self.dc.high()
#self.spi.send(b'\x1F')
#self.spi.send(b'\x05')
#self.spi.send(b'\x07')
#self.spi.send(b'\x00')
#self.spi.send(b'\x1F')
#self.spi.send(b'\x04')
#self.spi.send(b'\x1F')
#self.dc.low()
#self.spi.send(b'\x0D')
#self.spi.send(b'\x80')
def light_on(self):
self.light.low()
def light_off(self):
self.light.high()
def write(self, buf, X, Y):
assert X <= 83
assert Y <= 5
xbyte = X + 128
xbyte = xbyte.to_bytes(1)
ybyte = Y + 64
ybyte = ybyte.to_bytes(1)
self.ce.low()
self.dc.low() # перейти в режим настройки для отправки координат
self.spi.send(xbyte)
self.spi.send(ybyte)
self.dc.high() # перейти в режим передачи данных
self.spi.send(buf)
