搜索
bottom↓
回复: 35

自己做了一个XMOS小解码器

[复制链接]

出0入0汤圆

发表于 2018-4-26 20:38:12 | 显示全部楼层 |阅读模式
本帖最后由 Archer_Emiya 于 2018-4-26 20:39 编辑

一直想自己搞个小USB解码器玩玩,买了两片XMOS的XHRA芯片,-一直墨迹墨迹的,这两天终于弄好了,因为用的CS4398,只能播放192khz和DSD64。试过飞线到ES9038Q2M的解码板上,可以支持384khz和DSD128,不过把USB的PID和UID改成了FIIO的,用的FIIO的驱动.
用XHRA还是挺简单的,修改修改配置文件就行了,倒是做板子没注意,导出gerber的时候把一个2D线导成了铜线,搞的板子好几个地方连起来了,最后只能各种割。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2018-4-26 21:50:59 | 显示全部楼层
很厉害,支持支持

出0入25汤圆

发表于 2018-4-26 22:32:44 | 显示全部楼层
厉害啊,能发点参考资料吗

出0入0汤圆

发表于 2018-4-26 22:40:01 | 显示全部楼层
一直想玩玩XMOS的芯片,可一直没时间

出0入54汤圆

发表于 2018-4-26 23:00:10 | 显示全部楼层
左边小板上的QFN封装的是什么芯片啊

出20入0汤圆

发表于 2018-4-27 03:09:35 | 显示全部楼层
板子很漂亮  赞

出0入0汤圆

 楼主| 发表于 2018-4-27 07:31:03 | 显示全部楼层
lusson 发表于 2018-4-26 23:00
左边小板上的QFN封装的是什么芯片啊

本来还准备加个蓝牙的,可惜信号切换有些问题,在上面是个摆设

出0入0汤圆

发表于 2018-4-27 07:43:03 | 显示全部楼层
niubility啊,拖延症总算结束了。。

出0入0汤圆

 楼主| 发表于 2018-4-27 07:45:51 | 显示全部楼层
https://www.xmos.com/support/boards?product=18340
资料可以从这个上面下载

出0入0汤圆

 楼主| 发表于 2018-4-27 07:48:18 | 显示全部楼层
###################################################
# Copyright (c) 2015, XMOS Ltd, All rights reserved

# Disclaimer:
# XMOS uses the SABRE9018Q2C DAC chip, an ESS Technology device.  
# "ESS Technology", "ESS Technology, Inc" "SABRE" and "ESS" are
# trademarks or service marks of ESS. ESS' trademarks may not be
# used in connection with any product or service that is not ESS',
# in any manner that is likely to cause confusion among customers,
# or in any manner that disparages or discredits ESS. ESS reserves
# all intellectual property rights concerning hardware design and
# software included in the SABRE9018Q2C DAC. Copying, distribution
# and any other use of hardware design and software is prohibited
# without written permission of ESS, except and only to the extent
# otherwise provided in regulations of mandatory law.

####################################################################
# xCORE-AUDIO Hi-Res 2 DAC/HPA reference platform configuration file
####################################################################

# USB Identification

VENDOR_ID = 0x20B1 //这个和下一个PID可以修改成fiio或者其他厂家的

PRODUCT_ID = 0x3066

# Format of the given USB strings
#         ASCII = 0
#   UNICODE = 1
# If format is mentioned as 1 (UNICODE), then the following
# USB strings are interpreted as unicode instead of ascii.
STRING_FORMAT = 0

VENDOR_STRING = "XMOS"

PRODUCT_STRING = "xCORE-AUDIO Hi-Res 2"

SERIAL_STRING = ''

LANGUAGE_ID = 0x0409

# Power options

MAX_POWER = 0xFA

SELF_POWER_ENABLE = 0

# USB Audio class 1.0 enable/disable

UAC_1_ENABLE = 0

# USB HID inputs enable/disable

HID_INPUTS_ENABLE = 0

