STM32 і LCD через I2C

    
Для використання надалі знадобилося зв'язати, використовуючи I2C мікроконтролер STM32 з екраном 2004. Не знайшовши аналогічного рішення в мережі, публікую тут. Даний рецепт підійде також для екранів 1602. Далі під катом. (Обережно, картинки).
 
Іграшкова каса, куплена синові, виявилося з дефектом, і працювала через раз. З'явилася ідея переробити її нутрощі, і момент вибору мікроконтролера збігся з публікацією статті RaJa про STM32 [1 ]. Трохи прикинувши і порівнявши ціни: STM32 + LCD2004 + I2C = ArduinoMega (причина була в тому, що потрібно було реалізувати клавіатуру, динамік, пристрій введення штрих-коду і екран, тому кожен висновок мікроконтролера на рахунку) я вибрав перший набір.
 
Були зроблені покупки, і настав час очікування. Для прошивки купив ще USB-USART перехідник.
 Що і де купувалося.
     
  1. STM32F103C8T6

  2.  
  3. 2004 LCD HD44780 . Опинився без кирилиці. Звертайте увагу на дану особливість при пошуку, якщо потрібна російська мова на екрані.
  4.  
  5. IIC/I2C/TWI/SP I Serial Interface Board Module Port For Arduino 1602LCD Display За описом сумісний з 2004. Але думаю підійде будь-який аналогічний.
  6.  
  7. USB to UART TTL CP2012 для прошивки і налагодження. Можна скористатися і іншими підтримуваними способами прошивки і налагодження, але цей варіант найдешевший.
  8.  
 
Засоби для програмування, прошивки і налагодження, використовувані мною:
 
     
  1. EmBlocks .
  2.  
  3. прошівальщік з оригінального сайту: STM32 and STM8 Flash loader demonstrator .
  4.  
  5. Термінал для читання сигналів від MK через USB2UART: Terminal v1.91b . Але підійде і Putty (Connection-> Serial).
  6.  
Після отримання мікроконтролера спробував пограти з світлодіодами, вийшло. А потім були кілька годин спроб пов'язати екран з МК. Все це описувати нудно, спробую згадати граблі, на які напоровся.
 
Першим опишу підключення. Дивно, описуючи використання STM32 мало де малюють схеми, в основному код, сам здогадайся, що і як підключити.
Підключення зображена на фотографії (по кліку — крупніше).
 
Дане підключення актуально для STM32F103C8. Для інших плат МК перевірте Піни підключення I2C1 по даташіту.
USART перехідник в USB. Тут зрозуміло. Далі — USART підключаємо до STM32 до виведеному близько роз'єму miniUSB USART1. TX до RX і відповідно RX до TX. У мене на USART є висновок 3v3, я від нього і живити МК. Землю я підключив окремо, для зручного її відключення під час перемикання режимів прошивки і роботи. До екрану я припаяв I2C (так само на ebay є екрани з припаяними I2C). Харчування для I2C і екрану береться від 3v3 МК або 5В від USART. Нижче написав про настройку контрасту при різному напрузі харчуванні. Далі: SCL від I2C підключається до PB6, SDA від I2C до PB7. Притягувати SCL і SDA до харчування при використанні одного даного пристрою немає необхідності.
 
Першими граблями був USART. Його я використовував для налагодження, у наведеному тут коді рядка роботи з ним закоментовані. Але з ним проблему так і не вирішив. Таке враження, що немає синхронізації між комп'ютером і мікроконтролером до посилки першого символу. Причому якщо використовувати код з прикладу [4 ] — то МК прекрасно дублює одержуваний текст, а сам писати не може. Я домігся найбільш прийнятного для налагодження виведення рядків, додавши Delay (500) після кожного символу.
 
Потім спробував реалізувати роботу з I2C. Взяв код з прикладу [3 ], звернув увагу на коментарі про підвисання МК, проаналізувавши вихідні коди, побачив що як і автору коментарів, мені необхідний зсув адреси пристрою вліво:
 
 
//http://microtechnics.ru/stm32-ispolzovanie-i2c/#comment-8109
I2C_Send7bitAddress(I2Cx, slaveAddress<<1, transmissionDirection);

Вставив код і спробував запустити. Програма повисала на моменті очікування звільнення шини:
 
 
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

Тут граблі в адресі I2C пристрою. Судячи з опису продавця, у мене була адреса 0x20. Ось тут я і втратив 15 хвилин даремно, але вчитавшись в опис різних моделей I2C перехідників, посилання [6 ] на яке навів у своїй статті [5 ] romanvl , звернув увагу на останню модель і спробував поміняти адресу на 0x27. Все запрацювало. Висновок такий: якщо у Вас на переходнике запаяні A0 A1 A2 — адреса 0x20, що не запаяні — 0x27.
Порівняйте:
      
Далі — екран. Виявилося, що він чудово працює і від 3.3 Вольт, як і перехідник I2C (в даташіте мікросхеми перехідника — від 2.5 до 6 В). Але спочатку я його перевіряв від 5В. І контраст був викручені на максимум. У підсумку в результаті запуску програми екран був повністю заповнений. Я засмутився і продовжив колупати код. Але через півгодини прокинувся і підбіг винуватець розробки, я йому показав екран і випадково побачив під кутом збоку, що там щось написано. Причиною цьому є неправильне регулювання контрасту. (Вибачте, якщо описав тут очевидні речі, може знайдуться такі ж, хто цього не знав.)
 Нічого не видно
 Те ж саме, але під кутом
 
При 5В харчування контраст потрібно трохи зменшити. А при 3.3В поставити на максимум, на налаштуванні від 5В нічого не видно. Результат представлений на першій картинці в пості. Мій виявився без російської мови, я це побачив, перегорнувши символи. Спробував намалювати пляму, не знаючи, що максимум можна визначити 8 своїх символів, написав для ляпки 12. Підібрав схожі з китайських, ніби вийшло.
 
Код представлений на гіхабе, так як для досягнення результату переписав бібліотеку від Ардуін: STM32_LCD_I2C .
 
Використані матеріали:
 
     
  1. Причина вибору мікроконтролера: STM32 vs Arduino .
  2.  
  3. Звідси взяв реалізацію Delay: STM32 I2C EEPROM 24СXX .
  4.  
  5. Cтатья про I2C STM32. Використання I2C. microtechnics.ru/stm32-ispolzovanie-i2c / . Тут же коментар про зсув, без якого я б напевно так само зловив граблі що й обговорюють.
  6.  
  7. Приклад роботи з USART STM32. USART. Частина 4 — Фінал .
  8.  
  9. Зменшуємо кількість проводів в Arduino — I2C LCD екран і RTC годинник по двох проводах .
  10.  
  11. LCD Displays (Blue and YELLOW) with I2C/TWI Interface .
  12.  
  13. Для розуміння логіки роботи STM32 із зовнішніми пристроями Керівництво до швидкого старту по роботі з периферією STM32F10x .
  14.  
Спасибі за увагу.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.