Це щось на кшталт блогу, в якому я буду описувати свій досвід (необов'язково вдалий) по різних питаннях

Звіт по невдалій спробі перепрошити мікроконтролер Stm32 через інтерфейс SPI.

 Прелюдія

Одного разу, через певні обставини в мене з'явився модуль FT2232H Mini module.

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 дає нам інформацію про схему підключення

Spi bootloader connection

Tакож в цьому документі даються параметри SPI для конкретних моделей, в яких системний завантажувач підтримує роботу по SPI. З того, що я переглядав, ці параметри однакові для всіх моделей: Режим Slave, full duplex, 8-bit MSB, швидкість до 8 МГц, полярність CPOL = 0, CPHA = 0, апаратний NSS.

В AN4286 вже описуються самі команди, які передаються через SPI.

Весь процес взаємодії між хостом і мікроконтролером починається з того, що хост надсилає байт синхронізації (0x5A) і очікує отримати від мікроконтролера підтвердження (ACK). На шині SPI це має виглядати наступним чином

 Spi bootloader sync frame

Мої експерименти виконувались наступним чином. На платі я поставив джампер, щоб при старті мікроконтролера запускався системний завантажувач. Після цього з PC запускав по SPI послідовність байтів 0x5A 0x00 0xXX 0x79 і спостергав результати аналізатором, сподіваючись отримати відповідь як описано в протоколі. Але правильною вдавалося отримати реакцію тільки на SYNC байт.

LA bootloader spi

Я перепробував багато різних способів: додавав часовий проміжок після першого байту, змінював швидкість SPI, змінював канали SPI на демо платі і на платі FT2232H, міняв демо плати, підключав pull-down резистори. Часом це давало певні зміни, але загалом результат був тойже - правильна відповідь на SYNC байт, а потім якась єрунда. 

Підсумки

Поки що ідея не вигорає, і навіть не зрозуміло причини. Можливо трохи згодом з'ясую.