科大訊飛語音芯片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;
  }
}
更新

 

以上為原創,請勿轉載

歡迎討論!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM