This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PCM9211: Fail to program feature of PCM9211

Part Number: PCM9211

Tool/software:

Hello,

Here is my script I used to program PCM9211 over I2C interface. As I2C master I use Digital Discovery device:

from ctypes import *
from dwfconstants import *
import time

I2C_freq = 100e3
SCL_PIN = 24  # Change if needed
SDA_PIN = 25  # Change if needed

I2C_ADDR_MAX98089 = 0x10
I2C_ADDR_PCM9211 = 0x40
I2C_ADDR = I2C_ADDR_PCM9211

dwf = cdll.dwf
hdwf = c_int()
iNak = c_int()

dwf.FDwfDeviceOpen(c_int(-1), byref(hdwf))

if hdwf.value == hdwfNone.value:
    print("failed to open device")
    quit()

dwf.FDwfAnalogIOChannelNodeSet(hdwf, c_int(1), c_int(0), c_double(3.3))
dwf.FDwfAnalogIOEnableSet(hdwf, c_int(True))

print("Configuring I2C...")
iNak = c_int()
dwf.FDwfDigitalI2cRateSet(hdwf, c_double(I2C_freq))
dwf.FDwfDigitalI2cSclSet(hdwf, c_int(SCL_PIN))
dwf.FDwfDigitalI2cSdaSet(hdwf, c_int(SDA_PIN)) 
dwf.FDwfDigitalI2cClear(hdwf, byref(iNak))
if iNak.value == 0:
    print("I2C bus error. Check the pull-ups.")
    quit()
time.sleep(1)

#Configure PCM9211
# 1. To enable DIT Standalone Mode, set Register 0x6F = 0x05
DIT_Standalone_Mode_En = (0x6F, 0x05, "Enable DIT Standalone Mode, MPIO_C3 = TXDIN, MPIO_C1 = TXBCK, MPIO_C2 = TXLRCK")
# 2. Set master clock XMCKO as XTI/2, i.e. 12.288 MHz
Master_CLK_Freq = (0x24, 1<<2, "Set master clock to 12.288MHz")
# 3. Enable S/PDIF on MPO0 and XMCKO on MPO1 (p. 111)
MPO0_DITOUT = (0x78, 0x0D | 0x0C << 4, "Route DIT Output (TXOUT) to MPO0 and XMCKO to MPO1")
# 4. Select RXIN0 as the S/PDIF Input (DIR)
DIR_RXIN0 = (0x34, 0x00, "Select RXIN0 as input for DIR")
# 5. Route DIR Output to Main Output Port (MOP)
MOP_DIR = (0x6B, 0x01, "Route DIR Output to Main Output Port (MOP)")

Config_PCM9211 = (DIT_Standalone_Mode_En, Master_CLK_Freq, MPO0_DITOUT, DIR_RXIN0, MOP_DIR)
for reg_addr, reg_value, comment in Config_PCM9211:
    data = (c_ubyte*2)(reg_addr, reg_value)
    dwf.FDwfDigitalI2cWrite(hdwf, c_int(I2C_ADDR<<1), data, c_int(2), byref(iNak))
    if iNak.value != 0:
        print("Device power NAK "+str(iNak.value))
        quit()
    else:
        print(comment)

dwf.FDwfDeviceCloseAll()

Here is output:

================= RESTART: C:\Users\pyoha\Documents\WORK\Python_scripts\programming_motherboard_over_i2c.py =================
Configuring I2C...
Enable DIT Standalone Mode, MPIO_C3 = TXDIN, MPIO_C1 = TXBCK, MPIO_C2 = TXLRCK
Set master clock to 12.288MHz
Route DIT Output (TXOUT) to MPO0 and XMCKO to MPO1
Select RXIN0 as input for DIR
Route DIR Output to Main Output Port (MOP)