# I2S data formats
#         I2S_DEFAULT = 0
#         I2S_LEFT_ALIGNED = 1
#        I2S_RIGHT_ALIGNED = 2
#
I2S_DATA_FORMAT = 0

# Audio sample rates enable/disable
# Bitmap to enable/disable each supported sample rate.
#     |  Bit7  |  Bit6  |  Bit5  |  Bit4  |  Bit3  |  Bit2  |  Bit1  |  Bit0  |
#     | 352.8K | 176.4K | 88.2K  | 44.1K  |  384K  |  192K  |  96K   |  48K   |

SAMPLE_RATE_BITMAP = 0b11111111

# Any variables required for writing event actions can be declared here
# Example: I2C address of the DAC can be set as a variable called
# DAC_I2C_ADDR = 0x48; For ease of writing I2C_WRITE command, the register
# addresses can also be set to variables.

# DAC I2C address
SABRE9018Q2C_I2C_ADDR = 0x48
# PLL I2C address
SI5351A_I2C_ADDR = 0x62

# DAC register addresses
SABRE9018Q2C_INPUT_CONFIG   = 0x01 # Register 1 - Input Config
SABRE9018Q2C_GEN_SETTING    = 0x07 # Register 7 - General Settings
SABRE9018Q2C_MASTER_MODE    = 0x0A # Register 10 - Master Mode Control

SABRE9018Q2C_SOFT_START     = 0x0E # Register 14 - Soft Start Settings
SABRE9018Q2C_VOLUME1        = 0x0F # Register 15 - Volume 1
SABRE9018Q2C_VOLUME2        = 0x10 # Register 16 - Volume 2

SABRE9018Q2C_CHIP_STATUS    = 0x40 # Register 64 - Chip Status
SABRE9018Q2C_HP_AMP_CTRL    = 0x2A # Register 42 - Headphone Amp Control

# PLL register addresses
SI5351A_OE_CTRL       = 0x03  # Register 3  - Output Enable Control
SI5351A_FANOUT_EN     = 0xBB  # Register 187 - Fanout Enable Control

SI5351A_MS0_R0_DIV    = 0x2C  # Register 44 - Multisynth0 Parameters - R0_DIV[2:0], MS0_DIVBY4[1:0] and MS0_P1[17:16];
SI5351A_MS2_R2_DIV    = 0x3C  # Register 60 - Multisynth2 Parameters - R2_DIV[2:0], MS2_DIVBY4[1:0] and MS2_P1[17:16];

SI5351A_CLK0_CTRL     = 0x10  # Register 16 - CLK0 Control
SI5351A_MS0_P1_UPPER  = 0x2D  # Register 45 - Multisynth0 Parameters - MS0_P1[15:8]
SI5351A_MS0_P2_LOWER  = 0x31  # Register 49 - Multisynth0 Parameters - MS0_P2[7:0]

SI5351A_CLK2_CTRL     = 0x12  # Register 18 - CLK2 Control
SI5351A_MS2_P1_UPPER  = 0x3D  # Register 61 - Multisynth2 Parameters - MS2_P1[15:8]
SI5351A_MS2_P2_LOWER  = 0x41  # Register 65 - Multisynth2 Parameters - MS2_P2[7:0]

#GPIO variables
GPIO_DAC_RST_N = 3   # GPIO_3 is connected to DAC's reset line
GPIO_LED_A = 0  # GPIO_0 is connected to LED A
GPIO_LED_B = 1  # GPIO_1 is connected to LED B

# Events and their actions

