VS1053 sturing hangt vast in while lus

algemene C code
Berichten: 1
Geregistreerd: 15 Okt 2019, 12:39

VS1053 sturing hangt vast in while lus

Berichtdoor Kevsnor » 15 Okt 2019, 12:43

SPI versturen werkt, maar de code blijft hangen in de while (playingMusic && Ready()) {feedBuffer();} lus.
Enig idee waarom het hier blijft hangen?

Code: Alles selecteren
//#include <Adafruit_VS1053.h>
#include <SPI.h>
#include <SD.h>
#define VS1053_FILEPLAYER_TIMER0_INT 255 // allows useInterrupt to accept pins 0 to 254
#define VS1053_FILEPLAYER_PIN_INT 5

#define VS1053_SCI_READ 0x03
#define VS1053_SCI_WRITE 0x02

#define VS1053_REG_MODE  0x00
#define VS1053_REG_STATUS 0x01
#define VS1053_REG_BASS 0x02
#define VS1053_REG_CLOCKF 0x03
#define VS1053_REG_DECODETIME 0x04
#define VS1053_REG_AUDATA 0x05
#define VS1053_REG_WRAM 0x06
#define VS1053_REG_WRAMADDR 0x07
#define VS1053_REG_HDAT0 0x08
#define VS1053_REG_HDAT1 0x09
#define VS1053_REG_VOLUME 0x0B

#define VS1053_GPIO_DDR 0xC017
#define VS1053_GPIO_IDATA 0xC018
#define VS1053_GPIO_ODATA 0xC019

#define VS1053_INT_ENABLE  0xC01A

#define VS1053_MODE_SM_DIFF 0x0001
#define VS1053_MODE_SM_LAYER12 0x0002
#define VS1053_MODE_SM_RESET 0x0004
#define VS1053_MODE_SM_CANCEL 0x0008
#define VS1053_MODE_SM_EARSPKLO 0x0010
#define VS1053_MODE_SM_TESTS 0x0020
#define VS1053_MODE_SM_STREAM 0x0040
#define VS1053_MODE_SM_SDINEW 0x0800
#define VS1053_MODE_SM_ADPCM 0x1000
#define VS1053_MODE_SM_LINE1 0x4000
#define VS1053_MODE_SM_CLKRANGE 0x8000


#define VS1053_SCI_AIADDR 0x0A
#define VS1053_SCI_AICTRL0 0x0C
#define VS1053_SCI_AICTRL1 0x0D
#define VS1053_SCI_AICTRL2 0x0E
#define VS1053_SCI_AICTRL3 0x0F

#define VS1053_DATABUFFERLEN 32

//MP3
#define MP3_CS    7 //Chip select
#define MP3_DCS   6 //Data select
#define MP3_DREQ  3 //Data Request

//COMMON
#define SD_CS  4     //SD select
#define RST   -1    //Reset*/

  typedef volatile uint8_t RwReg;
  typedef uint8_t PortMask;
typedef volatile RwReg PortReg;

volatile boolean BufferLock=false;
static volatile PortReg *clkportreg, *misoportreg, *mosiportreg;
static PortMask clkpin, misopin, mosipin;
volatile boolean playingMusic;

boolean Play (const char *trackname);
boolean Ready(void);
void SPI_write(uint8_t addr, uint16_t data);
void spiwrite(uint8_t c);
void spiwrite(uint8_t *c, uint16_t num);
void feedBuffer(void);
void feedBuffer_noLock(void);
void playData(uint8_t *buf, uint8_t buffsiz);




uint8_t mp3buffer[32];

File currentTrack;
/*************************************************/
void setup() {
  Serial.begin(9600);
  delay(200);
  pinMode (MP3_CS, OUTPUT);
  pinMode (MP3_DCS, OUTPUT);
  pinMode (MP3_DREQ, INPUT);
  pinMode (SD_CS, OUTPUT);
  digitalWrite(SD_CS, HIGH);
 Serial.println("begin");
SPI.begin();

Play("/track001.mp3");
while(playingMusic){}
Serial.println("after play");
}
void loop() {
  // put your main code here, to run repeatedly:
   Serial.println("loop");
   delay(2000);
}

