====== Очистка буфера FIFO передатчика SPI в режиме Slave ====== При работе с блоком SPI в режиме ведомого иногда требуется, чтобы передача данных мастеру велась сразу с заданных слов, не допуская при этом отправки ранее загруженных в FIFO данных. Для этого необходимо очистить буфер FIFO передатчика, что, как оказалось, сделать не так уж и просто. Было найдено два варианта очистки буфера FIFO передатчика в МК серии 1986ВЕ9х. **Первый вариант** был получен от «Технической поддержки»: Очистить буфер FIFO передатчика можно, отправив все данные наружу, после будет выставлен флаг опустошения FIFO - SR.TFE. SPI в режиме мастер может самостоятельно опустошить FIFO фактом выдачи всех данных. В режиме Slave такой возможности нет, т.к. передача инициируется снаружи - внешним мастером. Поэтому в обоих режимах для очистки буфера FIFO передатчика необходимо: 1. Отключить SPI от линии (перенастроить порты GPIO, чтобы данные не выводились в линию). 2. Установить SPI в режиме мастера и разрешить работу приёмопередатчика (регистр CR1, MS=0, SSE=1). 3. Дождавшись опустошения буфера (бит TFE = 1 в регистре SR, а также бит BSY = 0 - модуль закончил передачу) вернуть настройки в исходное состояние. **Второй вариант** был найден на просторах интернета и по заверениям, может очистить буфер передатчика с использованием вот этой функции: void SSP_FIFOTX_Clear(MDR_SSP_TypeDef* SSPx) { typedef struct { __IO uint32_t SSPCR; __IO uint32_t SSPIP; __IO uint32_t SSPOP; __IO uint32_t SSPDR; } SSPHACK_TypeDef; uint16_t tmp; SSPHACK_TypeDef* SSPHACKx; SSPHACKx = (SSPHACK_TypeDef*) ((uint32_t)SSPx + 0x80); SSPHACKx->SSPCR = 0x2; while((SSPx->SR&0x1) == 0) tmp = SSPHACKx->SSPDR; SSPHACKx->SSPCR = 0x0; } Очистка буфера передатчика действительно осуществляется, при этом приёмопередатчик может быть выключен. Данные из буфера FIFO передатчика загружаются в сдвиговый регистр в момент начала передачи сообщения (FSS=0), поэтому очистка FIFO во время ожидания приведёт к полной переинициализации отправляемых данных.