4616|1

695

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

MSP430 eUSCI I2C 寄存器如何读1字节 [复制链接]

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



硬件操作也不好单步啊.奇怪为什么接收到的是3个字节,而不是1个.

#include

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, 下载次数: 8)

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

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



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

[ 本帖最后由 cl17726 于 2013-6-2 23:43 编辑 ]

最新回复

看了你的程序,我觉得可能的问题有两点: 第一:I2C在收数据时要先把UCB0CTLW0的 UCTR清零,因为这一位置1代表传输 第二:只收一个字节的话要先放下STP标志,然后再收数据,因为I2C的收数据和发数据是不一样的,在你放下STOP标志后,I2C还会再收一次数据。 最后,看了你的SCL,SDL贴图,最后的三个字节并不全是数据,I2C在收数据前会先要确定收数据的地址,所以你收到的第一个数据是地址,后面的两个才是你真正收到的数据,而为什么会收到两个数据,你应该通过前面的描述有所了解了。  详情 回复 发表于 2014-4-8 02:54
 
点赞 关注

回复
举报

35

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
看了你的程序,我觉得可能的问题有两点:
第一:I2C在收数据时要先把UCB0CTLW0的 UCTR清零,因为这一位置1代表传输
第二:只收一个字节的话要先放下STP标志,然后再收数据,因为I2C的收数据和发数据是不一样的,在你放下STOP标志后,I2C还会再收一次数据。
最后,看了你的SCL,SDL贴图,最后的三个字节并不全是数据,I2C在收数据前会先要确定收数据的地址,所以你收到的第一个数据是地址,后面的两个才是你真正收到的数据,而为什么会收到两个数据,你应该通过前面的描述有所了解了。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表