极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13986|回复: 0

XFS5152CE语音合成芯片与Arduino平台I2C通信问题解决

[复制链接]
发表于 2018-7-16 08:49:53 | 显示全部楼层 |阅读模式
最近弄了个机器人,想给他加上个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/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 15:31 , Processed in 0.036478 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表