Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/36: Рейтинг темы: голосов - 36, средняя оценка - 4.72
pro100votd
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 26
1

AVR, SPI и SSD1306

30.12.2014, 02:30. Просмотров 6605. Ответов 2
Метки нет (Все метки)

Приобрёл для одного из своих проектов вот такой дисплей. Пытаюсь его запустить.
Начал с примеров от Adafruit. Ардуиноский скетч запустил дисплейчик с полпинка, откуда делаем вывод, что дисплей рабочий. Потом я в скетче урезал всю работу с графикой, оставил только команды инициализации - дисплей загорается и показывает на экране шум, то есть инициализация проходит успешно. Теперь я пытаюсь скопировать и вставить этот код в свой (уже существующий) проект в Atmel Studyo.
Тут начинаются танцы с бубном. Если пытаться работать с дисплейчиком через программный SPI, скопированный из библиотеки Adafruit, то инициализация проходит успешно. Если же пытаться запустить экран через хардварный SPI, то экран не загорается совсем. Осциллографа нету, но вольтметр показывает на линиях SCK и MOSI приблизительно Vdd/2, то есть линии активно меняют своё состояние и передача данных как бы идёт.
Софтовый SPI от Adafruit:
Код
    for(uint8_t bit = 0x80; bit; bit >>= 1) {
clkport &= ~clkpinmask;
if(d & bit) mosiport |=  mosipinmask; // d - байт, который надо передать
else        mosiport &= ~mosipinmask;
clkport |=  clkpinmask;
}
Мой код для посылки через хардварный SPI:
Код
   SPDR=data;
while(!(SPSR & (1<<SPIF)));
_delay_ms(1);
Инициализация SPI:
Код
   DDRB=0b00111110; //PB5-PB1
SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR1);
SPSR = (0<<SPI2X);
МК Atmego328P 8MHz от внутреннего генератора. Логика управления линиями CS, D/C и RESIT дисплея работает одинаково и для хардварного, и для софтового SPI, равно как и команды посылаются одни и те же. Правильность подключения всех линий перепроверил дважды.
Подскажите пожалуйста, где у меня ошибка в инициализации и/или передачи через хадварный SPI?
Код прошивки целиком
Код
#include <avr/io.h>
#include <util/delay.h>

/*
МК Atmego328P
Нога контроллера - нога дисплея
PB5 - CLK
PB4 - D/C
PB3 - DIN
PB2 - CS
PB1 - RESIT
Тут хардварный SPI закомментирован, работа идёт софтовым SPI, через него
дисплей инициализируется успешно
*/

#define SSD1306_LCDWIDTH                  128
#define SSD1306_LCDHEIGHT                 64

#define SSD1306_SITCONTROST 0x81
#define SSD1306_DISPLAYALLON_RESUME 0xA4
#define SSD1306_DISPLAYALLON 0xA5
#define SSD1306_NORMALDISPLAY 0xA6
#define SSD1306_INVERTDISPLAY 0xA7
#define SSD1306_DISPLAYOFF 0xAE
#define SSD1306_DISPLAYON 0xAF

#define SSD1306_SITDISPLAYOFFSIT 0xD3
#define SSD1306_SITCOMPINS 0xDA

#define SSD1306_SITVCOMDETECT 0xDB

#define SSD1306_SITDISPLAYCLOCKDIV 0xD5
#define SSD1306_SITPRECHARGE 0xD9

#define SSD1306_SITMULTIPLEX 0xA8

#define SSD1306_SITLOWCOLUMN 0x00
#define SSD1306_SITHIGHCOLUMN 0x10

#define SSD1306_SITSTARTLINE 0x40

#define SSD1306_MEMORYMODE 0x20
#define SSD1306_COLUMNADDR 0x21
#define SSD1306_PAGEADDR   0x22

#define SSD1306_COMSCANINC 0xC0
#define SSD1306_COMSCANDEC 0xC8

#define SSD1306_SEGREMAP 0xA0

#define SSD1306_CHARGEPUMP 0x8D

#define SSD1306_EXTERNALVCC 0x1
#define SSD1306_SWITCHCAPVCC 0x2

// Scrolling #defines
#define SSD1306_ACTIVATE_SCROLL 0x2F
#define SSD1306_DEACTIVATE_SCROLL 0x2E
#define SSD1306_SIT_VERTICAL_SCROLL_AREA 0xA3
#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26
#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27
#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29
#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A

