Подключение дисп. нокиа 5110 через микропитон

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
inaugurator
Родился
Сообщения: 12
Зарегистрирован: Сб дек 13, 2014 11:52:53

Подключение дисп. нокиа 5110 через микропитон

Сообщение inaugurator »

Привет, Радиокот!
Прошу помочь разобраться с подключением дисплея от нокии 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
У себя я так и сделал. В __init__ класса Display:

Код: Выделить всё

    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)    
Реклама
inaugurator
Родился
Сообщения: 12
Зарегистрирован: Сб дек 13, 2014 11:52:53

Re: Подключение дисп. нокиа 5110 через микропитон

Сообщение inaugurator »

Нашел, что SPI должен быть настроен так: bits=8, polarity=0, phase=1, а по старшему и младшему биту пока ничего. Вроде всё в соответствии с документацией делаю, а от экранчика никакой реакции.
Начальную настройку точно правильно написал. То ли я неправильно первый сброс делаю, то ли экранчик мёртвый - не знаю как проверить, других микроконтроллеров нет.
Может быть я не в той ветке тему открыл, так что никто из спецов не заглядывает.

Переписал библиотеку, сейчас выглядит намного лучше + где можно оставил комментарии.
Я больше склоняюсь к тому, что неправильно делаю первый сброс.
Спойлер

Код: Выделить всё

# -*- coding: utf-8 -*- 
# Micropython board 1.0 library for Nokia 5110 display
# author: Евгений
# license: Apache 2.0
# original: https://github.com/inaugurator/upyd5110
# datasheet: https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf
# Micropython project: http://micropython.org/
# One data byte is vertical column with LSB on the top.
# SPI mode bits=8, polarity=0, phase=1
# 
# Pins definition
# display     pyboard           state
#
# VCC    ->   3V3 or any Pin    3.3V
# DIN    ->   MISO
# CLK    ->   SCK               0 - 4 MHz
# RST    ->   any Pin           active 0, at start it may be 0
# CE     ->   any Pin           for start transmission 0
# DC     ->   any Pin           commands 0, data 1
# LIGHT  ->   any Pin           active 0
# GND    ->   GND
#
# First side
# SPI    = pyb.SPI(1)
# RST    = pyb.Pin('Y4')
# CE     = pyb.Pin('Y5')
# DC     = pyb.Pin('Y3')
# LIGHT  = pyb.Pin('Y2')
# PWR    = pyb.Pin('Y1')
#
# Second side
# SPI    = pyb.SPI(2)
# RST    = pyb.Pin('X4')
# CE     = pyb.Pin('X5')
# DC     = pyb.Pin('X3')
# LIGHT  = pyb.Pin('X2')
# PWR    = pyb.Pin('X1')

import pyb # module for operation of the periphery

# main class
class Display:
  def __init__(self, spi, rst, ce, dc, light, pwr):
    
    # init the SPI bus and pins
    spi.init(spi.MASTER, baudrate=328125, bits=8, polarity=0, phase=1, firstbit=spi.LSB)
    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)
    pwr.init(pwr.OUT_PP, pwr.PULL_NONE)
    
    # store the pins
    self.spi   = spi
    self.rst   = rst
    self.ce    = ce
    self.dc    = dc
    self.light = light
    self.pwr   = pwr
    
    # light off
    self.lightOff()
    
    # turn on
    self.turnOn() # power on
    self.command(b'\x21') # extended command mode
    self.command(b'\xC8') # for 3.3V power supply
    self.command(b'\x06') # set temperature correction
    self.command(b'\x13') # system bias
    self.command(b'\x20') # basic command mode
    self.command(b'\x0C') # b/w mode, horizontal addressing
    self.clear()
    
  # power on
  def turnOn(self):
    self.pwr.high()
    self.reset()

  # this needs for proper initialization
  def reset(self):
    self.rst.low() # rst active 0
    pyb.udelay(100) # reset impulse have to be > 100 ns and < 100 ms
    self.rst.high() # deactivate rst

  # display have to be blank before power off
  def turnOff(self):
    self.clear()
    self.command(b'\x20') # basic command mode
    self.command(b'\x08') # clear the display
    pyb.delay(10)
    self.pwr.low() # turn off power supply pin
    
  
  def clear(self):
    self.command(b'\x20') # basic command mode
    self.command(b'\x80') # set X address = 0
    self.command(b'\x40') # set Y address = 0
    self.write(b'\x00'*504) # fill RAM with '0's
  
  
  def command(self, buf):
    assert type(buf) == type(bytes()) # check that buf is bytes
    assert len(buf) == 1 # check that buf is one byte
    self.dc.low() # command mode
    self.write(buf) # write command
    self.dc.high() # return to data mode
  
  
  def write(self, buf):
    assert type(buf) == type(bytes()) # check that buf is bytes
    self.ce.low() # start transmission
    self.spi.send(buf) # send with SPI interface
    self.ce.high() # end transmission


  def setXY(self, X, Y):
    assert X <= 83 # X may be 0-83
    assert Y <= 5 # Y may be 0-5
    xbyte = X + 128 # X address is 0b1xxxxxxx
    xbyte = xbyte.to_bytes(1) # convert dex to bin
    ybyte = Y + 64 # Y address is 0b01000xxx
    ybyte = ybyte.to_bytes(1) # convert dex to bin
    self.command(b'\x20') # basic command mode
    self.command(xbyte) # set X address
    self.command(ybyte) # set Y address
    
  
  def lightOn(self):
    self.light.low() # active 0


  def lightOff(self):
    self.light.high() # inactive 1
Реклама
Ответить

Вернуться в «Разные вопросы по МК»