Моя система состоит из платы 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.
Спасибо.