Intermediary commit. Nothing's working, everything is broken. Let's start over now...
This commit is contained in:
99
src/player.cpp
Normal file
99
src/player.cpp
Normal file
@ -0,0 +1,99 @@
|
||||
// Based on https://github.com/mpflaga/Arduino_Library-vs1053_for_SdFat/blob/master/src/vs1053_SdFat.cpp
|
||||
|
||||
#include "player.h"
|
||||
#include "spi_master.h"
|
||||
|
||||
Player::Player(SDCard* c) {
|
||||
pinMode(XRESET, OUTPUT);
|
||||
digitalWrite(XRESET, HIGH);
|
||||
pinMode(DREQ, INPUT);
|
||||
|
||||
_init();
|
||||
}
|
||||
|
||||
void Player::_reset() {
|
||||
digitalWrite(XRESET, LOW);
|
||||
delay(50);
|
||||
digitalWrite(XRESET, HIGH);
|
||||
delay(50);
|
||||
}
|
||||
|
||||
void Player::_init() {
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV16);
|
||||
|
||||
_reset();
|
||||
uint16_t result;
|
||||
for(uint8_t x=0; x<255; x++) {
|
||||
result = _read_register(SCI_MODE, 0, x);
|
||||
if (result != 0) Serial.printf("Try %3d: 0x%04X\n", x, result);
|
||||
}
|
||||
delay(10);
|
||||
/*_read_register(SCI_MODE, SPI_CLOCK_DIV16); // First read fails for some unknown reason...
|
||||
_read_register(SCI_MODE, SPI_CLOCK_DIV16);
|
||||
_read_register(SCI_STATUS, SPI_CLOCK_DIV16);
|
||||
|
||||
_read_register(SCI_STATUS, SPI_CLOCK_DIV16);
|
||||
|
||||
|
||||
_read_register(SCI_MODE, SPI_CLOCK_DIV16);
|
||||
_read_register(SCI_MODE, SPI_CLOCK_DIV16);
|
||||
uint16_t response = _read_register(SCI_MODE, SPI_CLOCK_DIV16);
|
||||
if (response != 0x4800) {
|
||||
Serial.printf("Initialization failed. SCI_MODE was: 0x%04X. Expected: 0x4800\n", response);
|
||||
return;
|
||||
}*/
|
||||
/*_write_register(SCI_CLOCKF, 0x6000); // Set multiplier to 3x
|
||||
delay(10);
|
||||
response = _read_register(SCI_CLOCKF);
|
||||
if (response != 0x6000) {
|
||||
Serial.printf("Initialization failed. SCI_CLOCKF was: 0x%04X. Expected: 0x6000\n", response);
|
||||
return;
|
||||
}*/
|
||||
//Serial.println(result, HEX);
|
||||
}
|
||||
|
||||
inline void Player::_wait() {
|
||||
delayMicroseconds(100);
|
||||
//Serial.print("Waiting for DREQ...");
|
||||
while(!digitalRead(DREQ));
|
||||
//Serial.printf(" done (%d cycles).\n", i);
|
||||
}
|
||||
|
||||
uint16_t Player::_read_register(uint8_t address, uint32_t spi_speed, uint16_t t) {
|
||||
Serial.printf("Try %03d, querying register 0x%02X...", t, address);
|
||||
//SPI.setClockDivider(spi_speed);
|
||||
if (t & (1<<1)) _wait();
|
||||
SPIMaster::enable(PIN_VS1053_XCS);
|
||||
if (t & (1<<2)) _wait();
|
||||
//_wait();
|
||||
SPI.transfer(CMD_READ);
|
||||
if (t & (1<<3)) _wait();
|
||||
SPI.transfer(address);
|
||||
if (t & (1<<4)) _wait();
|
||||
uint8_t b1 = SPI.transfer(0xFF);
|
||||
if (t & (1<<5)) _wait();
|
||||
uint8_t b2 = SPI.transfer(0xFF);
|
||||
if (t & (1<<6)) _wait();
|
||||
|
||||
uint16_t result = b1 << 8 | b2;
|
||||
Serial.printf("Response: 0x%02X 0x%02X -> 0x%04X\n", b1, b2, result);
|
||||
if (t & (1<<7)) delay(10);
|
||||
|
||||
//_wait();
|
||||
//SPIMaster::disable();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void Player::_write_register(uint8_t address, uint16_t value, uint32_t spi_speed) {
|
||||
Serial.printf("Writing to register 0x%02X...", address);
|
||||
SPI.setClockDivider(spi_speed);
|
||||
SPIMaster::enable(PIN_VS1053_XCS);
|
||||
SPI.transfer(CMD_WRITE);
|
||||
SPI.transfer(address);
|
||||
SPI.transfer(value >> 8);
|
||||
SPI.transfer(value & 0xFF);
|
||||
_wait();
|
||||
SPIMaster::disable();
|
||||
Serial.println(" done.");
|
||||
}
|
Reference in New Issue
Block a user