Was able to control the DAC with ARDUINO. Here are the switch settings for S/W control (and the switch settings for H/W control on the right).
Spent hours debugging the code and programming most of the registers. It turned out that I was trying to be too smart and added the write bit to the DAC 7-bit DAC address. Only after re-reading the Arduino Wire Library did I realize that wire.begingTransmission() only needs the 7-bit address.
Note: the I2S switch sets the address of the DAC (for I2C communication purposes). The WM8741 can have one of two addresses:
0011010 (or 0x1A) I2S switch=0
0011011 (or 0x1B) I2S switch=1
In my case I set the switch=1 because that is the address I use in my code (0x1B)
Here is some info from the WM8741 datasheet (page 5):
So in summary:
I2S: try 0 or 1 to determine the address of the chip
DSD: Z
DEEPH: Z
MODE: Z (for I2C mode)
IWO: Z
DIFFHW: 0 (for s/w mode)
FSEL: Z
MUTE: try 1 for "Normal operation"
OSR: Z
So the only switches to adjust/try in S/W mode are I2S and MUTE
Spent hours debugging the code and programming most of the registers. It turned out that I was trying to be too smart and added the write bit to the DAC 7-bit DAC address. Only after re-reading the Arduino Wire Library did I realize that wire.begingTransmission() only needs the 7-bit address.
Note: the I2S switch sets the address of the DAC (for I2C communication purposes). The WM8741 can have one of two addresses:
0011010 (or 0x1A) I2S switch=0
0011011 (or 0x1B) I2S switch=1
In my case I set the switch=1 because that is the address I use in my code (0x1B)
Here is some info from the WM8741 datasheet (page 5):
- I2S: in 2-wire s/w mode (using I2C protocol), this sets the address of the device. I would assume setting it low gives one address and setting it high gives the other address
- DIFFHW: 0= normal; 1= MONO. IMPORTANT: for s/w operation this has to be set to zero. If set to one it assumes h/w mode
- With DIFFHW=0, then MODE=Z for 2-wire control (I2C protocol); MODE=1 is for 3-wire protocol. When in s/w mode, register 8 is used to set the chip in stereo or mono mode
- OSR is unused
- IWO is an output, so set to Z
- DSD and DEEMPH must be set to Z because these become the control wires to the controller in s/w mode
- MUTE: 0= Mute active; 1= Normal operation
- FSEL: Unused.
So in summary:
I2S: try 0 or 1 to determine the address of the chip
DSD: Z
DEEPH: Z
MODE: Z (for I2C mode)
IWO: Z
DIFFHW: 0 (for s/w mode)
FSEL: Z
MUTE: try 1 for "Normal operation"
OSR: Z
So the only switches to adjust/try in S/W mode are I2S and MUTE
2 comments:
Congratulations! And thanks for the blog. I've been thinking of doing exactly the same thing with a WM8741 and Arduino.
Thank you very much. It was a very enjoyable project. I'll add more detail in the next few days.
glt
Post a Comment