реклама на сайте
подробности

 
 
> MAX7219, управление по SPI
Msk
сообщение Jan 16 2007, 10:42
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 16-01-07
Пользователь №: 24 465



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 молчит.

Подскажите, где лажа?
Спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.02515 секунд с 7
ELECTRONIX ©2004-2016