XFS5152CE語音合成芯片與Arduino平臺I2C通信問題解決

        最近弄了個機器人,想給他加上個TTS模塊,提升交互性。

        TTS有在線、離線的多種實現方法,其中在線方法不是很必要,因爲TTS相對ASR(語音識別)計算量小,算法難度低,離線的基本都能夠滿足需求,其中離線的又分爲基於芯片的和純軟件的方法。但軟件的方法目前只看到PC平臺的,尚未有單片機平臺的,而我的主控是Arduino平臺的Atmel mega328p,並不能完成純軟件的TTS,所以考慮用硬件芯片實現,考慮到訊飛在語音領域多年的積累,選擇訊飛XFS5152CE模塊。

        順便說下XFS5152CE芯片(芯片資料#url#),其支持任意中英文混合文本的發音,並且支持GB2312、GBK、BIG5、UNICODE四種編碼,也能自動識別常見的數字、號碼、時間、 日期、度量衡符號等格式的文本,也支持部分多音字,以及五種音色等等。總之在發音效果上還是不錯的。

        該芯片支持三種通信方式:UART、I2C、SPI。由於我的主控同時還連接了兩個UART設備,SPI通信佔用端口數太多,所以我不想再用軟件模擬UART設備,故而採用I2C方式,於是入坑……

        網上大多數採用的都是UART方式通信,而官方例程雖然給了UART和I2C方式,但是隻有基於51和STM32的,網上有部分人採用Arduino的I2C方式卻都是失敗了在尋求幫助???而我原本以爲可以很快搞定,結果經過數天糾結,始終通信失敗,而用UART通信則正常。最終看了大量相關不相關的代碼後,終於發現了問題所在,在Arduino關於Wire庫(也就是I2C庫)的Example裏面,有個SFRRanger_reader.ino的例子裏寫了這麼一段註釋:

        // step 1:instruct sensor to read echoes                                                   

        Wire.beginTransmission(112); // transmit to device #112 (0x70)

        //the address specified in the datasheet is 224 (0xE0)

        //but i2c adressing uses the high 7 bits so it's 112

        等於說Arduino的I2C通信設備地址是slave設備地址的邏輯右移一位……好吧,芯片手冊上寫的通信地址是0x80,所以這裏需要填的是0x80>>1->0x40,即 Wire.beginTransmission(0x40);

原文鏈接:http://www.straka.cn/blog/xfs5152ce_i2c_bugfix/

發佈了34 篇原創文章 · 獲贊 25 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章