Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

dds
Michele Perla 9 vuotta sitten
vanhempi
commit
17d08ef465
4 muutettua tiedostoa jossa 93 lisäystä ja 30 poistoa
  1. +36
    -20
      control_ak4558.cpp
  2. +2
    -1
      control_ak4558.h
  3. +30
    -0
      examples/HardwareTesting/AK4558/PassthroughTest/PassthroughTest.ino
  4. +25
    -9
      examples/HardwareTesting/AK4558/SineOutTest/SineOutTest.ino

+ 36
- 20
control_ak4558.cpp Näytä tiedosto

#include "control_ak4558.h" #include "control_ak4558.h"
#include "Wire.h" #include "Wire.h"


void AudioControlAK4558::readInitConfig(void)
void AudioControlAK4558::initConfig(void)
{ {
// puts all default registers values inside an array // puts all default registers values inside an array
// this allows us to modify registers locally using annotation like follows: // this allows us to modify registers locally using annotation like follows:
// //
// after manipulation, we can write the entire register value on the CODEC // after manipulation, we can write the entire register value on the CODEC
unsigned int n = 0; unsigned int n = 0;
Wire.requestFrom(AK4558_I2C_ADDR, 10);
Wire.requestFrom(AK4558_I2C_ADDR,10);
while(Wire.available()) { while(Wire.available()) {
Serial.print("Register "); Serial.print("Register ");
Serial.print(n); Serial.print(n);
Serial.print(" = "); Serial.print(" = ");
registers[n++] = Wire.read(); registers[n++] = Wire.read();
Serial.println(registers[n-1]);
Serial.println(registers[n-1], BIN);
}
}

void AudioControlAK4558::readConfig(void)
{
// reads registers values
unsigned int n = 0;
char c = 0;
Wire.requestFrom(AK4558_I2C_ADDR, 10);
while(Wire.available()) {
Serial.print("Register ");
Serial.print(n++);
Serial.print(" = ");
c = Wire.read();
Serial.println(c, BIN);
} }
} }


Wire.beginTransmission(AK4558_I2C_ADDR); Wire.beginTransmission(AK4558_I2C_ADDR);
Wire.write(reg); Wire.write(reg);
Wire.write(val); Wire.write(val);
return (Wire.endTransmission()==0);
return (Wire.endTransmission(true)==0);
} }


