硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3736|回复: 5
收起左侧

[其它] 有關於 WM8978 I2S IRQ

[复制链接]

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2015-11-2 15:07:17 | 显示全部楼层 |阅读模式
  1. void SPI2_IRQHandler(void)
  2. {
  3.     //I2S_CODEC_DataTransfer();
  4.    
  5.     if (wm8978.status == STA_RECORDING){
  6.         if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_TXE) == SET)
  7.         {
  8.             if (SPI_I2S_GetFlagStatus(SPI2, I2S_FLAG_CHSIDE))
  9.             {
  10.                 I2S2ext->DR = speex_codec.adc_buffer[0][speex_codec.adc_stop[0]];
  11.                 speex_codec.adc_stop[0] ++;
  12.                 speex_codec.adc_stop[0] &= 0x3FF;
  13.             }
  14.             else
  15.             {
  16.                 I2S2ext->DR = speex_codec.adc_buffer[0][speex_codec.adc_stop[0]];
  17.             }
  18.             SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_TXE);
  19.         }
  20.         if (SPI_I2S_GetITStatus(I2S2ext, SPI_I2S_IT_RXNE) == SET)
  21.         {
  22.             if (SPI_I2S_GetFlagStatus(I2S2ext, I2S_FLAG_CHSIDE))
  23.             {
  24.                 wm8978.audio_point[wm8978.audio_cursor] = I2S2ext->DR;
  25.                 speex_codec.adc_start[1]++;
  26.                 speex_codec.adc_start[1] &= 0x3FF;
  27.             }else{
  28.                 wm8978.audio_point[wm8978.audio_cursor] = I2S2ext->DR;
  29.                 speex_codec.adc_start[0]++;
  30.                 speex_codec.adc_start[0] &= 0x3FF;
  31.             }
  32.             SPI_I2S_ClearITPendingBit(I2S2ext, SPI_I2S_IT_RXNE);
  33.         }
  34.     }
  35. }
复制代码
speex 有个限制是这样的,
在做 speex 是针对事先储存好的资料做压缩,非实时的

如我要压缩一段 1024B 的数字音频,就必须等1024B都采样完才能压缩
但其实抓好速度的话,可以在1024B采样完就立刻压缩,尽可能接近实时

用 V5 - WM8978范例做实验的时候,遇到了一个问题(代码如上)
I2S_IRQ一直在跑,要怎麽样才能跳出来?

有正确压缩,时间上来的及,没有撞帧
就只是跳不出去,请问该怎麽做呢?
回复

使用道具 举报

33

主题

4

回帖

115

积分

初级会员

积分
115
发表于 2015-11-2 18:24:21 | 显示全部楼层
帮顶 学习一下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-11-3 11:08:35 | 显示全部楼层
在中断里面关就可以,比如我们V5板子上面的WM8978的录音和放音例子:
1.png
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
 楼主| 发表于 2015-11-4 09:41:42 | 显示全部楼层

回 aikalife 的帖子

aikalife:帮顶 学习一下 (2015-11-02 18:24) 
谢谢[s:142][s:142]
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
 楼主| 发表于 2015-11-4 10:01:31 | 显示全部楼层

回 eric2013 的帖子

eric2013:在中断里面关就可以,比如我们V5板子上面的WM8978的录音和放音例子:

 (2015-11-03 11:08) 
谢谢版大的回覆,问题已解决。
刚刚才发现我问题似乎没有描述得很清楚。
预计是做个 Buffer 储存接收到的音频进行压缩,
可是功能正常,但却无法跳出录音回圈。
因为希望录音没有时间限制
(算好时间,Buffer 压缩完後几个 clock 会覆写,压缩完会直接丢PC,所以不考虑空间问题。)
所以不会在中断里面关,在 NVIC 也无果的情况下[s:139]
才急忙上来投问,叙述不全,很抱歉[s:129]。

最後用 串口调试助手 才发现是 Hard Fault
(感谢你们在 HardFault_Handler 加了输出字串[s:151])

造成原因是,
输出到 PC 的 buffer overhead,
buffer 输出清空的速度没来的及跟上 speex 输出的封包,
在 1024*4B 的资料量以後就会形成 Hard Fault 造成卡死。
增加 buffer 跟 stack/head size 後解决该问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2015-11-4 19:18:03 | 显示全部楼层

回 ptiinngg 的帖子

ptiinngg:谢谢版大的回覆,问题已解决。
刚刚才发现我问题似乎没有描述得很清楚。
预计是做个 Buffer 储存接收到的音频进行压缩,
可是功能正常,但却无法跳出录音回圈。
....... (2015-11-04 10:01) 
[s:151]解决了就好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 19:23 , Processed in 0.255182 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表