Я пытаюсь выполнить простую связь SPI на STM32 Discovery, используется HAL lib. Я пытаюсь отправить некоторые данные через SPI1 и получить те же данные через SPI3 (SPI1 = Full Duplex Master, SPI3 = Full Duplex Slave). Для передачи используется метод опроса, а для приема циклический DMA. Связь идет на 1 устройство (используется всего один Discovery). Код застрял здесь:
в то время как (HAL_SPI_GetState (& hspi3)! = HAL_SPI_STATE_READY) {}
Может кто-нибудь объяснить мне, почему код застрял там?
uint8_t rxSpi[10] = {0};
uint8_t txSpi[10] = "123456788";
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI1_Init();
MX_SPI3_Init();
MX_USART2_UART_Init();
if(HAL_SPI_Receive_DMA(&hspi3, rxSpi, 10) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
while (1)
{
if(HAL_SPI_Transmit(&hspi1, txSpi, 10, 100) != HAL_OK)
{
Error_Handler();
}
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
HAL_Delay(1000);
}
}
Если я просто отправляю данные (инициализация приема закомментирована), на логическом анализаторе я получаю это, в основном отсутствует небольшой интервал между двумя байтами.
Вы должны посмотреть документацию или код API. Если вы скажете SPI3 получить 10 байтов через DMA, состояние будет BUSY_RX, пока он не получит эти байты. Поэтому государство не готово.
циклон125
HAL_SPI_GetState()
и посмотреть, что на самом деле происходит. Кстати, почему вы ждетеHAL_SPI_STATE_READY
послеHAL_SPI_Receive_DMA()
? Ваш приемник SPI уже правильно инициализирован и готов, как вы уже проверялиif
ранееHAL_SPI_Receive_DMA()
.