Arm 使用HAL在运行时STM32F4期间从SPI从站更改为主站
我试图使两个带HAL的STM32F4通过SPI单工模式进行通信,方法是在准备发送消息时更改主节点。这两个平台都是从机开始的,它们会切换到主机以发送消息,然后返回到从机Arm 使用HAL在运行时STM32F4期间从SPI从站更改为主站,arm,stm32,communication,spi,hal,Arm,Stm32,Communication,Spi,Hal,我试图使两个带HAL的STM32F4通过SPI单工模式进行通信,方法是在准备发送消息时更改主节点。这两个平台都是从机开始的,它们会切换到主机以发送消息,然后返回到从机 while (1) { configSlave(); while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_RX); HAL_SPI_Receive(&hspi1, (uint8_t *)buff, 13, 1000);
while (1)
{
configSlave();
while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY_RX);
HAL_SPI_Receive(&hspi1, (uint8_t *)buff, 13, 1000); /* Including this line generates the issue */
HAL_Delay(10);
configMaster();
HAL_Delay(10);
sendHelloWorld();
HAL_Delay(10);
}
在configSlave()
之后使用configMaster()
更改SPI配置,而不调用接收例程HAL\u SPI\u receive()
效果很好。然而,如果我在两者之间添加receive例程,我的问题就来了
如果我在配置之间添加HAL\u SPI\u Receive()。那么为什么会发生这种情况呢?这是一个去初始化问题吗
我确保在重新配置到每个模式之前对SPI外围设备进行去初始化,并在去初始化期间通过调试模式检查SPI寄存器是否为0。类似地,我确保每次全局SPI处理程序都重置为0,这样它就不会保留其他模式的一些配置
作为参考,这些是我的configMaster()
和configSlave()
例程
static void configMaster(void)
{
if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
{
memset(&hspi1, 0, sizeof(SPI_HandleTypeDef));
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
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.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
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();
}
}
}
static void configSlave(void)
{
if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
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();
}
}
}
主机开始发送时钟的确切位置也发生在这里:HAL\u SPI\u Init()
欢迎任何建议。谢谢
/*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/
/* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management,
Communication speed, First bit and CRC calculation state */
WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction | hspi->Init.DataSize |
hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit | hspi->Init.CRCCalculation));