/*************************************************/
boolean Play (const char *trackname){
  SPI_write(VS1053_REG_MODE, VS1053_MODE_SM_LINE1 | VS1053_MODE_SM_SDINEW); // reset playback
  Serial.println("spi1");
  SPI_write(VS1053_REG_WRAMADDR, 0x1e29); // resync
  Serial.println("spi2");
  SPI_write(VS1053_REG_WRAM, 0);
  Serial.println("spi3");
 
  currentTrack = SD.open(trackname);
  noInterrupts();
Serial.println("no interrupt");
  SPI_write(VS1053_REG_DECODETIME, 0x00);
  SPI_write(VS1053_REG_DECODETIME, 0x00);
Serial.println("spi 4+5");
  playingMusic = true;

  while (!Ready()){}
    Serial.println("!ready");
  while (playingMusic && Ready()) {feedBuffer();}
    Serial.println("feedbuffer done");

  interrupts();
  return true;
}
/*************************************************/
boolean Ready(void){
Serial.println("DREQ");
return digitalRead(MP3_DREQ);

}
/*************************************************/
void SPI_write(uint8_t addr, uint16_t data){
  Serial.println("send");
  digitalWrite(MP3_CS, LOW); 
  spiwrite(VS1053_SCI_WRITE);        //0x02
  spiwrite(addr);
  spiwrite(data >> 8);
  spiwrite(data & 0xFF);
  digitalWrite(MP3_CS, HIGH); 
  Serial.println("spi done1");

/*************************************************/
void spiwrite(uint8_t c){
  uint8_t x __attribute__ ((aligned (32))) = c;
  spiwrite(&x, 1);
    Serial.println("spi done2");
}
/*************************************************/
void spiwrite(uint8_t *c, uint16_t num){
clkportreg = portOutputRegister(digitalPinToPort(13));
clkpin = digitalPinToBitMask(13);
misoportreg = portInputRegister(digitalPinToPort(12));
misopin = digitalPinToBitMask(12);
mosiportreg = portOutputRegister(digitalPinToPort(11));
mosipin = digitalPinToBitMask(11);
 
     while (num--) {
      for (int8_t i=7; i>=0; i--) {
 *clkportreg &= ~clkpin;
  if (c[0] & (1<<i)) {
    *mosiportreg |= mosipin;
  } else {
    *mosiportreg &= ~mosipin;
  }
  *clkportreg |= clkpin;
      }
      *clkportreg &= ~clkpin;   // Make sure clock ends low

      c++;
    }
      Serial.println("spi done3");
}
/*************************************************/
void feedBuffer (void){
    Serial.println("function feedbuffer");
noInterrupts();
  if (BufferLock) {
    interrupts();
    return;
  }
  BufferLock = true;
  interrupts();
  feedBuffer_noLock();
  BufferLock = false;
    Serial.println("feedbuffer done");
}
/*************************************************/
void feedBuffer_noLock(void){
    Serial.println("function no_lock");
   if ((! playingMusic)||(! currentTrack)||(! Ready())){
    return; // paused or stopped
  }
    // Feed the hungry buffer! :)
  while (Ready()) {
    // Read some audio data from the SD card file
    int bytesread = currentTrack.read(mp3buffer, VS1053_DATABUFFERLEN);
   
    if (bytesread == 0) {
      // must be at the end of the file, wrap it up!
      playingMusic = false;
      currentTrack.close();
      break;
    }

    playData(mp3buffer, bytesread);
  }
    Serial.println("no_lock done");
}
/*************************************************/
void playData(uint8_t *buf, uint8_t buffsiz) {
  digitalWrite(MP3_DCS, LOW);
  spiwrite(buf, buffsiz);
  digitalWrite(MP3_DCS, HIGH);
    Serial.println("play data done");
}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: VS1053 sturing hangt vast in while lus

Berichtdoor shooter » 17 Okt 2019, 22:48

die playing music wordt niet uitgezet.
paul deelen
shooter@home.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten