Author:Younix.Zhang
需求
5G模組供應商這邊說支持打電話功能(模組有PCM輸出),但是沒有配套的codec解決方案,所以需要我們自己使用 codec 接受 PCM 音頻
硬件設計
調試
調試分爲兩個部分
- 通過 AT 指令撥打、接收電話。這個是標準的。
- 通過 AT 指令配置 codec 的寄存器。這個是華爲私有的。
AT 指令測試
上位機(Ubuntu16.04)和 華爲5000-31模組的USB接口接上後。
ls /dev/ttyUSB*
可以看到
ttyUSB0 ttyUSB1 ttyUSB2 ttyUSB3
根據華爲的手冊描述 AT 指令是通過 PCUI端口也就是 ttyUSB1 進行交互
所以我通過
cat /dev/ttyUSB1
進行監聽 AT 指令的接受。
通過
echo "ATI" > /dev/ttyUSB1
進行 AT 指令的發送。
# 發送查詢模組信息命令
echo "ATI" >/dev/ttyUSB1
# 查看模組返回信息
Manufacturer: Huawei Technologies Co., Ltd.
Model: MH5000-31
Revision: 11.770.00.03.00
IMEI: 867395040011807
+GCAP: +CGSM,+DS,+ES
1. 電話功能調試
電話撥號、接聽 等功能和標準的 AT 指令一樣
# 撥號
echo "ATD13212341234;" >/dev/ttyUSB1
# 接聽
echo "ATA" > /dev/ttyUSB1
# 掛斷: 0 爲所有用戶
echo "ATH0" > /dev/ttyUSB1
2. 音頻功能調試
先看模組支持的 codec 相關的命令
AT^SETCODECREG=<codec_addr>,<register_addr>,<register_data>
AT^GETCODECREG=<codec_addr>,<register_addr>
再看 Codec NAU88C10 的寄存器表,先隨便找一個
麻煩1
這裏就看到麻煩了,5000-31模組對 Codec register 的讀和寫都只支持 1byte 也就是 8bit。
但是 Codec 的 register data 卻是 9 bit(0-8)。
仔細研究一下 Codec 的 i2c write 操作:
可以看到 register_addr 是 A6-A0 ,register_data 是 D8-D0
所以我們只需要將真實希望去操作的寄存器地址位左移1bit,再加上 D8, 作爲 register_addr 給 5000-31 模組去調用。
比如:
我希望去寫 0x01 ,寫入 0x11f = 1 0001 1111
那麼我實際模組應該使用的參數爲
<codec_addr>=1a,
<register_addr>=01左移1bit爲 02, 加上D8爲1,最後得3
<register_data>=D7-D0 也就是 1f。
對應的 AT 指令爲
AT^SETCODECREG=1a,3,1f
再來一組數據你們感受一下
[8810/Audio Control]
0x4 = 0x58
0x5 = 0x0
0x6 = 0x0
0x7 = 0xa
0xa = 0x8
0xb = 0xff
0xe = 0x100
0xf = 0xff
對應的 AT 指令是
echo "at^setcodecreg=1a,8,58" > /dev/ttyUSB1
echo "at^setcodecreg=1a,a,00" > /dev/ttyUSB1
echo "at^setcodecreg=1a,c,0" > /dev/ttyUSB1
echo "at^setcodecreg=1a,e,0a" > /dev/ttyUSB1
echo "at^setcodecreg=1a,14,08" > /dev/ttyUSB1
echo "at^setcodecreg=1a,16,ff" > /dev/ttyUSB1
echo "at^setcodecreg=1a,1d,00" > /dev/ttyUSB1
echo "at^setcodecreg=1a,1e,ff" > /dev/ttyUSB1
麻煩2
不知道是否寫成功了。 因爲5000-31模組的讀取,同樣是1個字節,而 Codec 被讀的時候,返回的是兩個字節。
因爲我們從 Datasheet 可以看到
Codec 先返回的1個字節是高位。
所以 AT 指令 GETCODECREG 獲得的返回數據爲 高1個字節。
沒辦法,只能使用邏輯分析儀抓取 I2C 數據。看實際是否寫入成功。
一般來說,AT 指令如果返回的是 OK ,那麼寫入應該就是成功的。
麻煩3 Codec 的寄存器配置問題
因爲 Codec FAE 給到的寄存器配置表有誤,所以導致 Mic 和 Speaker 都沒有聲音。在這塊耽誤了有快一天的時間。
這裏就是相對獨立的 Codec 調試階段了。根據通道配置各個寄存器。不再贅述。
有興趣諮詢88C10的寄存器配置的可以在評論中交流。