|
坛友们,我在工程里添加了一个简单的SPI功能,只需要40ms向外发送一个3000字节的数组,但发送的时候总是一开始能发,之后在几分钟左右的时间内停止发送,程序还能执行到HAL_SPI_Transmit_IT(&hspi4,&array[0],3000);,但SPI中断并不会再进,我现在就是判断它一旦停止发送,就重新进行一次SPI初始化,就又能发送了。用示波器抓了时钟线的波形,15Mbit/s,和实际配置SPI速率一致,波形还行,几分钟后波形突然停止,这应该是软件上的问题吧。
我的程序跑了UCOSIII,开了一些优先级更高的中断,但我觉得SPI被打扰后不是该回来继续执行吗?怎么就永久罢工了呢?
请各位坛友们帮我看看是什么问题导致的SPI中断发送异常,谢谢!
/*SPI部分配置代码,如下*/
hspi4.Instance = SPI4;
hspi4.Init.Mode = SPI_MODE_MASTER;
hspi4.Init.Direction = SPI_DIRECTION_2LINES;
hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi4.Init.CRCPolynomial = 0x0;
hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;
/*SPI中断服务函数*/
void SPI4_IRQHandler(void)
{
//OSIntEnter();
HAL_SPI_IRQHandler(&hspi4);
//OSIntExit();
}
/*SPI发送代码仅用一行*/
HAL_SPI_Transmit_IT(&hspi4,&array[0],3000);//40ms调用一次,一次发送3000字节
|
|