Звіт по невдалій спробі перепрошити мікроконтролер Stm32 через інтерфейс SPI.
Прелюдія
Одного разу, через певні обставини в мене з'явився модуль FT2232H Mini module.
Цей модуль можна використовувати як USB-адаптер для послідовних інтерфейсів, таких як UART, SPI, I2C, JTAG.
Власне проект, для котрого я придбав цей модуль, не пішов, але в мене виникла ідея: спробувати перепрошити мікроконтролер Stm32 по інтерфейсу SPI, використовуючи системний завантажувач.
До роботи
Для початку вирішив написати програму під Windows на Delphi.
На сайті компанії FTDI можна знайти бібліотеки для роботи з мікросхемою FT2232H, а також керівництва по роботі з ними і приклади. Я вирішив піти простим шляхом і використати бібліотеку Ftcspi.dll. Вона вважається застарілою і такою, що не рекомендується для використання, але для неї є приклади на Delphi. Як виявилось згодом, вибір був невдалим і ця бібліотека принципово не годилася для реалізації моєї мети, але для початкових досліджень її достатньо.
Я написам простеньку программу, за допомогою якої можна була відправляти і отримувати дані по SPI, і почав досліджувати логічним аналазітор результати її роботи на шині SPI. Було виявлено наступне
Недоліки бібліотеки Ftcspi.dll
- Не вдається працювати в режимі CPHA = 1.
- Відсутня можливість працювати у режимі full duplex. (Він ніяк не передбачений у функціях бібліотеки).
Синхронізація з системним завантажувачем Stm32
Відсутність режима full duplex робить неможливим використання бібліотеки Ftcspi.dll для перепрошивки мікроконтролерів Stm32. Але я вирішив тимчасово скористатися нею, щоб аналізатором подивитися процес синхронізації з системним завантажувачем.
Піддослідною була плата Nucleo64-F401RE. Вона через макетну плату була підключена до модуля FT2232H. До цієї ж макетної плати було також підключено аналізатор логіки від Saleae.
Процес перепрошивки мікроконтроллерів Stm32 по протоколу SPI описано в двох документах від компанії STM.
1. AN2606 STM32 microcontroller system memory boot mode
2. AN4286 SPI protocol used in the STM32 bootloader
AN2606 дає нам інформацію про схему підключення
Tакож в цьому документі даються параметри SPI для конкретних моделей, в яких системний завантажувач підтримує роботу по SPI. З того, що я переглядав, ці параметри однакові для всіх моделей: Режим Slave, full duplex, 8-bit MSB, швидкість до 8 МГц, полярність CPOL = 0, CPHA = 0, апаратний NSS.
В AN4286 вже описуються самі команди, які передаються через SPI.
Весь процес взаємодії між хостом і мікроконтролером починається з того, що хост надсилає байт синхронізації (0x5A) і очікує отримати від мікроконтролера підтвердження (ACK). На шині SPI це має виглядати наступним чином
Мої експерименти виконувались наступним чином. На платі я поставив джампер, щоб при старті мікроконтролера запускався системний завантажувач. Після цього з PC запускав по SPI послідовність байтів 0x5A 0x00 0xXX 0x79 і спостергав результати аналізатором, сподіваючись отримати відповідь як описано в протоколі. Але правильною вдавалося отримати реакцію тільки на SYNC байт.
Я перепробував багато різних способів: додавав часовий проміжок після першого байту, змінював швидкість SPI, змінював канали SPI на демо платі і на платі FT2232H, міняв демо плати, підключав pull-down резистори. Часом це давало певні зміни, але загалом результат був тойже - правильна відповідь на SYNC байт, а потім якась єрунда.
Підсумки
Поки що ідея не вигорає, і навіть не зрозуміло причини. Можливо трохи згодом з'ясую.