MSP430非模擬IIC總線控制程序
#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:
{
//訪問準(zhǔn)備好中斷
break;
}
case I2CIV_RXRDY:
{
//接收準(zhǔn)備好中斷
I2CBuffer[0]=I2CDRB;
break;
}
case I2CIV_TXRDY:
{
//發(fā)送準(zhǔn)備好中斷
I2CDRB = I2CBuffer[tx_count];
tx_count = tx_count - 1;
if (tx_count < 0)
{
//禁止發(fā)送中斷
I2CIE &= ~TXRDYIE;
}
break;
}
case I2CIV_GC:
{
//一般調(diào)用中斷
break;
}
case I2CIV_STT:
{
//起始條件中斷
break;
}
}
}
void Init_IIC_Port(void)
{
//初始化端口寄存器 與IIC口無關(guān)的PX口關(guān)閉以便于對編寫系統(tǒng)板的綜合程序.
//P1DIR = 0xFF;
//P2DIR = 0xFF;
P3DIR = 0xF5;
//P4DIR = 0xFF;
P5DIR = 0x7F;
//P6DIR = 0xFF;
//P4OUT = 0X11;
//P5OUT &= 0XF0;
P3SEL|=BIT1+BIT3; //在這里如果設(shè)置成
}
void Init_CLK(void)
{
unsigned int i;
//將寄存器的內(nèi)容清零
//XT2震蕩器開啟
//LFTX1工作在低頻模式
//ACLK的分頻因子為1
BCSCTL1 = 0X00;
do
{
// 清除OSCFault標(biāo)志
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;
}
//對于系統(tǒng)時鐘的選擇關(guān)系到整個程序運行穩(wěn)定性.
看到很多賣開發(fā)板的人將IIC硬件寫上去后再去搞個模擬的IIC總線程序. 感覺到有點說不出的感覺. 其實430的IIC不是專用來外擴(kuò)展FLASH的,而是用來和一些特殊的電路連接,實現(xiàn)功能. 對于MSP430147~149 15X 16X 的芯片內(nèi)部有48~60K的Flash了還有必要來個模擬的IIC總線時序么.裝個UCOS都可以了.開發(fā)板要做的事情就是如何做好非模擬IIC程序的設(shè)計.更不是為了和C1搞比拼搶占市場.
上面的程序是經(jīng)過MSP430F1611的測試.程序的大部分來自
評論