|
-
-
- #include <Arduino.h>
- #include "control_wm8731.h"
- #include "Wire.h"
-
- #define WM8731_I2C_ADDR 0x1A
-
-
- #define WM8731_REG_LLINEIN 0
- #define WM8731_REG_RLINEIN 1
- #define WM8731_REG_LHEADOUT 2
- #define WM8731_REG_RHEADOUT 3
- #define WM8731_REG_ANALOG 4
- #define WM8731_REG_DIGITAL 5
- #define WM8731_REG_POWERDOWN 6
- #define WM8731_REG_INTERFACE 7
- #define WM8731_REG_SAMPLING 8
- #define WM8731_REG_ACTIVE 9
- #define WM8731_REG_RESET 15
-
- bool AudioControlWM8731::enable(void)
- {
- Wire.begin();
- delay(5);
- #if 1
- if (!write(WM8731_REG_RESET, 0)) {
- return false;
- }
- #endif
- write(WM8731_REG_INTERFACE, 0x02);
- write(WM8731_REG_SAMPLING, 0x20);
-
-
-
-
-
- write(WM8731_REG_DIGITAL, 0x08);
- write(WM8731_REG_ANALOG, 0x00);
-
- write(WM8731_REG_POWERDOWN, 0x00);
-
- write(WM8731_REG_LHEADOUT, 0x80);
- write(WM8731_REG_RHEADOUT, 0x80);
-
- delay(100);
-
- write(WM8731_REG_ACTIVE, 1);
- delay(5);
- write(WM8731_REG_DIGITAL, 0x00);
- write(WM8731_REG_ANALOG, 0x10);
-
- return true;
- }
-
-
-
-
-
-
-
- bool AudioControlWM8731::write(unsigned int reg, unsigned int val)
- {
- int attempt=0;
- while (1) {
- attempt++;
- Wire.beginTransmission(WM8731_I2C_ADDR);
- Wire.write((reg << 1) | ((val >> 8) & 1));
- Wire.write(val & 0xFF);
- int status = Wire.endTransmission();
- if (status == 0) {
-
- return true;
- }
- if (attempt >= 12) {
-
- return false;
- }
- delayMicroseconds(80);
- }
- }
-
- bool AudioControlWM8731::volumeInteger(unsigned int n)
- {
-
-
-
- if (n > 127) n = 127;
-
-
- write(WM8731_REG_LHEADOUT, n | 0x180);
- write(WM8731_REG_RHEADOUT, n | 0x80);
- return true;
- }
-
- bool AudioControlWM8731::inputLevel(float n)
- {
-
-
- int _level = int(n * 31.f);
-
- _level = _level > 0x1F ? 0x1F : _level;
- write(WM8731_REG_LLINEIN, _level);
- write(WM8731_REG_RLINEIN, _level);
- return true;
- }
-
- bool AudioControlWM8731::inputSelect(int n)
- {
- if (n == AUDIO_INPUT_LINEIN) {
- write(WM8731_REG_ANALOG, 0x12);
- } else if (n == AUDIO_INPUT_MIC) {
- write(WM8731_REG_ANALOG, 0x15);
- } else {
- return false;
- }
- return true;
- }
-
-
-
-
- bool AudioControlWM8731master::enable(void)
- {
- Wire.begin();
- delay(5);
-
-
- write(WM8731_REG_INTERFACE, 0x42);
- write(WM8731_REG_SAMPLING, 0x20);
-
-
-
-
-
- write(WM8731_REG_DIGITAL, 0x08);
- write(WM8731_REG_ANALOG, 0x00);
-
- write(WM8731_REG_POWERDOWN, 0x00);
-
- write(WM8731_REG_LHEADOUT, 0x80);
- write(WM8731_REG_RHEADOUT, 0x80);
-
- delay(100);
-
- write(WM8731_REG_ACTIVE, 1);
- delay(5);
- write(WM8731_REG_DIGITAL, 0x00);
- write(WM8731_REG_ANALOG, 0x10);
-
- return true;
- }
-
-
|