Передать данные по SPI на светодиодную матрицу

Тема в разделе "Микроконтроллеры AVR", создана пользователем Logika, 17 май 2019 в 10:04.

Метки:
  1. Logika

    Logika Нерд

    Здравствуйте, использую среду Avr Studio 4 Led-Matrix с max7219. В микросхеме SPI мод. пытаюсь передать слово к устройстве но он молчит. Proteus показывает что данные уходят по SPI interfac - у, но результата нет. Думаю я допускаю ошибку при инициализации Matrix. Подскажите как мне решать проблему.

    Short code

    ..============================================================
    // задача вывести линию в цепочке матриц. Св.Диодная матрица 4 штук.
    //-----------------------------------------------
    #define F_CPU 8000000L
    #define CLK PB7 // Для такта
    #define ENB PB4 // Select
    #define MOSI PB5 // For trans. data

    init()
    //PORTB
    DDRB = (1<<ENB | 1<<MOSI | 1<<CLK); // setting SPI
    PORTB = (1<<ENB); // select chip = SS

    //SPI
    SPCR = (1<<SPE | 1<<MSTR | 1<<SPR1); // setting SPI

    while()

    // low - увеличивает Timer0 на прер. задер таймера 1ml sec TOP = 1000

    if (low >= TOP){
    if (count == 9) count = 1; // count строка в матрицах
    cli();
    low = 0; // обнуляем для счетчика

    PORTB &= ~(1<<ENB); // SS бросаем бит - выбираем все.


    for (unsigned int k = 0; k < 4; k++){ .// модуль матриц 4 в каждом модуле пишем слово.

    transmitSpi((char) count); // digit N перед. старший байт увел. до 8 (8 строк)
    transmitSpi(90); // data перед. любое число для вывода

    } // END FOR

    PORTB |= (1<<ENB); // поднять бит
    sei();
    count++;
    } // END IF

    void transmitSpi(char t){ // передать байт по SPI
    SPDR = t;
    while(!(SPSR & (1<<SPIF))) continue;
    }// END
     

    Вложения:

    • Proteus.png
      Proteus.png
      Размер файла:
      71,8 КБ
      Просмотров:
      20
    • Matr.JPG
      Matr.JPG
      Размер файла:
      36,6 КБ
      Просмотров:
      21
  2. Daniil

    Daniil Гуру

    Вставьте, пожалуйста, код как положено, чтобы его можно было читать.
    Как положено см. в закрепленной теме каждого раздела этого форума.
     
  3. Logika

    Logika Нерд

    Код (C++):
    ..============================================================
    // задача вывести линию в цепочке матриц. Св.Диодная матрица 4 штук.
    //-----------------------------------------------
    #define F_CPU 8000000L
    #define CLK PB7 // Для такта
    #define ENB PB4 // Select
    #define MOSI PB5 // For trans. data

    init()
    //PORTB
    DDRB = (1<<ENB | 1<<MOSI | 1<<CLK); // setting SPI
    PORTB = (1<<ENB); // select chip = SS

    //SPI
    SPCR = (1<<SPE | 1<<MSTR | 1<<SPR1); // setting SPI

    while()

    // low - увеличивает Timer0 на прер. задер таймера 1ml sec TOP = 1000

    if (low >= TOP){
    if (count == 9) count = 1; // count строка в матрицах
    cli();
    low = 0; // обнуляем для счетчика

    PORTB &= ~(1<<ENB); // SS бросаем бит - выбираем все.


    for (unsigned int k = 0; k < 4; k++){ .// модуль матриц 4 в каждом модуле пишем слово.

    transmitSpi((char) count); // digit N перед. старший байт увел. до 8 (8 строк)
    transmitSpi(90); // data перед. любое число для вывода

    } // END FOR

    PORTB |= (1<<ENB); // поднять бит
    sei();
    count++;
    } // END IF

    void transmitSpi(char t){ // передать байт по SPI
    SPDR = t;
    while(!(SPSR & (1<<SPIF))) continue;
    }// END
     
  4. Logika

    Logika Нерд

    Замечание принята, не знал что код можно форматировать на сайте.
     
  5. parovoZZ

    parovoZZ Гуру

    SPI MODE у матрицы какой? Проще всего на гитхабе найти библиотеку и там подсмотреть секцию инициализации.
     
  6. Logika

    Logika Нерд

    матрица только принимает данные, все модулы матрицы запарел. данные передается по одной лин/ во всех цепочке после этого поднимается SS. Матр. работает как Slave.
    Да я нашел разные коды но без резултата, не смог найти в секции иниц. что-то. Это типа выдишь козла? - нет - я тоже, но он есть.
     
  7. Logika

    Logika Нерд

    Когда включаю модуль загоряется все секции и так стоит.
     

    Вложения:

    • 000.JPG
      000.JPG
      Размер файла:
      17,9 КБ
      Просмотров:
      14
  8. parovoZZ

    parovoZZ Гуру

    я ещё раз спрашиваю - SPI mode у матрицы какой?
     
  9. Daniil

    Daniil Гуру

  10. Logika

    Logika Нерд

    Spi mode не смог найти в датишите, матрица использует микросхему Max7219. Думаю SPI 0 из этой таблицы, http://www.gaw.ru/html.cgi/txt/interface/spi/index.htm
    Спасибо за ссылку Daniil.

    микросхемы соединеный каскадно.
     
    Последнее редактирование: 17 май 2019 в 23:30
  11. Logika

    Logika Нерд

    Я нашел в dataSheet динюграмма режим работы SPI. Из таблицы этот режим как я понял SPI 0.
     

    Вложения:

  12. Daniil

    Daniil Гуру

    Я тоже так думаю, но я не знаю, чего хотел Паровоз. На всякий случай вот SPI ардуино + даташит, вы же биты настраиваете. Если режимы разные, то точно работать не будет.
    Я не готов лезть в даташит и смотреть биты, которые вы настраиваете.
     
    Logika нравится это.
  13. Logika

    Logika Нерд

    Спасибо.
     
  14. parovoZZ

    parovoZZ Гуру

    Под SPI 0 инициализируем так
    Код (C++):
     inline void SPI_Init(void)
    {
        //SPI_DDR |= (1<<MOSI_PIN) | (1<<SCK_PIN) | (0<<MISO_PIN);                // Все выводы, кроме MISO, выходы
         //SPI_PORT |= (0<<MOSI_PIN) | (0<<SCK_PIN) | (0<<MISO_PIN);
           
        SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0);        // Разрешение spi,старший бит вперед, мастер
        SPSR = (1<<SPI2X);                                // Удвоенная скорость тактирования
    }
     
    Logika нравится это.
  15. Logika

    Logika Нерд

    Вечером попробую и напишу ответ.
     
  16. Logika

    Logika Нерд

    Ничего получилось, у меня ошибка в инициализации матрицы а не SPI. Буду искать решение.
     
  17. Logika

    Logika Нерд

    Здравствуйте, displey заработал выводит данные - проблема в иниц. Max7219 как предполагал - но есть еще одна проблема
    если передам 0b10000001 => вывод будет такое 0b00000011 то есть двигает старший бит и вылезает на месте младшего бита.
    Буду рад помощи. Если кому-то интересно код то выложу.

    P.S. после того как выучил Datasheet Max7219 стало понятно как его инициализировать
     

    Вложения:

    • ScreenShot.png
      ScreenShot.png
      Размер файла:
      57 КБ
      Просмотров:
      8
  18. Logika

    Logika Нерд

    Я думаю для решении надо юзать бит DORD
     
  19. parovoZZ

    parovoZZ Гуру

    не понял - куда "передам" и где "вывод"? Можно же как-то с первого раза изъясняться так, чтобы было понятно?
     
  20. Logika

    Logika Нерд

    Это число в массиве (в микросхеме Atmega8515) 0b10000001 и питаюсь передать микросхему Max7219 а MAX7219 выводить на 8x8 display.
    Так вот вывод на матрице 0b00000011 - это строка в матрице. то есть где-то двигается бит на лева но не теряется вылезает с права.