我只需要接收一个字节,但是返回给我的结果是三个字节.
硬件操作也不好单步啊.奇怪为什么接收到的是3个字节,而不是1个.
#include <msp430.h>
volatile unsigned char ADXL345_Ptr;
/*
* ADXL345 1 = 写寄存器地址
* 2 = 发送重新开始
* 3 = STOP
*/
volatile unsigned char RxBuffer;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
P2SEL |= BIT0 | BIT1;
UCB0CTLW0 |= UCSWRST;
UCB0CTLW0 |= UCMST | UCMODE_3 | UCSSEL_1; // I2C 主机 ACLK
UCB0I2CSA = 0x53; // 从机地址
UCB0CTLW0 &= ~UCSWRST;
UCB0IE |= UCTXIE0;
ADXL345_Ptr = 1;
UCB0CTLW0 |= UCTR | UCTXSTT;
while (1)
{
__bis_SR_register(LPM3_bits | GIE); // 进入LPM3模式
__no_operation(); // 断点测试
}
}
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
switch (__even_in_range(UCB0IV, 30))
{
case USCI_NONE: break; // No interrupts
case USCI_I2C_UCALIFG: break; // ALIFG
case USCI_I2C_UCNACKIFG: break; // NACKIFG
case USCI_I2C_UCSTTIFG: break; // STTIFG
case USCI_I2C_UCSTPIFG: break; // STPIFG
case USCI_I2C_UCRXIFG3: break; // RXIFG3
case USCI_I2C_UCTXIFG3: break; // TXIFG3
case USCI_I2C_UCRXIFG2: break; // RXIFG2
case USCI_I2C_UCTXIFG2: break; // TXIFG2
case USCI_I2C_UCRXIFG1: break; // RXIFG1
case USCI_I2C_UCTXIFG1: break; // TXIFG1
case USCI_I2C_UCRXIFG0: // RXIFG0
switch(ADXL345_Ptr){
case 3:
{
RxBuffer = UCB0RXBUF;
UCB0IFG &= ~UCRXIFG0;
UCB0CTLW0 |= UCTXSTP;
}
default:
break;
}
break;
case USCI_I2C_UCTXIFG0: // TXIFG0
{
switch(ADXL345_Ptr){
case 1:
{
UCB0TXBUF = 0x32; //寄存器地址
ADXL345_Ptr = 2;
}
break;
case 2:
{
UCB0IE |= UCRXIE0;
UCB0IE &= ~UCTXIE0;
UCB0IFG &= ~UCTXIFG0; // 清除中断标志
UCB0CTLW0 &= ~UCTR;
UCB0CTLW0 |= UCTXSTT; // I2C 重新开始信号
ADXL345_Ptr = 3; //转到无效状态
}
break;
default:
break;
}
}
break;
case USCI_I2C_UCBCNTIFG: break; // CNTIFG
case USCI_I2C_UCCLTOIFG: break; // LTOIFG
case USCI_I2C_UCBIT9IFG: break; // BIT9IFG
default: break;
}
__bic_SR_register_on_exit(LPM3_bits); // 退出LPM0模式
}
code.c
(2.42 KB, 下载次数: 7)
2013-6-2 23:14 上传
点击文件名下载附件
崩溃了,一整天了,赶集的.
程序收到的是第二个数据.
当然,数据是0x9D是对的,问题在于,为什么多发送(还是接收)了0x00
[
本帖最后由 cl17726 于 2013-6-2 23:43 编辑 ]
此帖出自
小平头技术问答
第一:I2C在收数据时要先把UCB0CTLW0的 UCTR清零,因为这一位置1代表传输
第二:只收一个字节的话要先放下STP标志,然后再收数据,因为I2C的收数据和发数据是不一样的,在你放下STOP标志后,I2C还会再收一次数据。
最后,看了你的SCL,SDL贴图,最后的三个字节并不全是数据,I2C在收数据前会先要确定收数据的地址,所以你收到的第一个数据是地址,后面的两个才是你真正收到的数据,而为什么会收到两个数据,你应该通过前面的描述有所了解了。
一周热门 更多>