SPI 状态未更新
SPI state not getting updated
我正在使用 STM32L496 微控制器,我正在按如下方式初始化 hspi3 -
void MX_SPI3_Init()
{
SPI_HandleTypeDef hspi3;
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
}
在我的 HAL_SPI_Init(&hspi3)
函数中,hspi3
没有给出任何错误代码,它转到 hspi->State = HAL_SPI_STATE_READY;
IMAGE。但是在手表 window 中, hspi3
状态没有得到更新;它保持在 HAL_SPI_STATE_RESET
。因此,当我尝试使用 SPI 发送一些数据时,如下所示,它失败了 -
void TIM3_IRQHandler(void)
{
static uint16_t sinTableIndex = 0;
uint8_t data_on_spi[3];
SysTime_mainFunction();
if (getOperatingState() == CONTROL){
data_on_spi[0]=sinTable[sinTableIndex] & MASK_LOW_BYTE;
data_on_spi[1]=sinTable[sinTableIndex] & MASK_MID_BYTE;
data_on_spi[2]=sinTable[sinTableIndex] & MASK_HIGH_BYTE;
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_RESET);
if(HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);
sinTableIndex++;
if (sinTableIndex >= maxTableSize)
{
sinTableIndex = 0;
}
}
HAL_TIM_IRQHandler(&htim3);
}
当我 HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)
时,它会进入错误处理程序,因为它将 SPI 状态识别为 HAL_SPI_STATE_RESET
。
需要帮助来理解为什么会这样。
编辑:我认为问题在于,当我尝试执行 HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)
时,即使 __HAL_LOCK(hspi)
已完成,LOCK 仍未锁定。
- 不要在中断处理程序中以轮询模式传输。
为什么:因为它会消耗大量时间。这些 HAL 函数依赖于另一个中断中增加的滴答值,由于中断优先级的原因,该中断可能不会发生。
我正在使用 STM32L496 微控制器,我正在按如下方式初始化 hspi3 -
void MX_SPI3_Init()
{
SPI_HandleTypeDef hspi3;
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
}
在我的 HAL_SPI_Init(&hspi3)
函数中,hspi3
没有给出任何错误代码,它转到 hspi->State = HAL_SPI_STATE_READY;
IMAGE。但是在手表 window 中, hspi3
状态没有得到更新;它保持在 HAL_SPI_STATE_RESET
。因此,当我尝试使用 SPI 发送一些数据时,如下所示,它失败了 -
void TIM3_IRQHandler(void)
{
static uint16_t sinTableIndex = 0;
uint8_t data_on_spi[3];
SysTime_mainFunction();
if (getOperatingState() == CONTROL){
data_on_spi[0]=sinTable[sinTableIndex] & MASK_LOW_BYTE;
data_on_spi[1]=sinTable[sinTableIndex] & MASK_MID_BYTE;
data_on_spi[2]=sinTable[sinTableIndex] & MASK_HIGH_BYTE;
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_RESET);
if(HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);
sinTableIndex++;
if (sinTableIndex >= maxTableSize)
{
sinTableIndex = 0;
}
}
HAL_TIM_IRQHandler(&htim3);
}
当我 HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)
时,它会进入错误处理程序,因为它将 SPI 状态识别为 HAL_SPI_STATE_RESET
。
需要帮助来理解为什么会这样。
编辑:我认为问题在于,当我尝试执行 HAL_SPI_Transmit(&hspi3, (uint8_t*)data_on_spi, 3,1)
时,即使 __HAL_LOCK(hspi)
已完成,LOCK 仍未锁定。
- 不要在中断处理程序中以轮询模式传输。 为什么:因为它会消耗大量时间。这些 HAL 函数依赖于另一个中断中增加的滴答值,由于中断优先级的原因,该中断可能不会发生。