First. Когда вы используете SPI на AVR ATmega в режиме master, вывод SS, хотя он не используется напрямую модулем SPI, должен быть всегда сконфигурированв противном случае высокий уровень на выводе переключит модуль SPI в подчиненный режим.Другими словами, если вы используете, например, ATmega328 (P), PB2 должен быть настроен как выход (бит DD2 в DDRB должен быть установлен).Рекомендуется подключить CS # SSD1306 к этому выводу.
Second .При подключении SSD1306 необходимо подключить 4 линии (см. Стр. 17 таблицы ): 1) SCLK - последовательные часы - подключите его к выводу SCK порта SPI (например, PB5 для ATmega328) 2)SDAT - последовательные данные - подключите его к выводу MOSI (PB3) 3) CS # - выбор микросхемы - подключите его к выводу SS (PB2) 4) D / # C - выбор данных / команды - подключите его к любому свободному выводу (как я полагаю, вы подключили его к PB0) Также модули могут иметь вход RESET, я думаю, что он подключен к PB1.
Итак, отправка байта данных или команды на SSD1306 должна выглядеть следующим образом:
PORTB &= ~(1 << CS); // pulling the CS# line low
PORTB |= (1 << D_C); // high for DATA
or
PORTB &= ~(1 << D_C); // low for COMMAND
SPDR = cData; // transmit the byte
while(!(SPSR & (1<<SPIF))) {} // wait the transmission to complete
PORTB |= (1 << CS); // pull the CS# line back high
CS # можно удерживать на низком уровне с помощью нескольких команд, не поднимаясь вверх.Это помогает определить ребра команды.
Третий .Команда 0xAF включит дисплей, но, вероятно, он ничего не покажет, потому что в нем нет данных, поэтому вы можете не видеть никакой разницы.Попытайтесь отправить команду 0xA5 сразу после этого, она осветит все пиксели - только для целей тестирования.
UPD Кроме того, там вы должны включить зарядный насос DC-DC(см. примечание по применению, стр. 62 в конце таблицы ).Это делается последовательностью из двух командных байтов 0x8D 0x14.Отправьте его перед включением дисплея (т.е. до 0xAF)