bool AudioControlAK4558::enable(void) bool AudioControlAK4558::enable(void)
{ {
Serial.println("Starting setup..."); Serial.println("Starting setup...");
delay(1000); delay(1000);
Serial.println("Setup start");
// Power Up and Reset // Power Up and Reset
// Clock Setup (datasheet page 72) // Clock Setup (datasheet page 72)
pinMode(PIN_PDN, OUTPUT); pinMode(PIN_PDN, OUTPUT);
Serial.println("PDN is HIGH"); Serial.println("PDN is HIGH");
// Control register settings become available in 10ms (min.) when LDOE pin = “H” // Control register settings become available in 10ms (min.) when LDOE pin = “H”
Wire.begin(); Wire.begin();
readInitConfig();
initConfig();
// access all registers to store locally their default values // access all registers to store locally their default values
// DIF2-0, DFS1-0 and ACKS bits must be set before MCKI, LRCK and BICK are supplied // DIF2-0, DFS1-0 and ACKS bits must be set before MCKI, LRCK and BICK are supplied
Serial.println(registers[AK4558_CTRL_2], BIN); Serial.println(registers[AK4558_CTRL_2], BIN);
// MCKS1-0 = 00 (Master Clock Input Frequency Select, set 256fs for Normal Speed Mode -> 11.2896 MHz) // MCKS1-0 = 00 (Master Clock Input Frequency Select, set 256fs for Normal Speed Mode -> 11.2896 MHz)
registers[AK4558_MODE_CTRL] &= ~AK4558_BCKO0; registers[AK4558_MODE_CTRL] &= ~AK4558_BCKO0;
registers[AK4558_MODE_CTRL] |= AK4558_LOPS; //| AK4558_FS1;
// Set the DAC output to power-save mode: LOPS bit “0” → “1”
Serial.print("MODE_CTRL set to "); Serial.print("MODE_CTRL set to ");
Serial.println(registers[AK4558_MODE_CTRL], BIN); Serial.println(registers[AK4558_MODE_CTRL], BIN);
// BCKO1-0 = 00 (BICK Output Frequency at Master Mode = 32fs = 1.4112 MHz) // BCKO1-0 = 00 (BICK Output Frequency at Master Mode = 32fs = 1.4112 MHz)
// into the next address. // into the next address.
// ADC/DAC Output setup (datasheet pages 74, 75) // ADC/DAC Output setup (datasheet pages 74, 75)
registers[AK4558_PLL_CTRL] |= AK4558_PLL2;
registers[AK4558_PLL_CTRL] &= ~AK4558_PLL1;
write(AK4558_I2C_ADDR, registers[AK4558_PLL_CTRL]);
Serial.print("PLL_CTRL set to ");
Serial.println(registers[AK4558_PLL_CTRL], BIN);
delay(10);
// registers[AK4558_PLL_CTRL] |= AK4558_PLL2;
// registers[AK4558_PLL_CTRL] &= ~AK4558_PLL1;
// write(AK4558_I2C_ADDR, registers[AK4558_PLL_CTRL]);
// Serial.print("PLL_CTRL set to ");
// Serial.println(registers[AK4558_PLL_CTRL], BIN);
// delay(10);
// as per table 16, set PLL_CTRL.PLL3-2-1-0 to 0101 for MICK as PLL Reference, 11.2896 MHz // as per table 16, set PLL_CTRL.PLL3-2-1-0 to 0101 for MICK as PLL Reference, 11.2896 MHz
// also, wait 10 ms for PLL lock // also, wait 10 ms for PLL lock
// TODO: IS IT NEEDED? // TODO: IS IT NEEDED?
// Set the DAC output to power-save mode: LOPS bit “0” → “1” // Set the DAC output to power-save mode: LOPS bit “0” → “1”
registers[AK4558_MODE_CTRL] |= AK4558_FS1 | AK4558_LOPS;
write(AK4558_I2C_ADDR, registers[AK4558_MODE_CTRL]);
Serial.print("MODE_CTRL set to ");
Serial.println(registers[AK4558_MODE_CTRL], BIN);
// registers[AK4558_MODE_CTRL] |= AK4558_LOPS; //| AK4558_FS1;
// write(AK4558_I2C_ADDR, registers[AK4558_MODE_CTRL]);
// Serial.print("MODE_CTRL set to ");
// Serial.println(registers[AK4558_MODE_CTRL], BIN);
// Set up the sampling frequency (FS3-0 bits). The ADC must be powered-up in consideration of PLL // Set up the sampling frequency (FS3-0 bits). The ADC must be powered-up in consideration of PLL
// lock time. (in this case (ref. table 17): Set clock to mode 5 / 44.100 KHz) // lock time. (in this case (ref. table 17): Set clock to mode 5 / 44.100 KHz)
// Set up the audio format (Addr=03H). (in this case: TDM1-0 = 00 (Time Division Multiplexing mode OFF) by default) // Set up the audio format (Addr=03H). (in this case: TDM1-0 = 00 (Time Division Multiplexing mode OFF) by default)
// ignore this, leaving default values - DAC: Set up the digital filter mode. // ignore this, leaving default values - DAC: Set up the digital filter mode.
// ignore this, leaving default values - Set up the digital output volume (Address = 08H, 09H). // ignore this, leaving default values - Set up the digital output volume (Address = 08H, 09H).
registers[AK4558_PWR_MNGT] |= AK4558_PMADR | AK4558_PMADL | AK4558_PMDAR | AK4558_PMDAL;
write(AK4558_I2C_ADDR, registers[AK4558_PWR_MNGT]);
registers[AK4558_PWR_MNGT] |= AK4558_PMDAR | AK4558_PMDAL | AK4558_PMADR | AK4558_PMADL;
write(AK4558_PWR_MNGT, registers[AK4558_PWR_MNGT]);
Serial.print("PWR_MNGT set to "); Serial.print("PWR_MNGT set to ");
Serial.println(registers[AK4558_PWR_MNGT], BIN); Serial.println(registers[AK4558_PWR_MNGT], BIN);
delay(300); delay(300);
// Outputs of the LOUT and ROUT pins start rising. Rise time is 300ms (max.) when C = 1μF. // Outputs of the LOUT and ROUT pins start rising. Rise time is 300ms (max.) when C = 1μF.
registers[AK4558_MODE_CTRL] &= ~AK4558_LOPS; registers[AK4558_MODE_CTRL] &= ~AK4558_LOPS;
write(AK4558_I2C_ADDR, registers[AK4558_MODE_CTRL]);
write(AK4558_I2C_ADDR, registers[AK4558_MODE_CTRL]);
write(AK4558_MODE_CTRL, registers[AK4558_MODE_CTRL]);
Serial.print("MODE_CTRL set to "); Serial.print("MODE_CTRL set to ");
Serial.println(registers[AK4558_MODE_CTRL], BIN); Serial.println(registers[AK4558_MODE_CTRL], BIN);
// Release power-save mode of the DAC output: LOPS bit = “1” → “0” // Release power-save mode of the DAC output: LOPS bit = “1” → “0”
// Set LOPS bit to “0” after the LOUT and ROUT pins output “H”. Sound data will be output from the // Set LOPS bit to “0” after the LOUT and ROUT pins output “H”. Sound data will be output from the
// LOUT and ROUT pins after this setting. // LOUT and ROUT pins after this setting.
Serial.println("Setup ended"); Serial.println("Setup ended");
write(AK4558_ROUT_VOL,255); //dummy write to last register to reset address counter to 0
return true; return true;
} }