# System initialize event
EVT_SYS_INIT = [
        GPIO(GPIO_DAC_RST_N, LOW), #// DAC in reset
        I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_OE_CTRL, 0xFD), # Disable CLK0 (MCLK_IN) and CLK2 (MCLK_DAC)
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_FANOUT_EN, 0xD0), # Enable Fanout of MS0
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_CLK2_CTRL, 0X69), # Setup CLK2 ouput
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_MS0_R0_DIV, 0X10), # Change R0 divider 2
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_MS2_R2_DIV, 0X30), # Change R2 divider 8
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_MS0_P2_LOWER, 0X00), # Write lower bits of P2
    DELAY_MS(1), # 1ms delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR, SI5351A_OE_CTRL, 0XF8), # Enable all the clock outputs
   
    GPIO(GPIO_DAC_RST_N, HIGH), # DAC out of reset
    DELAY_MS(1), # 1ms delay for DAC
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Set soft_start to 0: Ramp the output to ground
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set cpw_en_oe and sw_ctrl_oe to 1
    # DAC in "Programming" state now
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S, 32 bit
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_MASTER_MODE, 0x12), # DAC in synchronous mode
    # Both channels volumes to full scale -0dBFS.
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_VOLUME1, 0x06),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_VOLUME2, 0x06),
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
        ]

# USB connected event
EVT_USB_CONNECT = [
    GPIO(GPIO_LED_A, HIGH),
    ]

# USB disconnected event
EVT_USB_DISCONNECT = [
    GPIO(GPIO_LED_A, LOW),
    ]

# Audio streaming started event
EVT_STRM_START = [
    GPIO(GPIO_LED_B, HIGH),
    ]

# Audio streaming stopped event
EVT_STRM_STOP = [
    GPIO(GPIO_LED_B, LOW),
    ]

# Event on host selecting 48KHz sample rate
EVT_SEL_48K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x4D), # PLLA - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x05), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x30), # Change R2 divider to 8
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1  
]

# Event on host selecting 96KHz sample rate
EVT_SEL_96K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x4D), # PLLA - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x05), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x20), # Change R2 divider to 4
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1  
]

# Event on host selecting 192KHz sample rate   
EVT_SEL_192K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x4D), # PLLA - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x05), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x10), # Change R2 divider to 2
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
]

# Event on host selecting 384KHz sample rate
EVT_SEL_384K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x4D), # PLLA - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x05), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x00), # Change R2 divider to 1
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
]

# Event on host selecting 44.1KHz sample rate
EVT_SEL_44_1K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 22.5792MHz (44.1,88.2,176.4kHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x6D), # PLLB - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x07), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x30), # Change R2 divider to 8
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1  
]

# Event on host selecting 88.2KHz sample rate
EVT_SEL_88_2K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x6D), # PLLB - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x07), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x20), # Change R2 divider to 4
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1  
]

# Event on host selecting 176.4KHz sample rate
EVT_SEL_176_4K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x6D), # PLLB - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x07), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x10), # Change R2 divider to 2
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
]

# Event on host selecting 352.8KHz sample rate
EVT_SEL_352_8K = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    # MCLK = 24.576MHz (48,96,192KHz)
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x6D), # PLLB - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x07), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x00), # Change R2 divider to 1
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x80), # DAC input config - I2S - 32 bit
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
]

# DSD active event
EVT_DSD_ACTIVE = [
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x0A), # Get DAC to "Programming" mode
    DELAY_MS(100),
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_HP_AMP_CTRL, 0x25), # Set amp_en to '0'
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xFD), # Disable the CLK0 and CLK2 outputs
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_CLK0_CTRL, 0x6D), # PLLB - source for MS0, MS0 - source of CLK0, 4mA drive strength
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P1_UPPER, 0x07), # Set P1 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS0_P2_LOWER, 0x00), # Write lower bits of P2 divider
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_MS2_R2_DIV, 0x00), # Change R2 divider to 1
    DELAY_MS(1), # Delay for MultiSynth output to settle
    I2C_WRITE(SI5351A_I2C_ADDR,SI5351A_OE_CTRL, 0xF8), # Enable all the clock outputs
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR,SABRE9018Q2C_INPUT_CONFIG, 0x83), # DAC input config - DSD
    # Get DAC to HiFi state
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_HP_AMP_CTRL, 0x65), # Enable the Headphone amp
    I2C_WRITE(SABRE9018Q2C_I2C_ADDR, SABRE9018Q2C_SOFT_START, 0x8A), # Set soft_start to 1
]

