STM32F411RE 中的环回 SPI
Loopback SPI in STM32F411RE
我正在尝试在 STM32F411RE 的 SPI 中使用 STM32 HAL 库进行环回。串行终端的输出失真(只是盒子)我已经连接了微控制器的 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(&hspi1, &rx_buffer[i], 1, 100);
HAL_SPI_Transmit(&hspi1, &tx_buffer[i], 1, 100);
HAL_UART_Transmit(&huart2, &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(&hspi1, &tx_buffer, &rx_buffer, 1, 1000);
HAL_UART_Transmit(&huart2, &rx_buffer, 1, HAL_MAX_DELAY);
}
一般来说,SPI通信至少需要一个master和一个slave。但是,由于SPI采用全双工通信(即同时发送和接收),通常可以将MOSI连接到MISO并实现环回通信。
我已经在 Nucleo-F411RE 上对其进行了测试,它可以正常工作。
我使用 STM32CubeMX 配置了一个具有 Nucleo-F411RE 默认设置的项目(8 MHz 外部时钟、SWD、适用于 on-board ST-Link 等的 UART2 引脚)。此外,我还启用了 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(&hspi2, tx_buffer + i, &rx_buffer, 1, 100);
HAL_UART_Transmit(&huart2, &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(&hspi2) != HAL_OK)
{
Error_Handler();
}
我正在尝试在 STM32F411RE 的 SPI 中使用 STM32 HAL 库进行环回。串行终端的输出失真(只是盒子)我已经连接了微控制器的 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(&hspi1, &rx_buffer[i], 1, 100);
HAL_SPI_Transmit(&hspi1, &tx_buffer[i], 1, 100);
HAL_UART_Transmit(&huart2, &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(&hspi1, &tx_buffer, &rx_buffer, 1, 1000);
HAL_UART_Transmit(&huart2, &rx_buffer, 1, HAL_MAX_DELAY);
}
一般来说,SPI通信至少需要一个master和一个slave。但是,由于SPI采用全双工通信(即同时发送和接收),通常可以将MOSI连接到MISO并实现环回通信。
我已经在 Nucleo-F411RE 上对其进行了测试,它可以正常工作。
我使用 STM32CubeMX 配置了一个具有 Nucleo-F411RE 默认设置的项目(8 MHz 外部时钟、SWD、适用于 on-board ST-Link 等的 UART2 引脚)。此外,我还启用了 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(&hspi2, tx_buffer + i, &rx_buffer, 1, 100);
HAL_UART_Transmit(&huart2, &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(&hspi2) != HAL_OK)
{
Error_Handler();
}