新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430F5529 I2C 程序

        MSP430F5529 I2C 程序

        作者: 時間:2016-11-13 來源:網絡 收藏
        MSP430板子到了好久,一直沒有時間來寫程序,前兩天終于有空了,把I2C調試了下,參照TI給的例程,把發送和接收整合到一起。期間中斷屏蔽處理的不好,經常進不了中斷。網上也沒有可參照的例程。只有仔細讀了MSP430F55xx的用戶手冊,才調通。用戶手冊才是王道呀!

        #include <msp430.h>
        #include "i2c.h"
        extern unsigned char RXData,TXData,TXByteCtr,ATXData[2];

        void I2C_Init(uint8_t SlaveAddress)
        {
        P3SEL |= 0x03; // Assign I2C pins to USCI_B0
        UCB0CTL1 |= UCSWRST; // Enable SW reset
        UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
        UCB0CTL1 = UCSSEL_2 + UCSWRST+UCTR; // Use SMCLK
        UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
        UCB0BR1 = 0;
        UCB0I2CSA = SlaveAddress; // Slave Address is 048h
        UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
        UCB0IE |= UCTXIE+UCRXIE+UCSTPIE;
        }
        void I2C_WriteReg(unsigned char RegAddr, unsigned char Data) //////////涓婁笅灞侫PI闇?瑕佺敤鍒?
        {

        TXByteCtr = 2; // Load TX byte counter
        ATXData[0]=RegAddr;
        ATXData[1]=Data;

        while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
        UCB0IE |= UCTXIE;
        UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
        __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupts
        __no_operation();
        }


        uint8_t I2C_ReadByte() //////////涓婁笅灞侫PI闇?瑕佺敤鍒?
        {

        while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
        UCB0CTL1 &= ~UCTR;
        UCB0IE &=~ UCTXIE;
        UCB0CTL1 |= UCTXSTT; // I2C start condition

        while(UCB0CTL1 & UCTXSTT); // Start condition sent?
        UCB0CTL1 |= UCTXSTP;
        return RXData;

        }


        #pragma vector = USCI_B0_VECTOR
        __interrupt void USCI_B0_ISR(void)
        {
        switch(__even_in_range(UCB0IV,12))
        {
        case 0: break; // Vector 0: No interrupts
        case 2: break; // Vector 2: ALIFG
        case 4: break; // Vector 4: NACKIFG
        case 6: break; // Vector 6: STTIFG
        case 8:
        UCB0IFG &= ~UCSTPIFG; // Clear stop condition int flag
        __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0 if data was transmitted
        break; // Vector 8: STPIFG
        case 10:
        RXData=UCB0RXBUF;
        // UCB0CTL1 |= UCTXNACK+UCTXSTP;
        UCB0IFG &= ~UCRXIFG;

        __bic_SR_register_on_exit(LPM0_bits);
        break; // Vector 10: RXIFG
        case 12: // Vector 12: TXIFG
        if (TXByteCtr) // Check TX byte counter
        {
        UCB0TXBUF = ATXData[2-TXByteCtr]; // Load TX buffer
        TXByteCtr--; // Decrement TX byte counter
        }
        else
        {
        UCB0CTL1 |= UCTXSTP; // I2C stop condition
        UCB0IFG &= ~UCTXIFG; // Clear USCI_B0 TX int flag
        __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
        }
        break;
        default: break;
        }
        }

        本文引用地址:http://www.104case.com/article/201611/316475.htm


        關鍵詞: MSP430F5529I2

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 梅州市| 天全县| 台南县| 无为县| 乐安县| 河曲县| 喜德县| 霞浦县| 布拖县| 海原县| 西乌珠穆沁旗| 宜兴市| 滁州市| 西畴县| 隆子县| 怀仁县| 伊春市| 翼城县| 津南区| 龙江县| 临朐县| 滨海县| 上虞市| 张家川| 玉门市| 乐至县| 泰和县| 鸡泽县| 岢岚县| 绥阳县| 安吉县| 阿图什市| 富宁县| 壶关县| 清镇市| 梨树县| 扶风县| 武安市| 惠安县| 湘乡市| 剑河县|