But when I try to measure signal at MPO1 pin of PCM9211 (using "Logic" interface of Digilent's WaveForms software), I don't see any signal ... but expect to see 12.888MHz.

  • I checked registers. The readback values are Ok:

    ======================== RESTART: C:\Users\pyoha\Documents\WORK\Python_scripts\read_i2c_divices_v1.py =======================
    Configuring I2C...
    Reading all registers from I2C device at 0x40...
    ✅ I2C Device 0x40 detected. Reading registers...
    
    
    I2C Register Values:
    Register 0x00: NACK
    Register 0x01: NACK
    Register 0x02: NACK
    Register 0x03: NACK
    Register 0x04: NACK
    Register 0x05: NACK
    Register 0x06: NACK
    Register 0x07: NACK
    Register 0x08: NACK
    Register 0x09: NACK
    Register 0x0A: NACK
    Register 0x0B: NACK
    Register 0x0C: NACK
    Register 0x0D: NACK
    Register 0x0E: NACK
    Register 0x0F: NACK
    Register 0x10: NACK
    Register 0x11: NACK
    Register 0x12: NACK
    Register 0x13: NACK
    Register 0x14: NACK
    Register 0x15: NACK
    Register 0x16: NACK
    Register 0x17: NACK
    Register 0x18: NACK
    Register 0x19: NACK
    Register 0x1A: NACK
    Register 0x1B: NACK
    Register 0x1C: NACK
    Register 0x1D: NACK
    Register 0x1E: NACK
    Register 0x1F: NACK
    Register 0x20: 0x00
    Register 0x21: 0x00
    Register 0x22: 0x01
    Register 0x23: 0x04
    Register 0x24: 0x04
    Register 0x25: 0x01
    Register 0x26: 0x01
    Register 0x27: 0x00
    Register 0x28: 0x03
    Register 0x29: 0x0C
    Register 0x2A: 0xFF
    Register 0x2B: 0xFF
    Register 0x2C: 0x00
    Register 0x2D: 0x00
    Register 0x2E: 0x00
    Register 0x2F: 0x04
    Register 0x30: 0x02
    Register 0x31: 0x1A
    Register 0x32: 0x22
    Register 0x33: 0x22
    Register 0x34: 0x00
    Register 0x35: 0x02
    Register 0x36: 0x02
    Register 0x37: 0x00
    Register 0x38: 0x80
    Register 0x39: 0x80
    Register 0x3A: 0x00
    Register 0x3B: 0x00
    Register 0x3C: 0x00
    Register 0x3D: 0x00
    Register 0x3E: NACK
    Register 0x3F: NACK
    Register 0x40: 0xC0
    Register 0x41: 0xFF
    Register 0x42: 0x02
    Register 0x43: NACK
    Register 0x44: NACK
    Register 0x45: NACK
    Register 0x46: 0xD7
    Register 0x47: 0xD7
    Register 0x48: 0x00
    Register 0x49: 0x00
    Register 0x4A: NACK
    Register 0x4B: NACK
    Register 0x4C: NACK
    Register 0x4D: NACK
    Register 0x4E: NACK
    Register 0x4F: NACK
    Register 0x50: NACK
    Register 0x51: NACK
    Register 0x52: NACK
    Register 0x53: NACK
    Register 0x54: NACK
    Register 0x55: NACK
    Register 0x56: NACK
    Register 0x57: NACK
    Register 0x58: NACK
    Register 0x59: NACK
    Register 0x5A: 0x00
    Register 0x5B: 0x00
    Register 0x5C: 0x00
    Register 0x5D: 0x00
    Register 0x5E: 0x00
    Register 0x5F: 0x00
    Register 0x60: 0x44
    Register 0x61: 0x10
    Register 0x62: 0x00
    Register 0x63: 0x00
    Register 0x64: 0x00
    Register 0x65: 0x00
    Register 0x66: 0x00
    Register 0x67: 0x00
    Register 0x68: 0x00
    Register 0x69: 0x00
    Register 0x6A: 0x00
    Register 0x6B: 0x01
    Register 0x6C: 0x00
    Register 0x6D: 0x00
    Register 0x6E: 0x0F
    Register 0x6F: 0x05
    Register 0x70: 0x00
    Register 0x71: 0x00
    Register 0x72: 0x00
    Register 0x73: 0x00
    Register 0x74: 0x00
    Register 0x75: 0x00
    Register 0x76: 0x00
    Register 0x77: 0x00
    Register 0x78: 0xCD
    Register 0x79: 0x00
    Register 0x7A: 0x00
    Register 0x7B: 0x00
    Register 0x7C: 0x00
    Register 0x7D: 0x00
    Register 0x7E: 0x00
    Register 0x7F: NACK
    Register 0x80: NACK
    Register 0x81: NACK
    Register 0x82: NACK
    Register 0x83: NACK
    Register 0x84: NACK
    Register 0x85: NACK
    Register 0x86: NACK
    Register 0x87: NACK
    Register 0x88: NACK
    Register 0x89: NACK
    Register 0x8A: NACK
    Register 0x8B: NACK
    Register 0x8C: NACK
    Register 0x8D: NACK
    Register 0x8E: NACK
    Register 0x8F: NACK
    Register 0x90: NACK
    Register 0x91: NACK
    Register 0x92: NACK
    Register 0x93: NACK
    Register 0x94: NACK
    Register 0x95: NACK
    Register 0x96: NACK
    Register 0x97: NACK
    Register 0x98: NACK
    Register 0x99: NACK
    Register 0x9A: NACK
    Register 0x9B: NACK
    Register 0x9C: NACK
    Register 0x9D: NACK
    Register 0x9E: NACK
    Register 0x9F: NACK
    Register 0xA0: 0x00
    Register 0xA1: 0x00
    Register 0xA2: 0x01
    Register 0xA3: 0x04
    Register 0xA4: 0x04
    Register 0xA5: 0x01
    Register 0xA6: 0x01
    Register 0xA7: 0x00
    Register 0xA8: 0x03
    Register 0xA9: 0x0C
    Register 0xAA: 0xFF
    Register 0xAB: 0xFF
    Register 0xAC: 0x00
    Register 0xAD: 0x00
    Register 0xAE: 0x00
    Register 0xAF: 0x04
    Register 0xB0: 0x02
    Register 0xB1: 0x1A
    Register 0xB2: 0x22
    Register 0xB3: 0x22
    Register 0xB4: 0x00
    Register 0xB5: 0x02
    Register 0xB6: 0x02
    Register 0xB7: 0x00
    Register 0xB8: 0x80
    Register 0xB9: 0x80
    Register 0xBA: 0x00
    Register 0xBB: 0x00
    Register 0xBC: 0x00
    Register 0xBD: 0x00
    Register 0xBE: NACK
    Register 0xBF: NACK
    Register 0xC0: 0xC0
    Register 0xC1: 0xFF
    Register 0xC2: 0x02
    Register 0xC3: NACK
    Register 0xC4: NACK
    Register 0xC5: NACK
    Register 0xC6: 0xD7
    Register 0xC7: 0xD7
    Register 0xC8: 0x00
    Register 0xC9: 0x00
    Register 0xCA: NACK
    Register 0xCB: NACK
    Register 0xCC: NACK
    Register 0xCD: NACK
    Register 0xCE: NACK
    Register 0xCF: NACK
    Register 0xD0: NACK
    Register 0xD1: NACK
    Register 0xD2: NACK
    Register 0xD3: NACK
    Register 0xD4: NACK
    Register 0xD5: NACK
    Register 0xD6: NACK
    Register 0xD7: NACK
    Register 0xD8: NACK
    Register 0xD9: NACK
    Register 0xDA: 0x00
    Register 0xDB: 0x00
    Register 0xDC: 0x00
    Register 0xDD: 0x00
    Register 0xDE: 0x00
    Register 0xDF: 0x00
    Register 0xE0: 0x44
    Register 0xE1: 0x10
    Register 0xE2: 0x00
    Register 0xE3: 0x00
    Register 0xE4: 0x00
    Register 0xE5: 0x00
    Register 0xE6: 0x00
    Register 0xE7: 0x00
    Register 0xE8: 0x00
    Register 0xE9: 0x00
    Register 0xEA: 0x00
    Register 0xEB: 0x01
    Register 0xEC: 0x00
    Register 0xED: 0x00
    Register 0xEE: 0x0F
    Register 0xEF: 0x05
    Register 0xF0: 0x00
    Register 0xF1: 0x00
    Register 0xF2: 0x00
    Register 0xF3: 0x00
    Register 0xF4: 0x00
    Register 0xF5: 0x00
    Register 0xF6: 0x00
    Register 0xF7: 0x00
    Register 0xF8: 0xCD
    Register 0xF9: 0x00
    Register 0xFA: 0x00
    Register 0xFB: 0x00
    Register 0xFC: 0x00
    Register 0xFD: 0x00
    Register 0xFE: 0x00
    Register 0xFF: NACK

  • Resolved, I forgot to enable quartz output (i.e. set pin4 on 0x24 to '1'):


  • Hi Pavel. Thanks for letting us know the issue is resolve.

    Regards,

    Arash