gpt4 book ai didi

c - ST32 HAL SPI 从机中断溢出

转载 作者:行者123 更新时间:2023-11-30 16:42:13 28 4
gpt4 key购买 nike

我在使用 ST32F030 和 Slave SPI 时遇到困难

我试图让它响应 spi 命令:-

主机发送 0x05,从机响应 7 个字节的数组。第一次可以正常工作,但随后失去同步,并设置了 OVR 位。我不明白为什么。

代码如下:-

int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_SPI1_Init();
spi_init();

while (1)
{
HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
}
}

/* SPI1 init function */
static void MX_SPI1_Init(void)
{
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 = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
/* SPi priority interrupt configuration */
HAL_NVIC_SetPriority(SPI1_IRQn, 1, 1);
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}


void spi_init()
{
HAL_SPI_Receive_IT(&hspi1, spiData, 1);
}

void SPI1_IRQHandler(void)
{
HAL_SPI_IRQHandler(&hspi1);
}

uint8_t spiData[8];
uint8_t edgesmsg[7];

void spi_interrupt()
{
uint8_t c;

c = spiData[0];
if ( c == 0x05)
HAL_SPI_Transmit(&hspi1, edgesmsg, 7, 1000);
}

感谢您收到的任何建议

最佳答案

你的问题是你一直试图从SPI读取而没有完成之前的操作,这就是你溢出的原因(OVR位)。尝试更好地排序事情。

例如,从主循环中删除 HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1); 并在中断处理程序中调用它。代码应该是:

int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_SPI1_Init();
spi_init();

while (1)
{
//Do not call HAL_SPI_Receive_IT here
//HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
}
}



void spi_interrupt()
{
uint8_t c;

c = spiData[0];
if ( c == 0x05)
{
HAL_SPI_Transmit(&hspi1, edgesmsg, 7, 1000);
}

//Re-enable interrupt to read next sequence
HAL_SPI_Receive_IT(&hspi1, &spiData[0], 1);
}

这就是原理。处理完数据包后,您可以重新启用中断。但是,我不确定您的意图是什么,您可能需要调整上面的代码。

另请注意,任何中断处理程序都应尽可能快。因此,在中断处理程序 spi_interrupt 中调用 HAL_SPI_Transmit (轮询函数)实际上是 Not Acceptable 。您应该调用 HAL_SPI_Transmit_IT 或根本不使用中断。第一种情况,再次注意排序。

关于c - ST32 HAL SPI 从机中断溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45913600/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com