首先 芯片手冊的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; } }
以上為原創,請勿轉載
歡迎討論!