0

我希望这里有一些在嵌入式系统方面有高级经验的人:我设计了一个带有 Atmel Samd21 MCU 的 PCB,它应该通过放大器 TAS5805(通过 i2s 连接)播放 .wav 文件。.wav 文件通过 DMA(来自 SD 卡的数据)运行。一切正常,我可以听到我选择的声音。但是当我开始运行看门狗定时器或睡眠功能时,之后我就听不到我的声音了,即使我之前再次禁用了 WDT。

我的问题是:初始化另一个时钟会影响 MCU 中的时钟吗?我猜 RT 时钟和 i2s 同步有一些问题。有人有类似的问题并且知道如何解决吗?我很感激每一个建议/方法。

我还附加了一个测试代码。也许这有助于理解我在说什么。

谢谢!

#include <SPI.h>
#include <SD.h>
#include <ArduinoSound.h>
#include <TAS5805.h>
#include <Adafruit_SleepyDog.h>
#include <ArduinoLowPower.h>

//Amplifier/ Audio
class TAS5805 TAS5805_AMP;
SDWaveFile waveFile;

//SD Card
volatile int SDCARD_CS_PIN = 28;

bool wdt_on = false;

void setup() {
  Serial.begin(9600);
  while(!Serial){};

  pinMode(8, OUTPUT); //PIN_TAS5805_SHDN =8
  digitalWrite(8, HIGH);


  //initialize SD card
  SDcardInit();

  TAS5805_AMP.powerDown();
}

void loop(){


  if(Serial.available()){
    char c = Serial.read();

    if(c=='x'){
      LowPower.sleep(5000); //sleep for 5 seconds
    }
    else if(c=='c'){
      Serial.println("Enable WDT");
      Watchdog.enable(1000000); //set Watchdog (1000 seconds timer)
      wdt_on=true;
    }
    else if(c=='v'){
      Serial.println("Disable WDT");
      Watchdog.disable();
      wdt_on=false;
    }
    else if(c=='b'){
      playFile("test.wav",0); //play single
    }
    else if(c=='n'){
      playFile("test.wav",1); //loop
    }
    else if(c=='m'){
      Serial.println("stop playing");
      AudioOutI2S.stop();
    }
  }
  if(wdt_on)
    Watchdog.reset();
}

void SDcardInit(){
  if (!SD.begin(SDCARD_CS_PIN)) {
    Serial.println("SD Card Error");
    while (1);
  }
  Serial.println("SD Card detected");
  delay(3000);
}

void playFile(String s, bool loopMode){

  waveFile = SDWaveFile(s);

  // check if the WaveFile is valid
  if (!waveFile) {
    Serial.println("WAV invalid");
    delay(3000);
  }
  else{

    Serial.println("found valid file");

    TAS5805_AMP.begin(0x2D); //0x2D -> slave address

    TAS5805_AMP.setVol(5);//50% volume from amplifier

    // full volume from MCU
    AudioOutI2S.volume(100);

    // check if the I2S output can play the wave file
    if (!AudioOutI2S.canPlay(waveFile)) {
    Serial.println("unable to play!");
    delay(3000);
    }
    else{
      Serial.println("play file");
      if(loopMode==0){
        AudioOutI2S.play(waveFile);       
      }
      else{
        AudioOutI2S.loop(waveFile);
      }
    }
  }
}
4

0 回答 0