新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430 IIC 協議程序

        MSP430 IIC 協議程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        坐在電腦前寫了一整個下午加一個晚上,終于在430上完成了 IIC 協議,在此附上 代碼吧,留個紀念,睡覺去,晚安!

        #ifndef __IIC_h
        #define __IIC_h

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

        #include "basic.h"
        //---------------------------------------
        //宏定義
        #define IIC_OUT P1OUT
        #define IIC_DIR P1DIR
        #define IIC_SEL P1SEL
        #define IIC_IN P1IN

        #define IIC_SDA_IN IIC_IN&0X01//取SDA讀取的值,根據接的高地位不同,與上不同的BIT

        #define SDA_OUT IIC_DIR|=BIT0
        #define SDA_IN IIC_DIR&=~BIT0

        #define SET_SDA IIC_OUT|=BIT0
        #define SET_SCL IIC_OUT|=BIT1
        #define SET_IIC_EN IIC_OUT|=BIT2
        #define CLE_SDA IIC_OUT&=~BIT0
        #define CLE_SCL IIC_OUT&=~BIT1
        #define CLE_IIC_EN IIC_OUT&=~BIT2

        uchar ERROR_BIT=0;//應答錯誤標志,1錯誤,0為正確
        //---------------------------------------
        //IO配置
        void IIC_INIT()
        {
        IIC_SEL=0X00;
        IIC_DIR|=(BIT0+BIT1+BIT2+BIT3);//設定三個位輸出
        }
        //----------------------------------------
        //IIC_START
        void IIC_START()
        {
        SDA_OUT;//設定SDA輸出
        SET_SCL;
        delay();
        SET_SDA;
        delay();
        CLE_SDA;
        delay();
        CLE_SCL;
        delay();
        }
        //----------------------------------------
        //IIC_STOP
        void IIC_STOP()
        {
        SDA_OUT;//設定SDA輸出
        SET_SCL;
        delay();
        CLE_SDA;
        delay();
        SET_SDA;
        delay();
        CLE_SCL;
        delay();
        }
        //---------------------------------------
        //應答信號
        void IIC_ACK()//IIC總線應答////////SCL為高電平時,SDA為低電平,(主機對從機)
        {

        SDA_OUT;//設定SDA輸出
        CLE_SDA;
        delay();
        SET_SCL;
        delay();
        CLE_SCL;
        delay();
        }
        //----------------------------------------
        //無應答信號
        void NO_ACK()//(主機對從機)
        {
        SDA_OUT;//設定SDA輸出


        SET_SDA;
        delay();
        SET_SCL;
        delay();
        CLE_SCL;
        delay();
        }
        //---------------------------------------
        uchar TEST_ACK()//應答錯誤檢測,1錯誤,0為正確
        {
        SDA_IN;
        SET_SCL;
        delay();
        if(IIC_SDA_IN&0x01)
        ERROR_BIT=1;
        else
        ERROR_BIT=0;
        delay();
        CLE_SCL;
        delay();
        return ERROR_BIT;
        }
        //--------------------------------------
        //IIC寫字節
        void IIC_WRITE_DATA(uchar data)
        {
        uchar i;
        SDA_OUT;//設定SDA輸出

        for(i=0;i<8;i++)
        {
        SDA_OUT;
        if(data&0x80)
        {
        SET_SDA;//判斷發送位,送數據到數據線上
        delay();
        }
        else
        {
        CLE_SDA;
        delay();
        }
        data= data<<1;
        SET_SCL;//置時鐘信號為高電平,使數據有效
        delay();
        CLE_SCL;
        delay();
        }
        CLE_SCL;
        delay();

        }
        //----------------------------------------------
        //IIC讀一個字節
        unsigned char IIC_READ_DATA(void)
        {
        SDA_IN;//置數據線為輸入方向
        unsigned char i,q0;
        unsigned char byte=0;
        for(i=0;i<8;i++)
        {
        SET_SCL; //置時鐘為高電平,使數據線數據有效
        delay();
        byte=byte<<1;
        SDA_IN;
        q0=(P1IN & 0X01);
        if(q0==0X01) byte=(byte|0x01); //將數據存入byte
        delay();
        CLE_SCL;
        delay();
        }
        return(byte);
        }

        /*uchar IIC_READ_DATA()
        {
        uchar temp=0;
        uchar i;

        SDA_IN;//設定SDA輸入

        for(i=0;i<8;i++)
        {
        SDA_IN;
        SET_SCL;
        delay();
        temp=temp<<1;
        if(IIC_SDA_IN ==1)
        {
        temp++;
        }
        delay();
        CLE_SCL;
        delay();
        }
        CLE_SCL;
        delay();
        return temp;
        }*/
        #endif

        下面這部分是AT24C02的操作程序


        #ifndef __EEPROM_H
        #define __EEPROM_H
        #include "basic.h"
        #include "IIC.H"
        //--------------------------------------
        //宏定義
        #define READ_MODE 0XA1
        #define WRITE_MODE 0XA0


        //--------------------------------------
        //在一個地址寫一個數據
        uchar AT24C02_W_BYTE(uchar ADD,uchar DATA)
        {
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(WRITE_MODE);//寫入模式
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(ADD);//寫入數據存儲地址
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(DATA);//寫入數據
        //delay();
        if(TEST_ACK())
        return 1;

        IIC_STOP();//停止IIC
        return 0;
        }
        //-----------------------------------------
        //讀一個地址的數據
        uchar AT24C02_R_BYTE(uchar ADD)
        {
        uchar temp=0;
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(WRITE_MODE);//偽寫模式
        if(TEST_ACK())
        return 1;

        IIC_WRITE_DATA(ADD);//寫入讀取地址
        if(TEST_ACK())
        return 1;

        IIC_START();//重新啟動IIC

        IIC_WRITE_DATA(READ_MODE);//讀取模式
        if(TEST_ACK())
        return 1;

        temp=IIC_READ_DATA();//讀取數據
        NO_ACK();

        IIC_STOP();

        return temp;
        }
        //------------------------------------------
        //頁寫
        uchar AT24C02_W_PAGE(uchar *p,uchar ADD,uchar lengh)
        {
        uchar i;

        IIC_START();//啟動IIC

        IIC_WRITE_DATA(WRITE_MODE);//寫模式
        //delay();
        if(TEST_ACK())
        return 1;
        IIC_WRITE_DATA(ADD);//寫入起始地址
        //delay();
        if(TEST_ACK())
        return 1;
        for(i=0;i {
        IIC_WRITE_DATA(*p);
        //delay();
        if(TEST_ACK())//來自EEPROM的應答
        return 1;
        p++;
        }
        IIC_STOP();//停止IIC
        delayms(25);//延時讓IIC進行擦除,
        //延時時間很重要,
        //如果出現寫入數據錯誤,
        //則試試延長時間
        return 0;
        }
        //------------------------------------------
        //連續讀數據
        uchar AT24C02_R_PAGE(uchar *p,uchar ADD,uchar lengh)//*p為要存儲數據的數組,
        //ADD為讀取的起始地址,
        //lengh是要讀取的長度,一般小于7
        {
        uchar i;
        IIC_START();//啟動IIC

        IIC_WRITE_DATA(WRITE_MODE);//偽寫模式
        if(TEST_ACK())
        return 1;

        IIC_WRITE_DATA(ADD);//寫入起始地址
        if(TEST_ACK())
        return 1;

        IIC_START();//重新啟動IIC

        IIC_WRITE_DATA(READ_MODE);//讀模式
        if(TEST_ACK())
        return 1;

        for(i=0;i<(lengh-1);i++)//讀取數據并存儲
        {
        *p=IIC_READ_DATA();

        IIC_ACK();//來自主機的應答
        p++;
        }
        *p=IIC_READ_DATA();
        NO_ACK(); //停止時主機無應答
        delay();
        IIC_STOP();//停止IIC
        delayms(15);
        return 0;
        }
        #endif



        關鍵詞: MSP430IIC協議程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 开阳县| 苍山县| 岐山县| 资阳市| 青川县| 天门市| 措勤县| 溧阳市| 西丰县| 姜堰市| 永宁县| 阿拉善盟| 五家渠市| 凌源市| 焦作市| 泸西县| 灵寿县| 大兴区| 肇州县| 兴安盟| 晋城| 侯马市| 库伦旗| 凌海市| 高清| 梁平县| 南安市| 新昌县| 横山县| 濮阳县| 和政县| 盐亭县| 汾阳市| 苍溪县| 密云县| 浙江省| 贡觉县| 梅河口市| 北辰区| 泰来县| 瑞安市|