一、簡介
KT148A語音芯片是受主MCU控制的,使用的是單線通訊的方式,也就是俗稱串口通信,注意不是UART通信,通信的協議也是非標準的,詳細的可以看看芯片說明書。
二、詳細說明
2.1 我們給出的參考代碼
/*******************************************************************************
- 函數說明:一線通數據發送【注意調試的時候,用示波器或者邏輯分析儀看一下脈沖寬度】
- 隸屬模塊:內部
- 參數說明:dat = 待發送的數據
- 返回說明:無 -- 這里對應的就是PA6這個GPIO ,不同的MCU,對于IO口的操作不同,這個自己理解了
- 備注:整體的通訊邏輯如下:
1、先把數據線DATA,也就是ONELINE,拉低 6ms 后,發送 8 位數據,先發送低位,再發送高位。
2、使用高電平和低電平比例來表示每個數據位的值。
3、推薦使用 200us:600us。取值范圍:窄脈沖=[150us--400us] 寬脈沖[500us--1000us]
********************************************************************************/
#define IO1_HIGH() JL_PORTA->DIR &= ~BIT(6);JL_PORTA->OUT |= BIT(6); //PA6輸出高電平
#define IO1_LOW() JL_PORTA->DIR &= ~BIT(6);JL_PORTA->OUT &= ~BIT(6); //PA6輸出低電平
void oneline_send_one_data(u8 dat)
{
u8 i = 0 ;
IO1_LOW() ;/*現將總線拉低*/
udelay(5000) ;/*延時6MS --- 這里就是發起通訊的起始信號------注意不同的芯片延時不一樣,請自行測試*/
OS_ENTER_CRITICAL();//關中斷--芯片不同,可能接口不同
for(i=0 ; i<8 ;i++){
if(dat & 0x01){
IO1_HIGH() ;
udelay(500);/*延時600us*/
IO1_LOW();
udelay(170) ;/*延時200us*/
}else{
IO1_HIGH() ;
udelay(170);/*延時200us*/
IO1_LOW();
udelay(500) ;/*延時600us*/
}
dat = dat >> 1 ;/*發送的時候,先發送最高位,再發送次高位,以此類推*/
}
IO1_HIGH() ;/*空閑時將該腳拉高即可*/
OS_EXIT_CRITICAL();//開中斷
/*同時注意,芯片初始化的時候,請將信號腳拉高。*/
}
程序調用的接口如下:
oneline_send_one_data(0x05);//對應播放第5段聲音
發不同的命令,就請對照詳細的手冊,有描述的,耐心看看 ,詳細看看手冊的章節三和章節四
/******************************例程可能出現的疑惑********************************
1、為什么按照例程發的數據,沒反應呢?
==》面對這個問題,應該是借助儀器:示波器、邏輯分析儀等等儀器來測試你的波形
==》而不是來問我們什么原因,我們也沒法給出意見,最好用儀器看一下,找出問題來
2、為什么程序里面,需要關中斷、再來開中斷呢?
==》這樣的目的,是為了保證波形的完整性,因為你的,注意是你的mcu運行時候,可能存在
多種中斷交替,這樣就會導致在發送波形的途中,被打斷,導致時間變長,或者其他
==》這個就看你具體的程序邏輯了,其實這樣的問題我們也不想回答,這是您應該知道的
********************************************************************************/
2.2 參考波形圖--邏輯分析儀
注意點:
1、起始信號一定不能低于6ms ,請嚴格按照這個去寫程序
2、遇到問題,第一時間,請用工具,用工具,不要一開始就問我們怎么發數據了,沒反應,很崩潰的
3、另外很多的工程師,可能不習慣于用邏輯分析儀,都喜歡拿示波器去量。真的實在是太痛苦了
只要是數字信號,推薦邏輯分析儀,不僅波形抓起來漂亮直觀,抓數據的時間還長,
強烈推薦使用,老手請忽視
2.3 關于芯片待機5秒自動進入待機
1、由于芯片要兼容低功耗的應用,所以不得不設計一個低功耗的機制
2、芯片一旦進入空閑,計時超過5秒之后,自動待機,功耗為25uA左右。進入待機之后芯片所有的外設都是關閉的,包括busy腳也是弱上拉的狀態
3、進入待機之后,芯片的data腳,設置的是下降沿喚醒,所以當主MCU發送數據的時候,為什么前面需要6ms的起始信號,很大一部分的原因,是因為芯片喚醒之后到正常讀取一線的數據,中間需要大概2-3ms的時間 。所以起始信號一定要給足6ms
2.4 關于芯片低功耗的F0指令說明
1、如果需要芯片的功耗再低,則需要發送F0指令,任何狀態下都可以
2、芯片接收到F0指令之后,就會進入關機狀態,功耗維持在1.7uA左右
3、如果需要芯片再次接收指令,必須先將dat信號拉低40ms,讓芯片被喚醒,再發送數據就可以了
==》這里的主MCU發送40ms的低電平之后,再緊接著將data腳拉高就可以了
==》此時如果需要發指令,就再延時個15ms就可以了,合計也就是65ms左右了
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17135瀏覽量
351031 -
串口
+關注
關注
14文章
1551瀏覽量
76447 -
語音芯片
+關注
關注
12文章
1749瀏覽量
36458
發布評論請先 登錄
相關推薦
評論