MSP430 eUSCI I2C 寄存器如何读1字节

2019-03-24 11:43发布

我只需要接收一个字节,但是返回给我的结果是三个字节.

QQ截图20130602165521.png

硬件操作也不好单步啊.奇怪为什么接收到的是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 上传 点击文件名下载附件

崩溃了,一整天了,赶集的.

程序收到的是第二个数据.

QQ截图20130602165521.png

当然,数据是0x9D是对的,问题在于,为什么多发送(还是接收)了0x00

[ 本帖最后由 cl17726 于 2013-6-2 23:43 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
msp430_now
2019-03-24 20:56
看了你的程序,我觉得可能的问题有两点:
第一:I2C在收数据时要先把UCB0CTLW0的 UCTR清零,因为这一位置1代表传输
第二:只收一个字节的话要先放下STP标志,然后再收数据,因为I2C的收数据和发数据是不一样的,在你放下STOP标志后,I2C还会再收一次数据。
最后,看了你的SCL,SDL贴图,最后的三个字节并不全是数据,I2C在收数据前会先要确定收数据的地址,所以你收到的第一个数据是地址,后面的两个才是你真正收到的数据,而为什么会收到两个数据,你应该通过前面的描述有所了解了。

一周热门 更多>

相关问题

    相关文章