科大讯飞语音芯片xfs5152CE,分享遇到的一些坑
首先 芯片手册的I2C地址是写地址,是8位的,真正的地址是7位地址,应该是0x40,最低位是读写位,读置1,为0x81,写置0,为0x80.
如果是模拟I2C倒无所谓,最坑的是我用的是寄存器,所以必须要用7位地址才可以,这个地方坑了我好几天。
其次,在用uart串口的是时候,每次上电芯片会返回一个状态值0x4A,但I2C是不会主动返回的,需要你去读取
我是在写入语音之后接着读取状态字节
上电第一次写入数据并读取,会得到0x4A,之后的再读取都是0x41,0x4F
程序部分
我用的是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控制会卡死

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; } }
以上为原创,请勿转载
欢迎讨论!
分类:
msp430F5438A
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律