Created
December 8, 2018 23:54
-
-
Save urish/ead989e4a3f064e245872d30bef1d8f7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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