你好:
我的问题如下:
用2553通过I2C写一个数字功放,
#ifndef SIMPLE_I2C_H
#define SIMPLE_I2C_H
#endif
#define uchar unsigned char
uchar TRFlag;
uchar DataFlag=0;
uchar TxData[2];
uchar *PTxData;
//uchar Rxdata;
uchar Txctr;
uchar I2C_buf1;
void init_i2c(void);
void I2Cm_Tx(uchar valueReg,uchar RegAddress,uchar DeviceAddress);
void I2Cm_Rx(uchar valueReg,uchar RegAddress,uchar DeviceAddress);
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void){
if(TRFlag==1){
if(Txctr){
Txctr--;
UCB0TXBUF=*PTxData++; //no data transmit
__bic_SR_register_on_exit(CPUOFF); // get out of interrupt
}
else{
UCB0CTL1|=UCTXSTP;
IFG2&=~UCB0TXIFG;
__bic_SR_register_on_exit(CPUOFF);
}
}
else{
I2C_buf1=UCB0RXBUF;
UCB0CTL1|=UCTXSTP;
IFG2&=~UCB0RXIFG;
__bic_SR_register_on_exit(CPUOFF);
}
}
void I2Cm_Tx(uchar valueReg,uchar RegAddress,uchar DeviceAddress){
_DINT();
TRFlag=1;
if(DataFlag==1){
Txctr=1;
DataFlag=0;
}
else{
Txctr=2;
}
IE2&=~UCB0RXIE;
while(UCB0CTL1&UCTXSTP);
UCB0CTL1|=UCSWRST;
UCB0CTL0=UCMST+UCMODE_3+UCSYNC;
UCB0CTL1=UCSSEL_2+UCSWRST;
UCB0BR0=12;
UCB0BR1=0;
UCB0I2CSA=DeviceAddress;
UCB0CTL1&=~UCSWRST;
IE2|=UCB0TXIE;
TxData[0]=RegAddress;
TxData[1]=valueReg;
PTxData=TxData;
while(UCB0CTL1&UCTXSTP);
UCB0CTL1|=UCTR+UCTXSTT;
__bis_SR_register(CPUOFF+GIE); //enter interrupt
while(UCB0CTL1&UCTXSTP); //return to this
}
void I2Cm_Rx(uchar valueReg,uchar RegAddress,uchar DeviceAddress){
_DINT();
uchar temp_dev,temp_reg;
temp_dev=DeviceAddress;
temp_reg=RegAddress;
TRFlag=0;
DataFlag=1;
I2Cm_Tx(0x00,temp_reg,temp_dev);
IE2&=~UCB0TXIE;
while(UCB0CTL1&UCTXSTP);
UCB0CTL1|=UCSWRST;
UCB0CTL0=UCMST+UCMODE_3+UCSYNC;
UCB0CTL1=UCSSEL_2+UCSWRST;
UCB0BR0=12;
UCB0BR1=0;
UCB0I2CSA=temp_dev;
UCB0CTL1&=~UCSWRST;
IE2|=UCB0RXIE;
while(UCB0CTL1&UCTXSTP);
UCB0CTL1|=UCTXSTT;
__bis_SR_register(CPUOFF+GIE);
while(UCB0CTL1&UCTXSTP);
}
void init_i2c(void){
P1SEL|=BIT6+BIT7;
P1SEL2|=BIT6+BIT7;
}
调用I2Cm_TX()后,只执行完if(Txctr){}一遍后跳出中断,捕捉到下面的波形:
I2C_SA是0X38,上面的数据不对吧?请帮忙分析,谢谢!


