Підключення монохромного дисплея на ST7565 до STM32

Попался мне в руки SafeTouch , вещь для меня бесполезная , но товарищ который притащил его , уверял что подрубил другой такой же к китайскому "Тестеру компонентов".

Только всё отображается зеркально.
Разобрав дисплей наткнулся на на 32 битный микроконтроллер atmel , мк для меня оказался бесполезным . т.к. построен он был не на cortex , а изучить 1 мк , который никогда больше не используешь , мне показалось глупостью. И тут я совершил фатальную ошибку , решил снять микроконтроллер используя паяльный фен. Дисплей был перегрет , и в некоторых местах появились пятна.
Сняв мк , и поняв что я тот ещё рукожоп . Принялся искать документацию на китайский "Тестер компонентов" , найдя нужную документацию и узнав что в дисплее стоит контроллер ST7565.

Я решил проверить не сдох ли дисплей . подрубил к ардуино нашёл библиотеку . Загрузил код , и на дисплее появилось .

Отлично, дисплей жив.
Т.к. дуни уже давно стали у меня только средством проверки разных модулей, то нужно перетащить дисплей на мк , которые я использую повсеместно , а именно STM32F103C8 .
Немного порывшись в интернете , конкретно под мой случай , я ни черта не нашёл. Вернее , даже под другие микроконтроллеры мало кто подрубает дисплеи ST7565 , возможно это связанно с ценой , т.к. на али они стоят зачастую дороже своих цветных собратьев.
Но всё же несколько примеров было . А т.к. "My English is very bad" , то как исходником я воспользовался статьей https://cxem.net/mc/mc162.php "Подключение LCD-дисплея ST7565 к микроконтроллеру MSP430" 

Я в глаза не видел микроконтроллеры MSP, но исходный код всё же глянул. Т.к. раньше я программировал avr , то было не трудно понять исходный код 

#define LCDPORT P1OUT
#define GND BIT0
#define VCC BIT1
#define A0    BIT2
#define CS   BIT3
#define SCK BIT4
#define SDA BIT5
#define RST BIT6
void main(void) {
   WDTCTL = WDTPW + WDTHOLD;   // Stop WDT
   P1DIR = 0xFF;
   LCDPORT &= ~GND;
   LCDPORT |= VCC;
   LCDPORT &= ~RST;
   __delay_cycles(1000);
   LCDPORT |= RST;
   LCDPORT &=~A0;
   LCDPORT &=~CS;
   doSPI(CMD_SET_BIAS_7);
   doSPI(CMD_SET_ADC_NORMAL);
   doSPI(CMD_SET_COM_NORMAL);
   doSPI(CMD_SET_DISP_START_LINE);
   doSPI(CMD_SET_POWER_CONTROL | 0x4 );
   __delay_cycles(1000);
   doSPI(CMD_SET_POWER_CONTROL | 0x7);
   __delay_cycles(1000);

немного изменив его я получил

 lcd_reset();
   lcd_dc(0);
   HAL_Delay(1);
   doSPI(CMD_SET_BIAS_9);
   doSPI(CMD_SET_ADC_REVERSE);
   doSPI(CMD_SET_COM_NORMAL);
   doSPI(CMD_SET_DISP_START_LINE);
   doSPI(CMD_SET_POWER_CONTROL | 0x4 );
   HAL_Delay(1);
   doSPI(CMD_SET_POWER_CONTROL | 0x7);
   HAL_Delay(1);

   doSPI(CMD_DISPLAY_ON);
   doSPI(CMD_SET_ALLPTS_NORMAL);

Как видите в принципе я ничего не изменил , только __delay_cycles(1000); на HAL_Delay(1); , и LCDPORT &= ~RST;  LCDPORT |= RST; на lcd_reset(); , и  LCDPORT &=~A0; на lcd_dc(0); . А LCDPORT &=~CS;  поставил на аппаратное передёргивание .
В целом , перекопировал всё из исходника в свой проект , немного изменил. 

Теперь время настроить сам проект. Открываем куб и настраиваем там нужный spi и выводы reset , dc , cs. У STM32F103C8 2SPI , я выбрал 1,  но заменить его на 2 не составит труда.

Частоту установил на 72МГц , но изначально проверял на 8. 

Я использую TrueStudio , спасибо компании ST , за то что выкупила её и модифицирует под свои камни.

Вот  изменённая функция передачи данных , благодаря библиотеке HAl , можно спокойно перенести на 2 SPI если предварительно настроить в кубе SPI2 , то в коде нужно будет заменить HAL_SPI_Transmit(&hspi1,(uint8_t*)aTxBuffer, 1, 5000); на HAL_SPI_Transmit(&hspi2,(uint8_t*)aTxBuffer, 1, 5000);

  1. void doSPI(uint8_t d)
    {
    
       aTxBuffer[0]=d;
    
       HAL_SPI_Transmit(&hspi1,(uint8_t*)aTxBuffer, 1, 5000);
    HAL_Delay(1);
       }

Собственно всё , загружаю код и вижу :

Зеркальность, ну хотя бы загрузился и прошёл инициализацию. Спасибо А.Касьянову , он в своём проекте всё предусмотрел.
замена строчки
doSPI(CMD_SET_ADC_NORMAL);

на
doSPI(CMD_SET_ADC_REVERSE);

Убрало зеркальное отображение.

Собственно и всё . На фото видно как я повредил дисплей перегревом. Неравномерная яркость пикселей . и пару белых пятен.
Исходный проект в CubeMX и TrueStudio прилагаю.

Прикрепленные файлы:

Top