# PCM active event
EVT_PCM_ACTIVE = []

# Event on host selecting DSD128 format
EVT_SEL_DSD128 = []

# Event on host selecting DSD64 format
EVT_SEL_DSD64 = []

出0入0汤圆

 楼主| 发表于 2018-4-27 07:52:43 | 显示全部楼层
配置文件里面基本是以事件来驱动的,所有的事件都是固定好的,我们只要修改EVT_XXX里面的代码就行了,其实也就是切换MCLK频率,设置DAC,点点指示灯。原来板子上用的SI5351不建议用,这货需要出厂定制,没办法直接用,所以我直接用的晶振

出0入0汤圆

发表于 2018-4-27 08:52:16 | 显示全部楼层
Archer_Emiya 发表于 2018-4-27 07:48
###################################################
# Copyright (c) 2015, XMOS Ltd, All rights reser ...

请教一下,这些代码用来干什么的?
是xmos控制dac,跟晶振的代码吗?

出0入0汤圆

 楼主| 发表于 2018-4-27 09:00:38 | 显示全部楼层
luhuaneda 发表于 2018-4-27 08:52
请教一下,这些代码用来干什么的?
是xmos控制dac,跟晶振的代码吗?

一个配置文件,在里面把功能配置好了,用自带的程序编译一下就生成了固件。
这个代码是官方的开发板的配置,那个板子上面用的时钟是PLL芯片SI5351生成的,DAC是9018Q2C。
我实际使用的是晶振和CS4398,需要修改DAC的地址,以及寄存器设置,还要根据44.1和48倍频切换22.5792MHZ和24.576MHZ的晶振。
这个里面的设置都是固定的函数,有个文档里面有详细的介绍

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2018-4-27 09:20:21 | 显示全部楼层
吧xmos做成核心板类型更多玩法(烧钱之路)

出0入0汤圆

发表于 2018-4-27 09:21:20 | 显示全部楼层
Archer_Emiya 发表于 2018-4-27 09:00
一个配置文件,在里面把功能配置好了,用自带的程序编译一下就生成了固件。
这个代码是官方的开发板的配 ...

经lz讲解,了解这个ic的工作方式。谢谢
这ic 有spi的驱动方式吗。

出110入8汤圆

发表于 2018-4-27 09:24:50 | 显示全部楼层
不错,释放点资料让大家伙也玩玩呗

出0入0汤圆

 楼主| 发表于 2018-4-27 09:29:19 | 显示全部楼层
luhuaneda 发表于 2018-4-27 09:21
经lz讲解,了解这个ic的工作方式。谢谢
这ic 有spi的驱动方式吗。

没有,对外的控制接口只有I2C,另外外挂的SPI芯片型号也是指定的几个QSPI,其他型号不一定支持。

出0入0汤圆

 楼主| 发表于 2018-4-27 09:33:27 | 显示全部楼层
上传一下配置工具吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-4-27 09:48:50 | 显示全部楼层
把修改好的配置文件拷到BIN-WIN32目录下,
在BIN--WIN32目录下,按住shift,点击鼠标右键--在此处打开命令窗口,运行  xConfigurator -c XXXX.cfg -o custom_xhra_firmware.bin,就会生成BIN固件了,用支持烧录QSPI的烧录器烧录一下就行了(其实我也不知道常用的烧录器能不能烧,我是借的别人的)。
手册里面写的明确支持下面几个
S25FL116K
S25FL132K
S25FL164K
IS25LQ080B
IS25LQ016B
IS25LQ032B
我一开始买了宽体的,焊盘做的窄体的,用八爪鱼焊法调好了,后来又买了窄体的换上

出0入0汤圆

发表于 2018-4-27 10:05:47 | 显示全部楼层
这个牛掰,一直想玩XMOS解码器,一直没搞清思路,认真向楼主学习!

出0入0汤圆

发表于 2018-4-27 10:10:19 | 显示全部楼层
本帖最后由 zsmbj 于 2018-4-27 10:13 编辑

