This part looks weird:
void sendMP3Command(String MP3File, uint8_t Command) {
char *TextArray[MaxMP3Name];
MP3File.toCharArray(TextArray, MaxMP3Name);
txMP3.Filename = TextArray;
You have made an array of 13 pointers to strings. This is not what you want. You want the file name to end up into txMP3.Filename.
This would be closer:
void sendMP3Command(String MP3File, uint8_t Command) {
MP3File.toCharArray(txMP3.Filename, MaxMP3Name);
Personally I wouldn't be using the String class at all, but that should be better.
Now:
void onReceiveEvent(int numbytes){
if(numbytes == 16){
I2C_readAnything(RXdata);
newData = 2;
}
}
Are you sure it's 16 bytes? What if you change the struct? Let the compiler do the thinking for you:
void onReceiveEvent(int numbytes){
if(numbytes == sizeof (RXdata)){
I2C_readAnything(RXdata);
newData = 2;
}
}