新闻中心

EEPW首页>嵌入式系统>设计应用> MSP430非模拟IIC总线控制程序

MSP430非模拟IIC总线控制程序

作者: 时间:2016-12-02 来源:网络 收藏

#if __VER__ < 200
interrupt [USART0TX_VECTOR] void ISR_I2C(void)
#else
#pragma vector=USART0TX_VECTOR
__interrupt void ISR_I2C(void)
#endif //上面的程序其实只要编写 :

//#pragma vector=USART0TX_VECTOR __interrupt void ISR_I2C(void)就行.
{
switch (I2CIV)
{
case I2CIV_AL:
{
//仲裁中断
break;
}
case I2CIV_NACK:
{
//NACK中断
break;
}
case I2CIV_OA:
{
//自己地址中断
break;
}
case I2CIV_ARDY:
{
//访问准备好中断
break;
}
case I2CIV_RXRDY:
{
//接收准备好中断
I2CBuffer[0]=I2CDRB;
break;
}
case I2CIV_TXRDY:
{
//发送准备好中断
I2CDRB = I2CBuffer[tx_count];
tx_count = tx_count - 1;
if (tx_count < 0)
{
//禁止发送中断
I2CIE &= ~TXRDYIE;
}
break;
}
case I2CIV_GC:
{
//一般调用中断
break;
}
case I2CIV_STT:
{
//起始条件中断
break;
}
}
}
void Init_IIC_Port(void)
{
//初始化端口寄存器 与IIC口无关的PX口关闭以便于对编写系统板的综合程序.
//P1DIR = 0xFF;
//P2DIR = 0xFF;
P3DIR = 0xF5;
//P4DIR = 0xFF;
P5DIR = 0x7F;
//P6DIR = 0xFF;
//P4OUT = 0X11;
//P5OUT &= 0XF0;
P3SEL|=BIT1+BIT3; //在这里如果设置成

}
void Init_CLK(void)
{
unsigned int i;
//将寄存器的内容清零
//XT2震荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
BCSCTL1 = 0X00;
do
{
// 清除OSCFault标志
IFG1 &= ~OFIFG;
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1

//open XT2, LFTX2 选择低频率
BCSCTL1 &= ~(XT2OFF + XTS); //BCSCTL1=0X00 功能一样
//DCO Rsel=7(Freq=3200k/25摄氏度)
BCSCTL1 |= RSEL0 + RSEL1 + RSEL2;
BCSCTL1 |= 0x07;
//MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELM1;
//SMCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS;
}

//对于系统时钟的选择关系到整个程序运行稳定性.

看到很多卖开发板的人将IIC硬件写上去后再去搞个模拟的IIC总线程序. 感觉到有点说不出的感觉. 其实430的IIC不是专用来外扩展FLASH的,而是用来和一些特殊的电路连接,实现功能. 对于MSP430147~149 15X 16X 的芯片内部有48~60K的Flash了还有必要来个模拟的IIC总线时序么.装个UCOS都可以了.开发板要做的事情就是如何做好非模拟IIC程序的设计.更不是为了和C1搞比拼抢占市场.

上面的程序是经过MSP430F1611的测试.程序的大部分来自 上,曾想自己从新开发定义一个,但想到网络上没有这个程序的完整版.我就修改了其中的几个地方.一方面便于自己查看并复习也适于网络上的朋友来讨论交流.

上一页 1 2 3 下一页

评论


技术专区

关闭