Очистка буфера 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 во время ожидания приведёт к полной переинициализации отправляемых данных.