[原创] 【TI首届低功耗设计大赛】用小狼做播放器

sjtitr   2014-11-20 22:35 楼主
最近忙得很,估计这是今年参加的最后一个活动了,有始有终。

于是前些天花了点时间继续把东西完善了一下,距离最初的目标又更接近了一步:现在开始,用小狼播放SD卡中的歌曲。

当然了,播放MP3还是有点天方夜谭,我们来播放些简单的:单声道8k8bit的Wav文件。

要想播放声音出来,不外加DA的情况下,就要把小狼的定时器合理分配好,另外由于性能有限,在实际播放的时候,我实际上只利用了声音数据8位中的高7位,所以也就是播放8K7位的声音。经过试验,这样的音质算是比较好的(相对其他参数设定来说)。以下列举了实际需要的和硬件有关的操作:
  1. #define PwmInit()\
  2.         {\
  3.           PwmStop();\
  4.           P1DIR  |= BIT2;\
  5.           P1SEL0 |= BIT2;\
  6.           P1SEL1 &= ~BIT2;\
  7.           TA1CCR0   = 0xFF >> BIT_ABANDON;\
  8.           TA1CCR1   = 0xFF >> BIT_ABANDON;\
  9.           TA1CCTL1  = OUTMOD_3;\
  10.         }

  11. #define PwmStart()        (TA1CTL = TASSEL__SMCLK + TACLR + MC_1)

  12. #define PwmStop()         (TA1CTL = MC_0)

  13. #define IsPwmStop()       (!TA1CTL)

  14. #define PwmSetDuty(duty)  (TA1CCR1 = (duty >> BIT_ABANDON))


  15. #define SampleClockInit()\
  16.         {\
  17.           TA0CCTL0 = CCIE;\
  18.           TA0CCR0  = 3000;\
  19.           TA0CCTL1 = OUTMOD_3;\
  20.         }

  21. #define SampleClockStart()  (TA0CTL = TASSEL__SMCLK + TACLR + MC_1)

  22. #define SampleClockStop()   (TA0CTL = MC_0)


另一方面,要播放的内容在SD卡上,文件系统自然不多说了,用的是我一向使用的fatfs的精简版。所以就需要用SPI通信对SD卡进行读取。在加上读到的数据,很快就会用在定时器上进行声音的输出,所以一定要协调好SPI通信和定时器的关系,特别是计算好读取的速率——要远大于声音的码率。
  1. /*******************************************************************************
  2. * 函数名: xSpiInit
  3. * 描  述: SPI初始化
  4. *******************************************************************************/
  5. void SpiInit(u8_t brcr)
  6. {
  7. EUSCI_A_SPI_masterInit(EUSCI_A1_BASE,
  8.                          EUSCI_A_SPI_CLOCKSOURCE_SMCLK,
  9.                          24000000,
  10.                          4000000,
  11.                          EUSCI_A_SPI_MSB_FIRST,
  12.                          EUSCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXT,
  13.                          EUSCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW,
  14.                          EUSCI_A_SPI_3PIN
  15.                          );
  16.   
  17.   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4, GPIO_SECONDARY_MODULE_FUNCTION);
  18.   GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5, GPIO_SECONDARY_MODULE_FUNCTION);
  19.   GPIO_setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P2, GPIO_PIN6, GPIO_SECONDARY_MODULE_FUNCTION);
  20.   
  21.   EUSCI_A_SPI_enable(EUSCI_A1_BASE);
  22. }

  23. /*******************************************************************************
  24. * 函数名: xSpiSend
  25. * 描  述: SPI收发函数
  26. *******************************************************************************/
  27. u8_t SpiSend(const u8_t data)
  28. {
  29.   volatile u8_t ret;

  30.   EUSCI_A_SPI_transmitData(EUSCI_A1_BASE, data);
  31.   while(EUSCI_A_SPI_isBusy(EUSCI_A1_BASE) == EUSCI_A_SPI_BUSY);
  32.   ret = EUSCI_A_SPI_receiveData(EUSCI_A1_BASE);
  33.   return ret;
  34. }


最后,即便是这样繁忙的进行计算和处理,也不要忘了经常忙里偷闲扫描一下按键——不能接受外界输出的系统,八成是个,B系统。
  1. /*******************************************************************************
  2. * 段  落: Key扫描
  3. * 描  述: 主要进行按键扫描检测
  4. *******************************************************************************/
  5. void key_scan(void)
  6. {
  7.   static u8_t keyRecord = 0x0A;
  8.   
  9.   keyRecord = (keyRecord << 1) | ((P4IN & 0x20) ? 1 : 0);
  10.   
  11.   if((keyRecord & 0x0F) == 0x0C)
  12.   {
  13.     spf_call_proc(PROC_MAIN, 4, PROC_CALL_SINGLE);
  14.   }
  15. }

  16. u8_t key_proc(arg_t arg)
  17. {
  18.   if(arg == PROC_INIT)
  19.   {
  20.     P4DIR &= ~0x20;
  21.     P4REN |= 0x20;
  22.     P4OUT |= 0x20;
  23.     set_timer(PROC_KEY, TIMER_MS(32), key_scan, CYCLE);
  24.   }
  25.   
  26.   return TRUE;
  27. }


以上也就是整个系统的麻烦之处了,我已实现完毕,不再过多解释了。只是,非常不谦虚的说,我在硬件方面是个出类拔萃的白痴,所以不能搞出有效的硬件来为这个系统进一步降噪,我表示非常遗憾。

录个视频来看看,可以看到,结构还是很简单的,成本很低的……我用线很乱。切换歌曲的时候,那个是语音报数——果然是屌丝程序员,报数都从0开始,好吧,不让它报0!



后面的话,需要继续实现和时间有关的部分了。不知道有效的时间内,我还能不能完成我的全部想法。总之,先好好去做一下。

回复评论 (5)

怎么没看到你的音频解码芯片?
点赞  2015-1-29 20:49
引用: yengfang 发表于 2015-1-29 20:49
怎么没看到你的音频解码芯片?

单声道8k8bit的Wav文件不需要解码啦


点赞  2015-1-30 09:56
我做的MP3用的VS1003音频解码芯片。音频文件格式是MP3格式。
点赞  2015-1-30 12:00
好资料,收藏了
点赞  2015-1-30 12:46
大神好厉害啊!
点赞  2015-2-10 09:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复