Чтение сообщений переменной длины через SPI с использованием API низкого уровня (LL) на STM32 MCU - PullRequest
0 голосов
/ 30 мая 2018

Моя система состоит из платы STM32NUCLEO и подчиненного устройства, подключенного через SPI.Подчиненное устройство отправляет команды с переменной длиной: возможная длина составляет 4, 8, 10, 14 бит.

Я пытаюсь обнаружить эти сообщения на моей плате ядра с использованием LL API и прерываний.

Решение, над которым я сейчас работаю, основано на установке SPI с шириной данных 4 бита ( SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT ), а затем подсчете количества слов (1 слово = 4биты), которые я получаю.Таким образом, если я получаю 1 слово, это означает, что я получил 4-битную команду, 2 word -> 8-битную команду.Если я получу 3 слова, это должно означать, что я получил 10-битную команду (2 бита должны быть отброшены) и т. Д.

К сожалению, я заметил, что API LL предоставляют функции только для чтения 8 битили 16 бит за раз, и в настоящее время у меня возникают проблемы с получением 4-битной команды, так как функция LL_SPI_ReceiveData8 ожидает получения 8 бит.

Вот моя реализация для обработчика IRQи для обратного вызова:

Обработчик IRQ:

void SPI1_IRQHandler(void)
{
  /* Check RXNE flag value in ISR register */
  if(LL_SPI_IsActiveFlag_RXNE(SPI1))
  {
    /* Call function Slave Reception Callback */
    SPI1_Rx_Callback();
  }
  /* Check STOP flag value in ISR register */
  else if(LL_SPI_IsActiveFlag_OVR(SPI1))
  {
    /* Call Error function */
    SPI1_TransferError_Callback();
  }
}

Обратный вызов

void SPI1_Rx_Callback(void)
{
  /* Read character in Data register.
  RXNE flag is cleared by reading data in DR register */
  aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);
}

Как сказано ранее в моемПо-моему, проблема в том, что я использую функцию LL_SPI_ReceiveData8 для чтения, поскольку я не могу найти что-то вроде LL_SPI_ReceiveData4 .

У вас есть предложения?

Кроме того, возможно ли настроить SPI на использование 2-битной пропускной способности вместо 4?Что-то вроде SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_2BIT : таким образом, должно быть легче определять команды, так как 4, 8, 10 и 14 кратны 2.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

С новой информацией об используемом контроллере:

Поддерживается длина передачи данных SPI от 4 до 16 бит.Так что ваша первая попытка кажется не такой уж плохой.

Ваша "проблема" в том, что нет функции чтения из 4 битов.Это вызвано тем, что регистр принимаемых данных всегда будет содержать 16 бит, но в вашем случае только 4 битные действительные данные.остальные биты равны '0'.

Ваша функция обратного вызова

aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);

будет записывать значения от 0..15 в aRxBuffer, и вам не нужен ReceiveData4 () чтобы получить ответ: -)

Так же справочное руководство для серии STM32L4 Справочное руководство на стр. 1193 и далее.

0 голосов
/ 30 мая 2018

Минимальный доступный блок данных - это байт.Таким образом, даже если вы получите 4 бита, значение чтения будет 8 бит.

Кстати, что это за секретное ведомое устройство с переменной длиной слова?

...