Skip to content

Instantly share code, notes, and snippets.

@urish
Created December 8, 2018 23:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save urish/ead989e4a3f064e245872d30bef1d8f7 to your computer and use it in GitHub Desktop.
Save urish/ead989e4a3f064e245872d30bef1d8f7 to your computer and use it in GitHub Desktop.
/*
0.20 -> D11 [MISO]
0.22 -> D13 [SCK]
0.24 -> D10 [CS]
1.00 -> D12 [MOSI]
0.02 -> A4 [xCS]
1.16 -> A3 [xDCS]
1.13 -> A2 [dReq]
1.10 -> A1 [xReset]
*/
#define xReset A1
#define xDCS A3
#define xCS A4
#define _cs D10
#define _dReq A2
#define VS_WRITE_COMMAND (0x02)
#define VS_READ_COMMAND (0x03)
#define SPI_MODE (0x0)
#define SPI_STATUS (0x1)
#define SPI_BASS (0x2)
#define SPI_CLOCKF (0x3)
#define SPI_DECODE_TIME (0x4)
#define SPI_AUDATA (0x5)
#define SPI_WRAM (0x6)
#define SPI_WRAMADDR (0x7)
#define SPI_HDAT0 (0x8)
#define SPI_HDAT1 (0x9)
#define SPI_AIADDR (0xa)
#define SPI_VOL (0xb)
#define SPI_AICTRL0 (0xc)
#define SPI_AICTRL1 (0xd)
#define SPI_AICTRL2 (0xe)
#define SPI_AICTRL3 (0xf)
#define SM_DIFF (0x01)
#define SM_JUMP (0x02)
#define SM_RESET (0x04)
#define SM_OUTOFWAV (0x08)
#define SM_PDOWN (0x10)
#define SM_TESTS (0x20)
#define SM_STREAM (0x40)
#define SM_PLUSV (0x80)
#define SM_DACT (0x100)
#define SM_SDIORD (0x200)
#define SM_SDISHARE (0x400)
#define SM_SDINEW (0x800)
#define SM_ADPCM (0x1000)
#define SM_ADPCM_HP (0x2000)
uint16_t sciRead(uint8_t addr) {
uint16_t data;
digitalWrite(xCS, LOW);
SPI.transfer(VS_READ_COMMAND);
SPI.transfer(addr);
delayMicroseconds(10);
data = SPI.transfer(0);
data <<= 8;
data |= SPI.transfer(0);
digitalWrite(xCS, HIGH);
return data;
}
void sciWrite(uint8_t addr, uint16_t data) {
digitalWrite(xCS, LOW);
SPI.transfer(VS_WRITE_COMMAND);
SPI.transfer(addr);
SPI.transfer(data >> 8);
SPI.transfer(data & 0xFF);
digitalWrite(xCS, HIGH);
}
void waitForDREQ() {
Serial.print("Wait for DREQ: ");
while (!digitalRead(_dReq));
Serial.println("Done!");
}
void softReset(void) {
sciWrite(SPI_MODE, SM_SDINEW | SM_RESET);
delay(2);
waitForDREQ();
sciWrite(SPI_HDAT0, 0xABAD);
sciWrite(SPI_HDAT1, 0x1DEA);
delay(100);
Serial.printlnf("Sanity: %04x, %04x", sciRead(SPI_HDAT0), sciRead(SPI_HDAT1));
sciWrite(SPI_CLOCKF, 0xC000);
sciWrite(SPI_AUDATA, 0xBB81);
sciWrite(SPI_BASS, 0x0055);
sciWrite(SPI_VOL, 0x4040);
waitForDREQ();
}
void setVolume(uint8_t left, uint8_t right) {
uint16_t v = (left << 8) | right;
sciWrite(SPI_VOL, v);
}
void resetPlayer() {
digitalWrite(xReset, LOW);
delay(100);
digitalWrite(xCS, HIGH);
digitalWrite(xDCS, HIGH);
digitalWrite(xReset, HIGH);
delay(100);
softReset();
delay(100);
sciWrite(SPI_CLOCKF, 0x6000);
setVolume(40, 40);
}
void sineTest(uint8_t n, uint16_t ms) {
resetPlayer();
uint16_t mode = sciRead(SPI_MODE);
mode |= 0x0020;
sciWrite(SPI_MODE, mode);
waitForDREQ();
digitalWrite(xDCS, LOW);
SPI.transfer(0x53);
SPI.transfer(0xEF);
SPI.transfer(0x6E);
SPI.transfer(n);
SPI.transfer(0x00);
SPI.transfer(0x00);
SPI.transfer(0x00);
SPI.transfer(0x00);
digitalWrite(xDCS, HIGH);
delay(ms);
digitalWrite(xDCS, LOW);
SPI.transfer(0x45);
SPI.transfer(0x78);
SPI.transfer(0x69);
SPI.transfer(0x74);
SPI.transfer(0x00);
SPI.transfer(0x00);
SPI.transfer(0x00);
SPI.transfer(0x00);
digitalWrite(xDCS, HIGH);
}
void setup() {
Serial.begin();
delay(2000);
Serial.println("Start");
SPI.begin();
pinMode(xReset, OUTPUT);
pinMode(xDCS, OUTPUT);
pinMode(xCS, OUTPUT);
pinMode(_cs, OUTPUT);
pinMode(_dReq, INPUT);
digitalWrite(_cs, HIGH);
digitalWrite(xDCS, HIGH);
resetPlayer();
Serial.printlnf("Audio device ready! Status: %02x", sciRead(SPI_STATUS));
}
void loop() {
sineTest(0x44, 1500);
Serial.printlnf("Status: %02x", sciRead(SPI_STATUS));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment