Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

关于MSP430 I2C读取数据的问题

$
0
0

Hi,

        我用的是MSP430G2231,CCS,我现在使用的是USI I2C来读取芯片的数据,采用的是你们的Example code msp430g2x21_usi_12.c,现在发和收都已经调通,但是在读取数据上出现了问题,根据TI的几个I2C实例程序,接收数据都是这个函数实现的

void Data_RX (void){
USICTL0 &= ~USIOE; // SDA = input --> redundant
USICNT |= 0x08; // Bit counter = 8, RX data
I2C_State = 6; // Next state: Test data and (N)Ack
P1OUT &= ~0x01; // LED off
}

但是在这个函数里面却没有将I2C值读到变量中,于是按照我的理解我修改成了这样

void Data_RX (void){

unsigned char x=0;

USICTL0 &= ~USIOE; // SDA = input --> redundant
USICNT |= 0x08; // Bit counter = 8, RX data

x=USISRL; //缓存器USISRL接收数据


I2C_State = 6; // Next state: Test data and (N)Ack
P1OUT &= ~0x01; // LED off
}

但是在这个地方出现两个困惑的问题,我用CCS来调试,确实,能断点了,但是断点到 I2C_State = 6这个位置,无论我看x还是USISRL,都没有值,是不是SUISRL寄存器的值无法在中断中,断点查看?于是我换了一种方法:

void Data_RX (void){
int i=0,x=1;

USICTL0 &= ~USIOE; // SDA = input --> redundant
USICNT |= 0x08; // Bit counter = 8, RX data
I2C_State = 6; // Next state: Test data and (N)Ack
//P1OUT &= ~0x01; // LED off

//temp_l |= USISRL;
for(i=0;i<8;++i)
{
if(USISRL & 0x01)
temp_l |= x;
x<<=1;
}



I2C_State = 6;
}

模仿你们前面的程序,按位比较取值,但是监控的时候,读到的值都是0,我首先要确定的是从波形上看,一切正常,从机芯片已经返回了正确的值,请问,这个问题到底出在哪里?谢谢。

我想这个地方也正好填补一下你们的实例程序,添加一下读取值到变量的操作。


Viewing all articles
Browse latest Browse all 3634

Trending Articles