在工作中有个音频算法处理透传的需求,例如通过i2s2-> 接收音频,处理音频,i2s3->转发音频。
在这个处理的过程中,发现如果源端的clk信号不稳定,断断续续,会导致dma接收到噪音数据,导致数据异常,这时候,我们只能通过软件来判断接收中断的问题。
接下来是一个简单的实现:
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
{
half = osKernelGetTickCount();
}
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
full = osKernelGetTickCount();
check_i2s = 1;
}
void task()
{
if (check_i2s) //通过15ms间隔判断是否有传输中断,如果中断,则重建dma接收
{
tx = osKernelGetTickCount();
if (tx - full > 15 || tx - half > 15)
{
printf("f %d h %d r\n", tx - full, tx - half);
HAL_I2S_DMAStop(&hi2s2);
HAL_I2S_Receive_DMA(&hi2s2, (void *)audio_cache_buff_rx, sizeof(audio_cache_buff_rx)/sizeof(uint16_t));
check_i2s = 0;
continue;
}
}
}
目前这个方法虽然不是非常优雅,但是确实解决了传输不稳定导致的噪音,大家还有什么好用的方法,欢迎在评论区一起讨论。