科大讯飞语音芯片xfs5152CE,分享遇到的一些坑

摘要:
首先,芯片手册中的I2C地址是写地址,为8位。实际地址为7位地址,应为0x40。最低的位是读写位。读集1为0x81,写集0为0x80。如果是模拟I2C,则无所谓。最重要的是我使用了寄存器,所以我必须使用7位地址。这个地方让我苦闷了好几天;8UCB3IFG&=~UCRXIFG;9ifUCB3CTL1 |=UCTXSTP;10*数据++=UCB3RXBUF;11} 12}1intxfs_Set2{3i2c3_start;4i2c3_writeNbyte;5i2c3_readNbyte,6return0;7}要在8月19日继续,需要通过添加标志位来确定更新上方的停止条件,否则后续的i2c控件将在{while(!

首先 芯片手册的I2C地址是写地址,是8位的,真正的地址是7位地址,应该是0x40,最低位是读写位,读置1,为0x81,写置0,为0x80.

如果是模拟I2C倒无所谓,最坑的是我用的是寄存器,所以必须要用7位地址才可以,这个地方坑了我好几天。

其次,在用uart串口的是时候,每次上电芯片会返回一个状态值0x4A,但I2C是不会主动返回的,需要你去读取

我是在写入语音之后接着读取状态字节

科大讯飞语音芯片xfs5152CE,分享遇到的一些坑第1张

上电第一次写入数据并读取,会得到0x4A,之后的再读取都是0x41,0x4F

科大讯飞语音芯片xfs5152CE,分享遇到的一些坑第2张

程序部分

我用的是msp430F5438A,I2C3

1 void i2c3_start(unsigned char address)
2 {
3   UCB3I2CSA = address;
4   while(UCB3CTL1 & UCTXSTP);
5   UCB3CTL1 |= (UCTR + UCTXSTT);
6   while(!(UCB3IFG & UCTXIFG));
7   UCB3IFG &= ~UCTXIFG;
8 }
1 void i2c3_writebyte(unsigned char data)
2 {
3   UCB3TXBUF =data;
4   while(!(UCB3IFG & UCTXIFG));
5   UCB3IFG &= ~UCTXIFG;
6 }
1 void i2c3_writeNbyte(unsigned char* data,int len)
2 {
3   for(int i=0;i<len;i++)
4   {
5     i2c3_writebyte(*data++);
6   }
7 }
 1 void i2c3_readNbyte(unsigned char *data,unsigned char len)
 2 {
 3   UCB3CTL1 &= ~UCTR;
 4   UCB3CTL1 |= UCTXSTT;
 5   for(int i=0;i<len;i++)
 6   {
 7     while(!(UCB3IFG & UCRXIFG));
 8     UCB3IFG &= ~UCRXIFG;
 9     if(i==len-1)UCB3CTL1 |= UCTXSTP;
10     *data++ = UCB3RXBUF;
11   }
12 }
1 int xfs_set(unsigned char* cmd,int len,unsigned char *data,int n)
2 {
3   i2c3_start(0x40);
4   i2c3_writeNbyte(cmd,len);
5   i2c3_readNbyte(data,n);
6   return 0;
7 }

未完待续

8月19号更新

上面的停止条件处需要加上标志位判断,不然后续i2c控制会卡死

科大讯飞语音芯片xfs5152CE,分享遇到的一些坑第3张科大讯飞语音芯片xfs5152CE,分享遇到的一些坑第4张
void i2c3_readNbyte(unsigned char *data,unsigned char len)
{
  UCB3CTL1 &= ~UCTR;
  UCB3CTL1 |= UCTXSTT;
  for(int i=0;i<len;i++)
  {
    while(!(UCB3IFG & UCRXIFG));
    UCB3IFG &= ~UCRXIFG;
    if(i==len-1)
    {
      UCB3CTL1 |= UCTXSTP;
      while(UCB3CTL1 & UCTXSTP);
    }
    *data++ = UCB3RXBUF;
  }
}
更新

以上为原创,请勿转载

欢迎讨论!

免责声明:文章转载自《科大讯飞语音芯片xfs5152CE,分享遇到的一些坑》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Https socket 代理Raft算法原理剖析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP 真正多线程的使用

popen 首先popen()函数创建一条管道,方向为父进程的fpout到子进程的stdin,接着popen程序打开in.txt文本并一行一行地读取出来写到管道的fpout端。子进程则从stdin中读取从父进程发送过来的数据显示到stdout中。 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重...

Postgresql在线备份和恢复

1.实验环境 OS: RedHat Linux Enterprisedb 6.3 DB: postgresql 9.3 PGHOME: /opt/PostgreSQL/9.3 PGDATA: /opt/PostgreSQL/9.3/data 归档目录:/opt/pg_archive 基础备份目录:/opt/base_archive --生产环境中归档和数...

socket.io建立长连接

   socket.io是基于node.js,在命令行里输入npm socket.io下载模块,用node.js搭建后台 示例代码,客户端 1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5...

Vue实例的的data对象

介绍 Vue的实例的数据对象data 我们已经用了很多了,数据绑定离不开data里面的数据。也是Vue的核心属性。 它是Vue绑定数据到HTML标签的数据源泉,另外Vue框架会自动监视data里面的数据变化,自动更新数据到HTML标签上去。本质原理是:Vue会自动将data里面的数据进行递归抓换成getter和setter,然后就可以自动更新HTML标签了...

echarts markLine 辅助线非直线设置

效果图: 用例option: option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigger: 'axis' }, legend: { data:...

【GStreamer开发】GStreamer播放教程05——色彩平衡

目标 亮度,对比度,色度和饱和度都是常见的视频调节参数,也是GStreamer里面设置色彩平衡的参数。本教程将展示: 如何发现可用的色彩平衡通道 如何改变它们 介绍 《GStreamer基础教程05——集成GUI工具》里面已经解释了GObject接口:应用通过它们来获得特定功能,而不用去管具体的element的实现。 playbin2实现了色彩平衡的接...