sorry if the question seems stupid, I'm a new defector of mbed and I discover arduino.
I work on a samd51 project (feather M4 express) and this one must to make some music.
I would like use a MAX98357 but the lib " Audio - Adafruit forks" don't want play any sound with I2s interface.
(tone generator is ok but wav....)
So I try to read "all" PCM data from wav file and send it to i2s device... I work on my own library wav...
(if some have any code for samd51... I have find some code for STM32 but this one is too lazy and have not enough memory for my project)
When I read data from the SDcard, they are good for the first 512 byte block and after, they are corrupt...
My code :
#include <Arduino.h>
#include <SdFat.h> // SD card & FAT filesystem library
#include <Adafruit_ZeroI2S.h>
#define SD_CS 4 // SD card chip select
#define TFT_CS 9 // TFT select pin
#define TFT_DC 6 // TFT data/command pin
#define TFT_RST 5 // Or set to -1 and connect TFT RST to Arduino reset pin
SdFat SD; // SD card filesystem
File myFile;
Adafruit_ZeroI2S i2s;
uint16_t nbrsTrack, bitBySample;
uint32_t freq, dataSize;
void setup()
{
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
if (!SD.begin(SD_CS)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
myFile = SD.open("test1644.wav");
if (myFile) {
Serial.println("test1644.wav : ");
myFile.seek(0x16);
nbrsTrack = myFile.read();
nbrsTrack += myFile.read()<<8;
//myFile.seek(0x18);
freq = myFile.read();
freq += myFile.read()<<8;
freq += myFile.read()<<16;
freq += myFile.read()<<24;
myFile.seek(0x22);
bitBySample = myFile.read();
bitBySample += myFile.read()<<8;
myFile.seek(0x28);
dataSize = myFile.read();
dataSize += myFile.read()<<8;
dataSize += myFile.read()<<16;
dataSize += myFile.read()<<24;
Serial.print("nombre de canaux : ");
Serial.println(nbrsTrack);
Serial.print("frequence d'échantillonnage : ");
Serial.println(freq);
Serial.print("encodage en : ");
Serial.print(bitBySample);
Serial.println("bits");
Serial.print("taille des data : ");
Serial.println(dataSize);
} else {
Serial.println("error opening file");
}
i2s.begin(I2S_16_BIT, 44100);
i2s.enableTx();
uint16_t dataSD;
char tmp[8];
uint32_t index = 32;
sprintf(tmp, "%.10X : ", index);
Serial.print(tmp);
for(uint8_t i=0; i < 4 ; i++) {
sprintf(tmp, "%.2X ", myFile.read());
Serial.print(tmp);
}
Serial.println("");
while(myFile && myFile.available()){
index += 16;
sprintf(tmp, "%.10X : ", index);
Serial.print(tmp);
for(uint8_t i=0; i < 16 ; i++) {
sprintf(tmp, "%.2X ", myFile.read());
Serial.print(tmp);
}
Serial.println("");
}
}
void loop()
{
}
and my serial output :
initialization done.
golu1644.wav :
nombre de canaux : 1
frequence d'échantillonnage : 44100
encodage en : 16bits
taille des data : 37287936
0000000020 : 00 00 01 00
0000000030 : FE FF 02 00 FE FF 02 00 FE FF 02 00 FF FF FF FF
0000000040 : 02 00 FD FF 03 00 FF FF 00 00 00 00 00 00 00 00
0000000050 : 01 00 FF FF 01 00 FE FF 02 00 00 00 FF FF 02 00
0000000060 : FD FF 02 00 00 00 FE FF 04 00 FB FF 05 00 FC FF
0000000070 : 02 00 FF FF 01 00 FF FF 01 00 FF FF 01 00 00 00
0000000080 : FF FF 01 00 FF FF 00 00 02 00 FF FF 00 00 00 00
0000000090 : FE FF 04 00 FC FF 04 00 FC FF 03 00 FE FF 01 00
00000000A0 : FF FF 01 00 00 00 FF FF 01 00 FF FF 01 00 00 00
00000000B0 : FF FF 01 00 FF FF 02 00 FE FF 01 00 FF FF 00 00
00000000C0 : 02 00 FF FF FF FF 02 00 FD FF 03 00 FF FF FE FF
00000000D0 : 04 00 FC FF 03 00 FF FF FF FF 01 00 00 00 FF FF
00000000E0 : 03 00 FD FF 01 00 FF FF 02 00 FE FF 03 00 FC FF
00000000F0 : 02 00 00 00 00 00 00 00 00 00 FF FF 01 00 00 00
0000000100 : 01 00 FD FF 03 00 FF FF FF FF 03 00 FB FF 06 00
0000000110 : FB FF 04 00 FD FF 01 00 01 00 FF FF 01 00 FF FF
0000000120 : 01 00 FE FF 04 00 FB FF 05 00 FB FF 04 00 FE FF
0000000130 : 00 00 01 00 FE FF 02 00 FF FF 00 00 00 00 00 00
0000000140 : 00 00 01 00 FE FF 02 00 FE FF 02 00 FF FF 01 00
0000000150 : FF FF 00 00 01 00 FF FF 00 00 01 00 FE FF 03 00
0000000160 : FD FF 02 00 FD FF 04 00 FC FF 04 00 FC FF 04 00
0000000170 : FC FF 04 00 FD FF 01 00 01 00 FF FF 01 00 FF FF
0000000180 : 01 00 FF FF 02 00 FF FF FF FF 02 00 FE FF 02 00
0000000190 : FF FF 02 00 FD FF 03 00 FE FF 00 00 03 00 FC FF
00000001A0 : 04 00 FC FF 03 00 FE FF 02 00 FE FF 02 00 FE FF
00000001B0 : 02 00 FE FF 03 00 FC FF 05 00 FA FF 05 00 FC FF
00000001C0 : 03 00 FE FF 00 00 00 00 FF FF 03 00 FD FF 02 00
00000001D0 : FD FF 02 00 FF FF 01 00 FF FF 00 00 FF FF 01 00
00000001E0 : FF FF 01 00 00 00 FF FF 02 00 FE FF 02 00 FF FF
00000001F0 : 01 00 FE FF 04 00 FC FF 03 00 FE FF 01 00 01 00
0000000200 : FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ...
0000000210 : FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ...
0000000220 : FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ...
0000000230 : FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ...
0000000240 : FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF ...
...
and the wav file :
...
00000001C0 : 03 00 FE FF 00 00 00 00 FF FF 03 00 FD FF 02 00
00000001D0 : FD FF 02 00 FF FF 01 00 FF FF 00 00 FF FF 01 00
00000001E0 : FF FF 01 00 00 00 FF FF 02 00 FE FF 02 00 FF FF
00000001F0 : 01 00 FE FF 04 00 FC FF 03 00 FE FF 01 00 01 00
0000000200 : 00 00 01 00 FE FF 03 00 FE FF 02 00 FE FF 02 00
0000000210 : FE FF 03 00 FD FF 03 00 FF FF 02 00 FF FF 02 00
0000000220 : FF FF 01 00 FF FF FF FF 02 00 FF FF 01 00 FF FF
...
does anyone have any explanation for this serial return?