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,我首先要确定的是从波形上看,一切正常,从机芯片已经返回了正确的值,请问,这个问题到底出在哪里?谢谢。
我想这个地方也正好填补一下你们的实例程序,添加一下读取值到变量的操作。