Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MAX7219
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Msk
Atmega8, частота 500 кГц, аппаратный SPI, драйвер светодиодов MAX7219ENG, подключены линии MOSI, SCK, -SS, режим SPI - 0, прерывания не используются.
Код (IAR):
Код
void Init_Master (void)
{
        volatile char IOReg;
        // set PB2(/SS), PB3(MOSI), PB5(SCK) as output
        DDRB    = (1<<PB2)|(1<<PB3)|(1<<PB5);
        PORTB = (1 << PB2);        
        // enable SPI in Master Mode with SCK = CK/4
        SPCR    = (1<<SPE)|(1<<MSTR);
        IOReg   = SPSR;                     // clear SPIF bit in SPSR А зачем вообще его
        IOReg   = SPDR;                     // сбрасывать, если я не использую прерывания?
}

/********************************/

void Master_Send (unsigned char Data)
{
                SPDR  = Data;          // send Character
                while (!(SPSR & (1<<SPIF)));    // wait until Char is sent
                Data   = SPDR;
}

/********************************/

int main (void)
{
        Init_Master ();        // Initialization (polling)
        while (1)
       {
        PORTB = (0 << 2);  
        Master_Send (0x0f);   //команда "тест"
        Master_Send (0x01);
        PORTB = (1 << 2);
        delay_ms(750);
        PORTB = (0 << 2);
        Master_Send (0x0f);   //закончить тест
        Master_Send (0x00);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x09); //выключить декодирование
        Master_Send (0x00);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x0a);   //яркость - на максимум
        Master_Send (0xff);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x0b); //сканируем только 6 разрядов
        Master_Send (0x05);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x01); //зажигаем 2-ю и 6-ю лампочку в первом октете
        Master_Send (0x22);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x02);  // ... 1-ю и 5-ю во втором
        Master_Send (0x11);
        PORTB = (1 << 2);
        delay_ms(250);
        PORTB = (0 << 2);
        Master_Send (0x03);  // все в третьем
        Master_Send (0xff);
        PORTB = (1 << 2);

        delay_ms(750);
                  }      
      }

/*********************************/

Результат:
Тест светодиодов работает, команда 0x0f01 зажигает всю линейку на максимальной яркости и 0x0f00 гасит ее, на остальные команды реакции нет.

Картинка на выводах вроде идеальная: приведена для 0x0f01, но для остальных тоже красивая




Вопрос - почему не работают другие команды?

В даташите на MAX (объединенном на 7219 и 7221) указано, что отличие 7221 от 7219 в наличии полноценной поддержки SPI. То есть в 7219 SPI урезан? Интересно, в чем? может быть в этом :
Цитата
For the MAX7219, serial data at DIN, sent in 16-bit
packets, is shifted into the internal 16-bit shift register
with each rising edge of CLK regardless of the state of
LOAD.

Пробовал я этот LOAD не выключать после команды - вообще тогда MAX молчит.

Подскажите, где лажа?
Спасибо.
GDI
возможно надо так сделеать
PORTB |= (1 << PB2);//если хотим установить бит в порте, не трогая других
PORTB &= ~(1 << PB2);//если хотим снять бит в порте

и еще:
Data = SPDR;
эта строчка не нужна в ф-ции MasterSend у вас же линия MISO не подключена, если я правильно понял..
Msk
Цитата(GDI @ Jan 16 2007, 12:25) *
возможно надо так сделеать
PORTB |= (1 << PB2);//если хотим установить бит в порте, не трогая других
PORTB &= ~(1 << PB2);//если хотим снять бит в порте

Это понятно, вообще так и делаю, просто в данном конкретном случае разницы нет..
Цитата
Data = SPDR;
эта строчка не нужна в ф-ции MasterSend у вас же линия MISO не подключена, если я правильно понял..

Эта строчка вкупе с предыдущей сбрасывает флаг прерывания SPIF, опять же разницы не замечено..

Я к тому, что может кто знает какие особенности инициализации MAX7219, которые я не учел.. Потому как данный вариант кода работает без нареканий, если в качестве Slave выступает другой МК
GDI
режим SPI проверь, апноты почитай... тест же работает.. может команды не правильно подаешь...
направление (бит DORD) правильно установлено? Осциллограмму надо бы привести той комманды, которая не работает.



К стати в даташите на мегу8 есть пример на Си работы с SPI - там в ф-ции передачи нет строки Data = SPDR;
GDI
Вот гляжу я в даташит на МАХ7219 и вижу:
1. входа CS там нету, а есть LOAD
2. читаю описание ноги LOAD: Load-Data Input. The last 16 bits of serial data are latched on LOAD’s rising edge.
что означает, что данные защелкиваются по нарастанию сигнала LOAD
3. смотрю диаграмму на figure 1. и вижу, что при высоком уровне на LOAD нужен еще один CLK, что в аппаратном SPI, естественно, не реализовано.
Отсюда вывод, что надо программно добавить еще один перепад на линии CLK при высоком уровне на LOAD
Msk
Спасибо, попробую, конечно.. Но все это как-то неочевидно, ясно же написано - данные в регистре защелкиваются по фронту LOAD, а не по CLK..

Насчет строки "Data = SPDR" - это я уже эксперименты ставил, от отчаяния..
GDI
согласен, что из написанного это не очевидно, но на тайминг-диаграмме все понятно нарисовано, хотя , скорее всего, это расшифровывается где-нибудь далее по тексту...
Msk


Увы, эксперимент не удался.. (

Ладно, возмем бубен и начнем дальнейшие пляски smile.gif
GDI
тайминги проверь ... например данные нужно устанавливать не ранее чем через 50нс после того как сигнал CLK опустился в 0.
Msk
Это первым делом проверил, в анализаторе видно, что задержка достаточна..

Спасибо за желание помочь, нашел я баг smile.gif

И ведь излазил даташит вдоль и поперек, и раздел стартовой инициализации несколько раз прочитал, а вот вывести из "сна" драйвер командой 0x0c01 почему-то посчитал лишним.. Глаз замылился

Прошу прощения и еще раз спасибо )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.