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

 
 
 
Reply to this topicStart new topic
> 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
GDI
сообщение Jan 16 2007, 12:25
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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

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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Msk
сообщение Jan 16 2007, 13:52
Сообщение #3





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



Цитата(GDI @ Jan 16 2007, 12:25) *
возможно надо так сделеать
PORTB |= (1 << PB2);//если хотим установить бит в порте, не трогая других
PORTB &= ~(1 << PB2);//если хотим снять бит в порте

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

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

Я к тому, что может кто знает какие особенности инициализации MAX7219, которые я не учел.. Потому как данный вариант кода работает без нареканий, если в качестве Slave выступает другой МК
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 16 2007, 14:30
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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



К стати в даташите на мегу8 есть пример на Си работы с SPI - там в ф-ции передачи нет строки Data = SPDR;

Сообщение отредактировал GDI - Jan 16 2007, 14:43


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 16 2007, 14:53
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Вот гляжу я в даташит на МАХ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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Msk
сообщение Jan 16 2007, 15:16
Сообщение #6





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



Спасибо, попробую, конечно.. Но все это как-то неочевидно, ясно же написано - данные в регистре защелкиваются по фронту LOAD, а не по CLK..

Насчет строки "Data = SPDR" - это я уже эксперименты ставил, от отчаяния..
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 16 2007, 15:40
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



согласен, что из написанного это не очевидно, но на тайминг-диаграмме все понятно нарисовано, хотя , скорее всего, это расшифровывается где-нибудь далее по тексту...


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Msk
сообщение Jan 16 2007, 17:38
Сообщение #8





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





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

Ладно, возмем бубен и начнем дальнейшие пляски smile.gif
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 16 2007, 18:38
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



тайминги проверь ... например данные нужно устанавливать не ранее чем через 50нс после того как сигнал CLK опустился в 0.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Msk
сообщение Jan 16 2007, 19:32
Сообщение #10





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



Это первым делом проверил, в анализаторе видно, что задержка достаточна..

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

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

Прошу прощения и еще раз спасибо )
Go to the top of the page
 
+Quote Post

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

 


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


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