楼主的这个多少钱做下来的?

我买了一个xmos+9018做的便携耳放。

https://www.xmos.com/support/boards?product=18340





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-4-27 10:23:35 | 显示全部楼层
zsmbj 发表于 2018-4-27 10:10
楼主的这个多少钱做下来的?

我买了一个xmos+9018做的便携耳放。

你这个就是官方的demo吧? 我的总价具体没算过,单个大概在200内吧。
因为觉得官方的虽然小巧可是从USB取电,手机吃不消,所以增加了电池,然后有搞了正负压,耳放,单独的音量芯片,哈哈,感觉这样才HIFI

出0入0汤圆

发表于 2018-4-27 11:33:48 | 显示全部楼层
9018 DAC手持版的也是正负压的,耳机输出没有电容。
感觉这种带dcdc的,都入不了hifi的法眼,但是确实方便。

出0入0汤圆

发表于 2018-4-27 12:32:48 来自手机 | 显示全部楼层
成本花了多少

出40入42汤圆

发表于 2018-4-27 15:33:22 | 显示全部楼层
不会画板的表示,板子很漂亮

出0入85汤圆

发表于 2018-4-27 19:59:54 | 显示全部楼层
据说XMOS的实时性很好,很想把他用到工控上,不知道好上手不

出0入0汤圆

发表于 2018-4-27 20:30:49 | 显示全部楼层
我一直使用XMOS模块,感觉声音不错的

出0入0汤圆

发表于 2018-4-29 10:47:45 | 显示全部楼层
音质怎么样

出0入0汤圆

 楼主| 发表于 2018-4-29 10:58:09 | 显示全部楼层
zsmbj 发表于 2018-4-27 11:33
9018 DAC手持版的也是正负压的,耳机输出没有电容。
感觉这种带dcdc的,都入不了hifi的法眼,但是确实方便 ...

你这个插手机上能播多久?我之前照着你这个做了小板子,用的9018K2M加9601,插我iphone,本来电池电量就小,插上电量掉的很快

出0入0汤圆

发表于 2018-5-2 16:10:45 | 显示全部楼层
Archer_Emiya 发表于 2018-4-29 10:58
你这个插手机上能播多久?我之前照着你这个做了小板子,用的9018K2M加9601,插我iphone,本来电池电量就 ...

用设备测试了,5V下耗电170-200mA。大概1W。还是挺高的。

出0入135汤圆

发表于 2018-5-2 16:17:20 | 显示全部楼层
孤陋寡闻的人连XMOS是啥都不知道,汗颜

出0入0汤圆

发表于 2018-5-2 20:20:28 | 显示全部楼层
俺买了两篇XHRA,但是一直没动手,前一段时间收到Digikey的邮件,说XHRA要停产了不推荐作用于新设计 ......

出0入0汤圆

 楼主| 发表于 2018-5-3 15:32:21 | 显示全部楼层
gamalot 发表于 2018-5-2 20:20
俺买了两篇XHRA,但是一直没动手,前一段时间收到Digikey的邮件,说XHRA要停产了不推荐作用于新设计 ...... ...

是的,看了官网上已经写停产了,不过对于个人玩玩来说无所谓了,感觉比PCM2706之类的可玩性高些

出0入0汤圆

发表于 2018-5-3 20:55:52 | 显示全部楼层
都是大神,佩服

出0入0汤圆

发表于 2019-12-13 11:28:22 | 显示全部楼层
楼主你好,你这个解码器,在播音乐时,电脑如果比较忙,比方说杀毒,会出现爆音吗?

出0入0汤圆

 楼主| 发表于 2019-12-13 15:35:43 | 显示全部楼层
superganbu 发表于 2019-12-13 11:28
楼主你好,你这个解码器,在播音乐时,电脑如果比较忙,比方说杀毒,会出现爆音吗? ...

有段时间没听了,电脑没满载测试过。印象中没有爆音。貌似官方驱动的高级版没有授权的话听两个小时之后就5分钟一次哔声。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-19 17:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表