如何将STM32f4编程为SPI Slave
How to program STM32f4 as SPI Slave
我在 SPI 从模式下对 STM32F407 进行编码时遇到问题,
在我的例子中,Master 是 ADE7880 IC,Slave 是 STM32F407,
.
我是初学者,我已经连接了 ADE7880 数据表中提到的相同引脚和使用 STM32cubeMX 生成的代码,
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
然后在main
hal_status=HAL_SPI_Receive(&hspi1, (uint8_t *)spi_buf, 1, 100);
// hal_status = HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 1000);
它Return超时错误,
我的编程方面还好吗????
hspi1.Init.NSS = SPI_NSS_SOFT;
此行正在配置由软件管理的从 select 行。
你想要
hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
您需要为 RXNE 触发中断。您需要像这样在配置中指定回调函数
hspi2.RxISR = callback_func;
像这样启用中断
__HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_RXNE);
最后,CLK极性和相位设置
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
对于 ADE7880 是错误的。对于该 IC,它们分别是高值和尾随值。您可以通过阅读 ADE7880 datasheet 中的 SPI 时序图来判断这一点。您应该将它们更改为:
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
我在 SPI 从模式下对 STM32F407 进行编码时遇到问题,
在我的例子中,Master 是 ADE7880 IC,Slave 是 STM32F407,
我是初学者,我已经连接了 ADE7880 数据表中提到的相同引脚和使用 STM32cubeMX 生成的代码,
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
然后在main
hal_status=HAL_SPI_Receive(&hspi1, (uint8_t *)spi_buf, 1, 100);
// hal_status = HAL_SPI_TransmitReceive(&hspi1, tx_data, rx_data, 2, 1000);
它Return超时错误, 我的编程方面还好吗????
hspi1.Init.NSS = SPI_NSS_SOFT;
此行正在配置由软件管理的从 select 行。
你想要
hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
您需要为 RXNE 触发中断。您需要像这样在配置中指定回调函数
hspi2.RxISR = callback_func;
像这样启用中断
__HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_RXNE);
最后,CLK极性和相位设置
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
对于 ADE7880 是错误的。对于该 IC,它们分别是高值和尾随值。您可以通过阅读 ADE7880 datasheet 中的 SPI 时序图来判断这一点。您应该将它们更改为:
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;