本帖最后由 trouvan 于 2016-7-28 01:09 编辑
芯片是G2553 参考官方的代码,初始化P1.7为SDA 1.6为SCL
这是
发送的代码。单步调试发现,进入过一次USCIAB0TX_ISR的中断,但之后就再也进不去了,一直停在最后那个while循环中。
- void HardI2C_Write(byte slaveAddress,byte address,byte data){
- UCB0I2CSA=slaveAddress;
- UCB0CTL1|=UCTR; //设置为发送模式
- sendData[1]=address;
- sendData[0]=data;
- dataSendCnt=2;
- UCB0CTL1|=UCTXSTT;//产生开始信号
- __bis_SR_register(CPUOFF + GIE);
- while (UCB0CTL1 & UCTXSTP);
- }
复制代码按参考手册所说:
一旦数据由缓冲区转移到移位寄存器,UCBxTXIFG 将再次置位。
但我看了一下寄存器,缓冲区UCB0TXBUF一直都是有值得,也就是它原来的值一直没发出去,所以无法进入下一次中断。
困扰了一晚上,还是没解决。请大家帮忙。
(要通信的器件是MPU6050,430为主机,6050为从机。)
以下是
中断代码:
- // USCI_B0 Data ISR
- #pragma vector = USCIAB0TX_VECTOR
- __interrupt void USCIAB0TX_ISR(void)
- {
- if(IFG2&UCB0TXIFG){ //当是发送中断时
- if(dataSendCnt){//有数据待发送
- UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
- }else{
- UCB0CTL1|=UCTXSTP;//产生停止信号
- }
- }else if(IFG2&UCB0RXIFG){
- --dataReceCnt;
- if(!dataReceCnt){
- UCB0CTL1|=UCTXSTP;//产生停止信号
- }
- receData[dataReceCnt]=UCB0RXBUF;
- }
- }
复制代码
以下为
初始化代码:
- void HardI2C_Init(){
- P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- UCB0CTL1 |= UCSWRST;
- UCB0CTL0=UCMST+UCMODE_3+UCSYNC; //主控模式 i2c模式 同步模式
- UCB0CTL1=UCSSEL_2+ UCSWRST; //设置时钟为SMCLK
- UCB0BR0 = 12; // 分频 = SMCLK/12 = ~100kHz
- UCB0BR1 = 0;
- UCB0CTL1 &= ~UCSWRST;
- IE2 |= UCB0TXIE; //发送中断使能
- IE2 |= UCB0RXIE; //接收中断使能
-
- }
复制代码
谢谢!找到错误了!估计是昨晚看头文件的时候按到键盘了!!里面一个寄存器的值被我改动了!!
你好!这个配置还有一点错误。主要是一些时序上的问题。以下是我修改后的代码,能正常使用了,还未发现问题:
- void HardI2C_Init(){
- P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- UCB0CTL1 |= UCSWRST;
- UCB0CTL0=UCMST+UCMODE_3+UCSYNC; //主控模式 i2c模式 同步模式
- UCB0CTL1=UCSSEL_2+ UCSWRST+UCTR; //设置时钟为SMCLK
- UCB0BR0 = 12; // 分频 = SMCLK/12 = ~100kHz
- UCB0BR1 = 0;
- UCB0CTL1 &= ~UCSWRST;
- }
- void HardI2C_WriteInit(byte slaveAddress){
- UCB0CTL1 |= UCTR;
- UCB0I2CSA = slaveAddress;
- IFG2 &= ~UCB0TXIFG;
- IE2 &= ~UCB0RXIE; // disable Receive ready interrupt
- IE2 |= UCB0TXIE; // enable Transmit ready interrupt
- }
- void HardI2C_ReadInit(byte slaveAddress){
- UCB0CTL1 &= ~UCTR; // UCTR=0 => Receive Mode (R/W bit = 1)
- UCB0I2CSA = slaveAddress; // define Slave Address
- IFG2 &= ~UCB0RXIFG;
- IE2 &= ~UCB0TXIE; // disable Transmit ready interrupt
- IE2 |= UCB0RXIE; // enable Receive ready interrupt
- }
- void HardI2C_Write(byte slaveAddress,byte address,byte data){
-
- while (UCB0STAT & UCBUSY) { // wait until I2C module has
- }
- sendData[1]=address;
- sendData[0]=data;
- dataSendCnt=2;
-
- HardI2C_WriteInit(slaveAddress);
- UCB0CTL1 |= UCTXSTT; //
- __bis_SR_register(CPUOFF + GIE);
- while (UCB0CTL1 & UCTXSTP){
- }
- }
- byte HardI2C_Read(byte slaveAddress,byte address){
- while (UCB0STAT & UCBUSY) { // wait until I2C module has
- }
- sendData[0]=address;//发送寄存器地址
- dataSendCnt=1;
- HardI2C_WriteInit(slaveAddress);
- UCB0CTL1 |= UCTXSTT; //
- __bis_SR_register(CPUOFF + GIE);
- while(UCB0CTL1&UCTXSTP){
- ;//等待寄存器地址发完
- }
- //以下开始配置为接收模式
- HardI2C_ReadInit(slaveAddress);
- UCB0CTL1|=UCTXSTT;//产生开始信号
- //dataReceCnt=1;
- __bis_SR_register(CPUOFF + GIE);
- UCB0CTL1 |= UCTXSTP;
- while(UCB0CTL1&UCTXSTP);
- return receData;
- }
- // USCI_B0 Data ISR
- #pragma vector = USCIAB0TX_VECTOR
- __interrupt void USCIAB0TX_ISR(void)
- {
- if(IFG2&UCB0TXIFG){ //当是发送中断时
- if(dataSendCnt){//有数据待发送
- UCB0TXBUF=sendData[--dataSendCnt]; //将数据移入发送寄存器
- }else{
- UCB0CTL1 |= UCTXSTP;
- IFG2 &= ~UCB0TXIFG;
- __bic_SR_register_on_exit(CPUOFF);
- }
- }else if(IFG2&UCB0RXIFG){
- //--dataReceCnt;
- //if(!dataReceCnt){
- //UCB0CTL1|=UCTXSTP;//产生停止信号
- //IFG2 &= ~UCB0RXIFG;
- //__bic_SR_register_on_exit(CPUOFF);
- //}
- receData=UCB0RXBUF;
- IFG2 &= ~UCB0RXIFG;
- __bic_SR_register_on_exit(CPUOFF);
- }
-
- }
复制代码一周热门 更多>