+ 2
- 1
control_ak4558.h Näytä tiedosto

bool inputSelect(int n) { return false; } bool inputSelect(int n) { return false; }
protected: protected:
unsigned int registers[10]; unsigned int registers[10];
void readInitConfig(void);
void initConfig(void);
void readConfig(void);
bool write(unsigned int reg, unsigned int val); bool write(unsigned int reg, unsigned int val);
}; };



+ 30
- 0
examples/HardwareTesting/AK4558/PassthroughTest/PassthroughTest.ino Näytä tiedosto

/*
* AK4558 Passthrough Test
* 2015 by Michele Perla
*
* A simple hardware test which receives audio from the HiFi Audio CODEC Module
* LIN/RIN pins and send it to the LOUT/ROUT pins
*
*/

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

AudioInputI2S i2s1;
AudioOutputI2S i2s2;
AudioConnection patchCord1(i2s1, 0, i2s2, 0);
AudioConnection patchCord2(i2s1, 1, i2s2, 1);
AudioControlAK4558 ak4558;

void setup() {
// put your setup code here, to run once:
AudioMemory(12);
while (!Serial);
ak4558.enable();
}

void loop() {
}

+ 25
- 9
examples/HardwareTesting/AK4558/SineOutTest/SineOutTest.ino Näytä tiedosto

/*
* AK4558 Sine Out Test
* 2015 by Michele Perla
*
* A simple hardware test which sends two 440 Hz sinewaves to the
* LOUT/ROUT pins of the HiFi Audio CODEC Module. One of the waves
* is out-of-phase by 90° with the other.
*
*/

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


// GUItool: begin automatically generated code
AudioSynthWaveformSine sine2; //xy=309,245
AudioSynthWaveformSine sine1; //xy=320,133
AudioOutputI2S i2s2; //xy=460,178
AudioConnection patchCord1(sine2, 0, i2s2, 1);
AudioConnection patchCord2(sine1, 0, i2s2, 0);
AudioControlAK4558 ak4558; //xy=172,178
// GUItool: end automatically generated code
AudioSynthWaveformSine sine2;
AudioSynthWaveformSine sine1;
AudioOutputI2S i2s1;
AudioConnection patchCord1(sine2, 0, i2s1, 0);
AudioConnection patchCord2(sine1, 0, i2s1, 1);
AudioControlAK4558 ak4558;
int phase = 0;


void setup() { void setup() {
// put your setup code here, to run once: // put your setup code here, to run once:
ak4558.enable(); ak4558.enable();
AudioNoInterrupts(); AudioNoInterrupts();
sine1.frequency(440); sine1.frequency(440);
sine2.frequency(220);
sine2.frequency(440);
sine1.amplitude(1.0); sine1.amplitude(1.0);
sine2.amplitude(1.0); sine2.amplitude(1.0);
AudioInterrupts(); AudioInterrupts();
} }


void loop() { void loop() {
phase+=10;
if (phase==360) phase=0;
AudioNoInterrupts();
sine2.phase(phase);
AudioInterrupts();
delay(250);
} }

Loading…
Peruuta
Tallenna