|

楼主 |
发表于 2016-1-25 18:00:16
|
显示全部楼层
不想费神了,
顺便写下我的作法,
基本上先确认I2S频率,
及自己的uart打包的速率.
抓好自己打包的间隔.
程序的架构大概是,
收进来数据,先别开I2S
收几个包顺便处理一下,(我的速度差几个包的时间不碍事,顺便当缓冲时间..)
用timer去抓包丢进I2S存数据的buffer(g_tRec.pAudio[g_tRec.uiCursor++])
像这样..跟得上就行..- void I2S_CODEC_DataTransfer(void)
- {
- static uint16_t usData;
- /*只录左声道(安富莱STM32开发板MIC安装在左声道), 放音时左右声道相同*/
- if (g_tRec.ucStatus == STA_RECORDING) /*录音状态*/
- {
- if (I2S2ext->SR & SPI_I2S_FLAG_RXNE)
- {
- usData = I2S2ext->DR;
- if (SPI2->SR & I2S_FLAG_CHSIDE != SET)
- {
- g_tRec.pAudio[g_tRec.uiCursor++] = usData;
- }
- }
- if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == SET)
- {
- SPI2->SR = 0;
- }
- }
- else if (g_tRec.ucStatus == STA_PLAYING) /*放音状态,右声道的值等于左声道*/
- {
- if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == SET)
- {
- if (SPI2->SR & I2S_FLAG_CHSIDE != SET) /*判断是不是左声道*/
- {
- usData = g_tRec.pAudio[g_tRec.uiCursor++];
- }
- I2S2ext->DR = usData;
- }
- }
- else /*临时状态 STA_STOP_I2S,用于停止中断*/
- {
- /*禁止I2S2 RXNE中断(接收不空),需要时再打开*/
- SPI_I2S_ITConfig(I2S2ext, SPI_I2S_IT_RXNE, DISABLE);
- /*禁止I2S2 TXE中断(发送缓冲区空),需要时再打开*/
- SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_TXE, DISABLE);
- }
- }
复制代码
当然,这样做是会有问题的
时间长了, 一定有个会被咬上
只是以我目前的需求是暂时够用了.. |
|