華爲5G模組5000-31語音通話功能調試記錄(NAU88C10).md

Author:Younix.Zhang

需求

5G模組供應商這邊說支持打電話功能(模組有PCM輸出),但是沒有配套的codec解決方案,所以需要我們自己使用 codec 接受 PCM 音頻

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fzCeoTTs-1593659409167)(./images/1593657197068.png)]

硬件設計

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IQ5CNL6A-1593659409170)(./images/1593657259793.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-60CJs2ED-1593659409172)(./images/1593657301684.png)]

調試

調試分爲兩個部分

  1. 通過 AT 指令撥打、接收電話。這個是標準的。
  2. 通過 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>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eM2rn0Pw-1593659409173)(./images/1593657996132.png)]

AT^GETCODECREG=<codec_addr>,<register_addr>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WY7T9yp2-1593659409174)(./images/1593658013417.png)]

再看 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的寄存器配置的可以在評論中交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章