IO模拟IIC通信当然没问题
MSP430F249自带的IIC模块,
ATmega16、pic16f877自带的IIC模块的还好操作,MSP430F249,stast信号后,从地址自动发送
发完就没反应了,CLK没作用了,不知道哪出问题
/************************
I2C初始化
*************************/
void I2C_init()
{
P3SEL = 0x06; //P3.1-SDA
BCSCTL1 = CALBC1_1MHZ; //设DCO频率
DCOCTL = CALDCO_1MHZ;
UCB0CTL0 |= UCMODE_3 + UCSYNC; // 2C模式 + 同步,从机24C02地址为7位
UCB0CTL1 |= UCSSEL_3 ; // SCL_CLK = SMCLK为1M
UCB0BR0 = 10; //CLK = 1000K/10 = 100K;SCL_H >= 5us,SCL_L >= 5us
UCB0BR1 = 0;
UCB0I2CSA = 0xa0; // 从机24C02地址0xa0
UCB0CTL1 |= UCSWRST; //充许软件复位
}
/****************************************************
函数名称:i2c_write(uchar add,uchar dat)
输入参数:uchar add,uchar dat
输出参数:
函数功能:用MSP430F249的i2c总线,对24c02某地址写入数据
****************************************************/
void i2c_write(uchar add,uchar dat)
{
UCB0I2CSA = 0xa0; //设置从机24C02地址0xa0
UCB0CTL1 |= UCTR; //设置主机发送
UCB0CTL1 |= UCTXSTT; //向24C02发送启始信号
while(!(IFG2 & UCB0TXIFG)); //自动发送从机地址,检测发送是否为空
P2OUT |= BIT0; //指示灯检测此步骤
_NOP();
_NOP();
/*if(UCB0STAT & UCSCLLOW)
P2OUT |= BIT7; //检测CLK是否拉低,拉低24Cxx发出应答信号
else
P2OUT |= BIT6; //检测CLK未拉低,24Cxx无应答
*/
UCB0TXBUF = add; //发送写入24Cxx的地址
while(!(IFG2 & UCB0TXIFG)); //检测发送是否完成
//while(!(UCB0STAT & UCNACKIFG)); //检测应答,UCNACKIFG=1应答
_NOP();
_NOP();
P2OUT |= BIT1; //检测指示灯此步骤
while(!(IFG2 & UCB0TXIFG)); //检测应答
P2OUT |= BIT2; //指示灯检测此步骤
UCB0TXBUF = dat; //发送写入24Cxx的数据
_NOP();
_NOP();
while(!(IFG2 & UCB0TXIFG)); //检测发送是否完成
P2OUT |= BIT3; //指示灯检测此步骤
UCB0CTL1 |= UCTXSTP; //向24C02发送停止信号
delayms(1); //延时等待完成
}
|