我希望这里有一些在嵌入式系统方面有高级经验的人:我设计了一个带有 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);
}
}
}
}