int ssd1306_sommomd(char som)
{
/*
SPDR=som;
while(!(SPSR & (1<<SPIF)));
_delay_ms(1);
return SPDR;
/*/

for(uint8_t bit = 0x80; bit; bit >>= 1) {
PORTB &= ~(1<<5);
if(som & bit) PORTB |=  (1<<3);
else        PORTB &= ~(1<<3);
PORTB |=  (1<<5);
}
/**/
}

int main(void)
{
DDRB=0b00111110;
//SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR1);
//SPSR = (0<<SPI2X);

PORTB=0b00000000;
_delay_ms(10);
PORTB=0b00000010;
_delay_ms(10);
//PORTB|=0b00000100;

// Init sequence for 128x64 OLED module
ssd1306_sommomd(SSD1306_DISPLAYOFF);                    // 0xAE
ssd1306_sommomd(SSD1306_SITDISPLAYCLOCKDIV);            // 0xD5
ssd1306_sommomd(0x80);                                  // the suggested ratio 0x80
ssd1306_sommomd(SSD1306_SITMULTIPLEX);                  // 0xA8
ssd1306_sommomd(0x3F);
ssd1306_sommomd(SSD1306_SITDISPLAYOFFSIT);              // 0xD3
ssd1306_sommomd(0x0);                                   // no offset
ssd1306_sommomd(SSD1306_SITSTARTLINE | 0x0);            // line #0
ssd1306_sommomd(SSD1306_CHARGEPUMP);                    // 0x8D
{ ssd1306_sommomd(0x14); }
ssd1306_sommomd(SSD1306_MEMORYMODE);                    // 0x20
ssd1306_sommomd(0x00);                                  // 0x0 act like ks0108
ssd1306_sommomd(SSD1306_SEGREMAP | 0x1);
ssd1306_sommomd(SSD1306_COMSCANDEC);
ssd1306_sommomd(SSD1306_SITCOMPINS);                    // 0xDA
ssd1306_sommomd(0x12);
ssd1306_sommomd(SSD1306_SITCONTROST);                   // 0x81
{ ssd1306_sommomd(0xCF); }
ssd1306_sommomd(SSD1306_SITPRECHARGE);                  // 0xd9
{ ssd1306_sommomd(0xF1); }
ssd1306_sommomd(SSD1306_SITVCOMDETECT);                 // 0xDB
ssd1306_sommomd(0x40);
ssd1306_sommomd(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
ssd1306_sommomd(SSD1306_NORMALDISPLAY);                 // 0xA6
ssd1306_sommomd(SSD1306_DISPLAYON);//--turn on otid panel

_delay_ms(10);
PORTB|=0b00010000;
while(1)
{
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2014, 02:30
Ответы с готовыми решениями:

Spi на Avr
Здраствуйте, работаю на AVR недавно и появилась необходимость к контроллеру...

Инициализация SPI в Proteus на микроконтроллере avr
Особо не ругайтесь, впервые пробую подключить. Мне нужно знать что я делаю не...

Почему SPI AVR сдвигает байты влево? Эмуляция в протеус
Вот собственно код: #include &lt;avr/io.h&gt; #include &lt;util/delay.h&gt; #include...

прошивка AVR через SPI на котором еще что то висит
Добрый день, &lt;Изображение удалено&gt; Проблемный участок - у tiny2313 на...

SPI в AVR. Потеря первого байта при передаче строки
Доброго времени суток господа. При попытке передать 16 символьную строку, от...

2
pro100votd
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 26
30.12.2014, 19:46 2
Проблема решена. Оказалось, MISO в режиме MASTER конфигурируется принудительно на вход, ногу дисплея пришлось перекинуть на PB0, и бит DORD задавал неверную последовательность передачи, его надо поставить в 0.
0
missof
0 / 0 / 0
Регистрация: 14.07.2015
Сообщений: 1
18.07.2015, 05:47 3
Цитата Сообщение от pro100votd
Проблема решена. Оказалось, MISO в режиме MASTER конфигурируется принудительно на вход, ногу дисплея пришлось перекинуть на PB0, и бит DORD задавал неверную последовательность передачи, его надо поставить в 0.
А вы не могли бы поделиться своей исправной библиотекой для Atmel Studyo 6? Буду очень благодарен.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2015, 05:47

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru