Browse Source

Add ability to control two SGTL5000 chips

dds
PaulStoffregen 8 years ago
parent
commit
54ce35d3ff
4 changed files with 84 additions and 5 deletions
  1. +13
    -5
      control_sgtl5000.cpp
  2. +3
    -0
      control_sgtl5000.h
  3. +67
    -0
      examples/HardwareTesting/SGTL5000/QuadChannelOutput/QuadChannelOutput.ino
  4. +1
    -0
      keywords.txt

+ 13
- 5
control_sgtl5000.cpp View File

#define DAP_COEF_WR_A2_MSB 0x0138 #define DAP_COEF_WR_A2_MSB 0x0138
#define DAP_COEF_WR_A2_LSB 0x013A #define DAP_COEF_WR_A2_LSB 0x013A


#define SGTL5000_I2C_ADDR 0x0A // CTRL_ADR0_CS pin low (normal configuration)
//#define SGTL5000_I2C_ADDR 0x2A // CTRL_ADR0_CS pin high
#define SGTL5000_I2C_ADDR_CS_LOW 0x0A // CTRL_ADR0_CS pin low (normal configuration)
#define SGTL5000_I2C_ADDR_CS_HIGH 0x2A // CTRL_ADR0_CS pin high




void AudioControlSGTL5000::setAddress(uint8_t level)
{
if (level == LOW) {
i2c_addr = SGTL5000_I2C_ADDR_CS_LOW;
} else {
i2c_addr = SGTL5000_I2C_ADDR_CS_HIGH;
}
}


bool AudioControlSGTL5000::enable(void) bool AudioControlSGTL5000::enable(void)
{ {
unsigned int AudioControlSGTL5000::read(unsigned int reg) unsigned int AudioControlSGTL5000::read(unsigned int reg)
{ {
unsigned int val; unsigned int val;
Wire.beginTransmission(SGTL5000_I2C_ADDR);
Wire.beginTransmission(i2c_addr);
Wire.write(reg >> 8); Wire.write(reg >> 8);
Wire.write(reg); Wire.write(reg);
if (Wire.endTransmission(false) != 0) return 0; if (Wire.endTransmission(false) != 0) return 0;
if (Wire.requestFrom(SGTL5000_I2C_ADDR, 2) < 2) return 0;
if (Wire.requestFrom((int)i2c_addr, 2) < 2) return 0;
val = Wire.read() << 8; val = Wire.read() << 8;
val |= Wire.read(); val |= Wire.read();
return val; return val;
bool AudioControlSGTL5000::write(unsigned int reg, unsigned int val) bool AudioControlSGTL5000::write(unsigned int reg, unsigned int val)
{ {
if (reg == CHIP_ANA_CTRL) ana_ctrl = val; if (reg == CHIP_ANA_CTRL) ana_ctrl = val;
Wire.beginTransmission(SGTL5000_I2C_ADDR);
Wire.beginTransmission(i2c_addr);
Wire.write(reg >> 8); Wire.write(reg >> 8);
Wire.write(reg); Wire.write(reg);
Wire.write(val >> 8); Wire.write(val >> 8);

+ 3
- 0
control_sgtl5000.h View File

class AudioControlSGTL5000 : public AudioControl class AudioControlSGTL5000 : public AudioControl
{ {
public: public:
AudioControlSGTL5000(void) : i2c_addr(0x0A) { }
void setAddress(uint8_t level);
bool enable(void); bool enable(void);
bool disable(void) { return false; } bool disable(void) { return false; }
bool volume(float n) { return volumeInteger(n * 129 + 0.499); } bool volume(float n) { return volumeInteger(n * 129 + 0.499); }
bool muted; bool muted;
bool volumeInteger(unsigned int n); // range: 0x00 to 0x80 bool volumeInteger(unsigned int n); // range: 0x00 to 0x80
uint16_t ana_ctrl; uint16_t ana_ctrl;
uint8_t i2c_addr;
unsigned char calcVol(float n, unsigned char range); unsigned char calcVol(float n, unsigned char range);
unsigned int read(unsigned int reg); unsigned int read(unsigned int reg);
bool write(unsigned int reg, unsigned int val); bool write(unsigned int reg, unsigned int val);

+ 67
- 0
examples/HardwareTesting/SGTL5000/QuadChannelOutput/QuadChannelOutput.ino View File

// Quad channel output test
// Play two WAV files on two audio shields.
//
// TODO: add info about required hardware connections here....
//
// Data files to put on your SD card can be downloaded here:
// http://www.pjrc.com/teensy/td_libs_AudioDataFiles.html
//
// This example code is in the public domain.

#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

AudioPlaySdWav playSdWav1;
AudioPlaySdWav playSdWav2;
AudioOutputI2SQuad audioOutput;
AudioConnection patchCord1(playSdWav1, 0, audioOutput, 0);
AudioConnection patchCord2(playSdWav1, 1, audioOutput, 1);
AudioConnection patchCord3(playSdWav2, 0, audioOutput, 2);
AudioConnection patchCord4(playSdWav2, 1, audioOutput, 3);
AudioControlSGTL5000 sgtl5000_1;
AudioControlSGTL5000 sgtl5000_2;

// Use these with the audio adaptor board
#define SDCARD_CS_PIN 10
#define SDCARD_MOSI_PIN 7
#define SDCARD_SCK_PIN 14

void setup() {
Serial.begin(9600);
AudioMemory(10);
sgtl5000_1.setAddress(LOW);
sgtl5000_1.enable();
sgtl5000_1.volume(0.5);

sgtl5000_2.setAddress(HIGH);
sgtl5000_2.enable();
sgtl5000_2.volume(0.5);

SPI.setMOSI(SDCARD_MOSI_PIN);
SPI.setSCK(SDCARD_SCK_PIN);
if (!(SD.begin(SDCARD_CS_PIN))) {
// stop here, but print a message repetitively
while (1) {
Serial.println("Unable to access the SD card");
delay(500);
}
}
}

void loop() {
if (playSdWav1.isPlaying() == false) {
Serial.println("Start playing 1");
playSdWav1.play("SDTEST2.WAV");
delay(10); // wait for library to parse WAV info
}
if (playSdWav2.isPlaying() == false) {
Serial.println("Start playing 2");
playSdWav2.play("SDTEST4.WAV");
delay(10); // wait for library to parse WAV info
}
}


+ 1
- 0
keywords.txt View File

trigger KEYWORD2 trigger KEYWORD2
length KEYWORD2 length KEYWORD2
threshold KEYWORD2 threshold KEYWORD2
setAddress KEYWORD2
enable KEYWORD2 enable KEYWORD2
enableIn KEYWORD2 enableIn KEYWORD2
enableOut KEYWORD2 enableOut KEYWORD2

Loading…
Cancel
Save