Встроенная система: отсутствует звук после WDT / режима сна - PullRequest
0 голосов
/ 28 апреля 2020

Я надеюсь, что здесь есть несколько человек, которые имеют опыт работы со встроенными системами: я разработал печатную плату с микроконтроллером Atmel Samd21, которая должна воспроизводить файлы .wav через усилитель TAS5805 (подключенный через i2s). Файл .wav запускается через DMA (данные с SD-карты). Все работает отлично, и я слышу выбранные звуки. Но когда я начинаю запускать сторожевой таймер или функцию сна, после этого я не слышу свои звуки, даже когда я снова отключил WDT.

Мой вопрос: можно ли повлиять на часы в MCU инициализируя другие часы? Я думаю, что есть некоторые проблемы с часами RT и i2s syn c. У кого-то были похожие проблемы и знает, как их решить? Я благодарен за каждый совет / подход.

Также я добавил тестовый код. Может быть, полезно понять, о чем я говорю.

Спасибо!

#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);
      }
    }
  }
}
...