1. 程式人生 > >XFS5152CE語音合成晶片與Arduino平臺I2C通訊問題解決

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/