问题描述
我试图通过在准备发送消息时更改谁是主节点来使两个带有 HAL 的 STM32F4 通过 SPI 单工模式进行通信。两个平台都从slave开始,然后变成master发送消息,然后又回到slave。
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);
}
在 configMaster()
之后使用 configSlave()
更改 SPI 配置而不调用接收例程 HAL_SPI_Receive()
效果很好。但是,如果我在两者之间添加接收例程,我的问题就会出现。
如果我在将节点更改为主控时在配置之间添加 HAL_SPI_Receive()
,则该节点将开始通过 CLK 引脚发送恒定时钟并将 DATA 引脚拉低,直到我发送 Hello World 消息。那么为什么会发生这种情况呢?是不是去初始化问题?
我确保在重新配置为每种模式之前取消初始化 SPI 外设,并通过调试模式检查取消初始化期间 SPI 寄存器是否为 0。同样,我确保每次全局 SPI 处理程序都重置为 0,这样它就不会保留其他模式的某些配置。
作为参考,这些是我的 configMaster()
和 configSlave()
例程
static void configMaster(void)
{
if(HAL_SPI_DeInit(&hspi1) != HAL_ERROR)
{
memset(&hspi1,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_SPI_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));
欢迎提出任何建议。谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)