roboforum.ru

Технический форум по робототехнике.

Проблема с SPI

Проблема с SPI

executer » 03 окт 2009, 17:31

Вот вплотную занялся дисплеем от Семена - есть проблема. Какойто бок с аппаратным SPI.

вот собственно все что к нему относится (куски из библиотеки Christian Kranz):

Код: Выделить всёРазвернуть
// настройка портов    
    cbi     LCD_PORT, LCD_RESET     ; display reset
    sbi     LCD_DDR,  LCD_RESET     ; set reset as output
    cbi     LCD_DDR,  LCD_MISO      ; MISO is always input in SPI
    sbi     LCD_DDR,  LCD_MOSI      ; MOSI must be set as output for SPI
    sbi     LCD_PORT, LCD_CS        ; deselect display
    sbi     LCD_DDR,  LCD_CS        ; SS must be output for Master mode to work


    cbi     LCD_PORT, LCD_SCK       ; set SCK lo
    sbi     LCD_DDR,  LCD_SCK       ; set SCK as output
    sbi     LCD_PORT, LCD_MISO      ; enable pull up of MISO to avoid floating input

    sbi     LCD_PORT, LCD_RS        ; start with RS=high
    sbi     LCD_DDR, LCD_RS         ; RS signal is output

    ; setup serial data interface
    ; select clock phase positive going in middle of data
    ; master mode
    ; enable SPI
    ; speed is CPUclock/2

    ldi     r24,(1<<MSTR) | (1<<SPE)
    out     LCD_SPCR,r24

    ldi     r24,1              ; double speed bit
    out     LCD_SPSR,r24

// задержка
   
    sbi     LCD_PORT, LCD_RESET ; release reset
    in      r24,LCD_SPSR        ; clear status   

// задержка

    ; ports and SPI are now configured

    ldi     T1,0xFD
    rcall   glcdDispCommand   <<- отсюда МК уже не возвращается
...


Смотрим что там в glcdDispCommand (откуда МК уже не выходит):
Код: Выделить всёРазвернуть
       cbi     LCD_PORT,LCD_CS        ; select Display
       sbi     LCD_PORT,LCD_RS        ; set RS line
       rjmp    SPI_SEND
....
PI_SEND:
    sbi     LCD_SPCR,SPE        ;enable SPI
    out     LCD_SPDR,T1         ;load byte in SPI data register

SPI_SEND_0:
    sbis    LCD_SPSR,SPIF
    rjmp    SPI_SEND_0            <<- вот из этого лупа уже никогда не выходит

ПОЧЕМУ МОЖЕТ НЕ ВЫСТАВЛЯТСЯ SPIF ???
 
.....
    ret


с дисплеем и проводами вроде все в порядке - загружал прогу на БАСКОМ - там программный SPI - картинку показывало. подумал может провода длинные - попробовал снизить скорость SPI - не помогло тоже.
Кто глубоко работал с SPI? Домоможить!! :O:

Добавлено спустя 1 минуту 45 секунд:
с этой библиотекой работал на другой плате - макетке - иногда висло через несколько часов работы, но SPI хотяб работал

Добавлено спустя 1 минуту 27 секунд:
SPI когда передает данные - он вообще слейва видит както? или просто выставляет данные, выдате такт 8 раз и передача окончена? Слейв никак не маякует что все в порядке?

Добавлено спустя 2 минуты 36 секунд:
попробую в другой МК залить :no: . мож этот нехороший...

Re: Проблема с SPI

blindman » 03 окт 2009, 17:57

LCD_PORT, LCD_CS, LCD_DDR - как определены? Контроллер какой?

Re: Проблема с SPI

contr » 03 окт 2009, 17:58

SPI когда передает данные - он вообще слейва видит както? или просто выставляет данные, выдате такт 8 раз и передача окончена? Слейв никак не маякует что все в порядке?

я с этими дисплеями работал, правда без SPI.
Кой-чего маяковать GLСD могут, в сотиках используется, в прочих девайсах - нет.
Просто шлем байтики в сторону LСD. Тактовая не более 4МГц для монохромных и 10..13 для цветных.
Контролем можно считать инициализацию дисплея. Получив набор байтиков с правильными кодами и таймингами, дисплей просыпается и высвечивает мусор. Мусор можно не увидеть, если параметры не так выставлены, но ток увеличивается.
Последний раз редактировалось contr 03 окт 2009, 18:08, всего редактировалось 1 раз.

Re: Проблема с SPI

blindman » 03 окт 2009, 18:00

contr, к чему этот опус? Вопрос прочитай ещё раз

Re: Проблема с SPI

executer » 03 окт 2009, 18:05

Вот так (уже три раза сверился со схемой)

Код: Выделить всёРазвернуть
  #elif defined (__AVR_ATmega32__)
  #define   LCD_PORT                _SFR_IO_ADDR(PORTB)
  #define   LCD_PIN                 _SFR_IO_ADDR(PINB)
  #define   LCD_DDR                 _SFR_IO_ADDR(DDRB)
  #define   LCD_CS      PB2
  #define   LCD_RESET   PB3
  #define   LCD_RS      PB1
  #define   LCD_MOSI    PB5
  #define   LCD_MISO    PB6
  #define   LCD_SCK     PB7


МК в мэйкфайле :

# MCU name
MCU = atmega32

МК виснет на первой же отправке комманды по SPI (место зависания отмечено в первом посте)

Добавлено спустя 4 минуты 49 секунд:
Залил на другой, такойже МК - ничего.
Вложения
Software.rar
На всякий пожарный
(488.18 КиБ) Скачиваний: 9

Re: Проблема с SPI

blindman » 03 окт 2009, 18:06

PB4 (SS) должен быть настроен как выход. Иначе SPI master не работает, и ждать установки флага можно до второго пришествия :)

Re: Проблема с SPI

executer » 03 окт 2009, 18:28

сейчас попробую.

Епатий-Коловратий, да ты гуру, blindman!!!! :Bravo: Уже который раз подряд выручаеш! :good:
Спасибо тебе огромное.


Rambler\'s Top100 Mail.ru counter