#stm32 #microcontroller #cortex-m #stm32f4discovery #stm32f4
#stm32 #микроконтроллер #cortex-m #обнаружение stm32f4 #stm32f4
Вопрос:
Я пытаюсь выполнить обратный цикл в SPI в STM32F411RE, используя библиотеку HAL STM32. Выходные данные в последовательном терминале искажены (только поля) Я подключил контакты MOSI, MISO микроконтроллера. Может кто-нибудь помочь мне указать на проблему. Спасибо:).
void SPI_call()
{
int i = 0, size = 3;
uint8_t tx_buffer[3] = {0x10, 0x20, 0x30};
uint8_t rx_buffer[3] = {0x00, 0x00, 0x00};
for (i = 0; i < size; i ) {
HAL_SPI_Receive(amp;hspi1, amp;rx_buffer[i], 1, 100);
HAL_SPI_Transmit(amp;hspi1, amp;tx_buffer[i], 1, 100);
HAL_UART_Transmit(amp;huart2, amp;rx_buffer[i], 1, HAL_MAX_DELAY);
}
}
Редактировать:
Пытался использовать API HAL_UART_TransmitReceive(), но мне не удалось получить данные.
void SPI_call()
{
uint8_t tx_buffer = 0x20;
uint8_t rx_buffer;
HAL_SPI_TransmitReceive(amp;hspi1, amp;tx_buffer, amp;rx_buffer, 1, 1000);
HAL_UART_Transmit(amp;huart2, amp;rx_buffer, 1, HAL_MAX_DELAY);
}
Комментарии:
1. Для обратной связи вам нужны как ведущий SPI, так и подчиненный SPI. Я предполагаю, что вы настроены
hspi1
как master. ПоэтомуHAL_SPI_Receive
он никогда не получит ничего, кроме тайм-аута. По сути, исходные данныеrx_buffer
отправляются в UART, то есть 0 байт.2. Используйте две шины SPI: одну, настроенную как master для передачи данных, и одну, настроенную как slave для приема данных.
3. @codo
For loopback, you need both an SPI master and an SPI slave. I assume you have configured hspi1 as master. So HAL_SPI_Receive will never receive any but just time out
это полная чушь. Пожалуйста, не комментируйте, если вы не знаете, как работает SPI4. Включите некоторые буквы или цифры, если вы ожидаете, что они будут напечатаны (0x20 — это пробел, поэтому 0x30 или ‘0’, или 0x41 или ‘A’ может быть лучшим выбором).
5. общие утверждения о том, что дизайн контроллера является частью спецификации, контрпродуктивны. Также понимаю, что это очень редкий случай, когда периферийное устройство или контроллер spi или i2c соответствуют какой-либо такой спецификации. Вы никогда не беспокоитесь о спецификациях при использовании этих интерфейсов, вы используете таблицы данных для конкретных устройств, остальное не имеет значения.
Ответ №1:
В общем случае для связи SPI требуется, по крайней мере, ведущий и ведомый. Однако, поскольку SPI использует полнодуплексную связь (т. Е. Он передает и принимает одновременно), обычно можно подключить MOSI к MISO и обеспечить петлевую связь.
Я протестировал его на Nucleo-F411RE, и он работает.
Используя STM32CubeMX, я настроил проект с настройками по умолчанию для Nucleo-F411RE (внешние тактовые частоты 8 МГц, SWD, контакты UART2, подходящие для встроенного ST-Link и т. Д.). Кроме того, я включил SPI2. SPI1 находится в конфликте с проводкой платы Nucleo. Я также закоротил MOSI и MISO (PC2 и PC3).
Единственный код, который я добавил, — это фрагмент в цикле while:
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(1000);
uint8_t tx_buffer[] = { 'H', 'e', 'l', 'l', 'o', 'r', 'n' };
uint8_t rx_buffer;
for (int i = 0; i < sizeof(tx_buffer); i ) {
HAL_SPI_TransmitReceive(amp;hspi2, tx_buffer i, amp;rx_buffer, 1, 100);
HAL_UART_Transmit(amp;huart2, amp;rx_buffer, 1, 100);
}
/* USER CODE BEGIN 3 */
}
Инициализация SPI для ссылки (генерируется STM32CubeMX):
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(amp;hspi2) != HAL_OK)
{
Error_Handler();
}