//MSP430IIC接口是很方便的物件,但是还是有很多人弃之不用,当然有各种原因,但是如果你确实要用IIC接口,而且容许的话,用它还是很舒服的,可能开始不太顺,但是一旦搞通了你会体会到他的好处。
我看了一些网上的程序,有的仍然用模拟方式的思维处理某些环节,比如应答信号。非要追踪”ACK”不可,其实接口已经提供了“NACK”中断,何必非要反向处理呢?事实上,如果在正常传送中出现“NACK”中断,你要考虑更换器件或者考虑系统的稳定性了。
#include
unsigned char RX_BUF[10];
unsigned char TX_BUF[16];
unsigned char Rece_data[16];
int RX_COUNTER;
int TX_COUNTER;
void Init_IIC(void);
void EEPROM_WriteN(unsigned char mAddr,unsigned char sAddr,unsigned char n);
unsigned char EEPROM_ByteRead(unsigned char mAddr,unsigned char sAddr);
void EEPROM_ReadN(unsigned char mAddr,unsigned char sAddr,unsigned char n);
//=======================================
//USART0中断
//=======================================
#pragma vector = USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 2: I2CTCTL |= I2CSTP; I2CIFG=0; break;//无应答
case 10: RX_BUF[RX_COUNTER] = I2CDRB;
RX_COUNTER++;
break;
case 12: I2CDRB = TX_BUF[TX_COUNTER];
TX_COUNTER++;
break;
default: break;
}
}
//====================================
//系统时钟初始化
//====================================
void INIT_SYSTIMER(void)
{
unsigned char i;
BCSCTL1 &= ~XT2OFF; //选 XT2
do
{
IFG1 &= ~OFIFG; //清除震荡器失效标志
for (i = 0xFF; i > 0; i--); //稳定时间
}
while ((IFG1 & OFIFG)!=0); //如果震荡器失效标志存在,等待
BCSCTL2 = SELM_2 + SELS + DIVS_3; //MCLK时钟源=XT2,SMCLK时钟源=XT2/8
}
//=================================
void delay(unsigned int i)
{
unsigned int j;
for(j=0;j
}
//=================================================
void Init_IIC(void)
{
P3SEL |= 0x0a;
U0CTL = I2C + SYNC;
U0CTL &= ~I2CEN;
I2CTCTL |= I2CSSEL_2; //SMCLK
I2CPSC = 9; //I2C时钟 = SMCLK / 10: 100KH;
I2CSCLH = 0x03; //SCL 高电平为:5 *I2C 时钟
I2CSCLL = 0x03; //SCL 低电平为:5 *I2C 时钟
I2CSA = 0X50;
I2CNDAT = 0x02;