新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 測試AVR的TWI寫24c02芯片的簡單函數

        測試AVR的TWI寫24c02芯片的簡單函數

        作者: 時間:2016-11-20 來源:網絡 收藏
        //文件名:"I2C.h"

        //描述:聲明讀寫24c02以及初始化TWI的全局函數

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

        #define uchar unsigned char
        #define uint unsigned int
        void I2C_Inti(void);
        void Write_24c02(uchar add,uchar data);
        uchar Read_24c02(uchar add);

        //文件名:"I2C.c"

        //描述:定義關于24c02以及TWI的相關函數

        #include
        #include
        #include"I2C.h"

        #define TW_START 0X08
        #define TW_REP_START 0X10
        #define TW_MT_SLA_ACK 0X18
        #define TW_MT_SLA_nACK 0X20
        #define TW_MT_DATA_ACK 0X28
        #define TW_MT_DATA_nACK 0X30
        #define TW_MT_LOST 0X38
        #define TW_MR_LOST 0X38
        #define TW_MR_SLA_ACK 0X40
        #define TW_MR_SLA_nACK 0X48
        #define TW_MR_DATA_ACK 0X50
        #define TW_MR_DATA_nACK 0X58

        //函數名;I2C_Inti
        //輸入:無
        //輸出:無
        //描述:初始化AVR的TWI端口

        void I2C_Inti(void)
        {
        TWBR=10;
        TWSR=0X00;
        TWAR=0X00;
        DDRC=0X80;
        PORTC=0XFF;
        }

        //函數名;I2C_Start
        //輸入:無
        //輸出:成功返回1,失敗返回0
        //描述:TWI開始(或重復開始)函數


        uchar I2C_Start(void)
        {
        TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN);
        while(!(TWCR&BIT(TWINT)));
        if((TWSR&0XF8)==TW_START)//開始TWI成功
        {
        return 1;
        }
        if((TWSR&0XF8)==TW_REP_START) //再次開始TWI成功
        {
        return 1;
        }
        return 0;
        }

        //函數名;I2C_Stop
        //輸入:無
        //輸出:無
        //描述:TWI結束函數


        void I2C_Stop(void)
        {
        TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWSTO);
        }

        //函數名;Write_I2C
        //輸入:待寫的地址或數據
        //輸出:有應答返回1,無應答返回0
        //描述:主機寫

        uchar Write_I2C(uchar data)
        {
        uchar ack=1;
        TWDR=data;
        TWCR=BIT(TWINT)|BIT(TWEN);
        while(!(TWCR&BIT(TWINT)));
        if((TWSR&0XF8)==TW_MT_SLA_ACK) //發送芯片地址(寫)成功,有應答
        {
        return ack;
        }
        if((TWSR&0XF8)==TW_MT_DATA_ACK) //發送數據成功,有應答
        {
        return ack;
        }
        if((TWSR&0XF8)==TW_MR_SLA_ACK) //發送芯片地址(讀)成功,有應答
        {
        return ack;
        }
        return 0;
        }

        //函數名;Read_I2C
        //輸入:是否應答,1--發送應答,0--不發送應答
        //輸出:讀數據成功返回讀出的一個字節數據,失敗返回0
        //描述:主機讀

        uchar Read_I2C(uchar ack)
        {
        if(ack)
        {
        TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA);
        while(!(TWCR&BIT(TWINT)));
        if((TWSR&0XF8)==TW_MR_DATA_ACK)
        {
        return(TWDR);
        }
        }
        else
        {
        TWCR=BIT(TWINT)|BIT(TWEN);
        while(!(TWCR&BIT(TWINT)));
        if((TWSR&0XF8)==TW_MR_DATA_nACK)
        {
        return(TWDR);
        }
        }
        return 0;
        }

        //函數名;Read_24c02
        //輸入:存儲地址add
        //輸出:返回讀出的一個字節數據
        //描述:主機讀24c02指定地址

        uchar Read_24c02(uchar add)
        {
        uchar data;
        I2C_Start();
        Write_I2C(0XAE);
        Write_I2C(add);
        I2C_Start();
        Write_I2C(0XAF);
        data=Read_I2C(0);
        I2C_Stop();
        return data;
        }


        //函數名;Write_24c02
        //輸入:存儲地址add,待寫的數據data
        //輸出:無
        //描述:主機寫24c02指定地址一個字節的數據

        void Write_24c02(uchar add,uchar data)
        {
        I2C_Start();
        Write_I2C(0XAE);
        Write_I2C(add);
        Write_I2C(data);
        I2C_Stop();
        }

        //文件名:"main.c"

        //描述:測試讀寫24c02的函數,利用數碼管顯示

        #include
        #include
        #include"I2C.h"

        #define ON_138 PORTC|=BIT(PC7) //使能74138
        #define OFF_138 PORTC&=~BIT(PC7)

        const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //顯示的段碼值
        uchar buffer[]={0,0,0}; //存放待顯示的數據的段碼

        //函數名;Send_Buffer
        //輸入:待數碼管顯示的數據
        //輸出:無
        //描述:將顯示的數據譯碼

        void Send_Buffer(uchar data)
        {
        buffer[0]=table[data/100];
        data=data0;
        buffer[1]=table[data/10];
        data=data;
        buffer[2]=table[data];
        }

        //函數名;Display
        //輸入:待顯示的位置和段碼值,site--[0,2]
        //輸出:無
        //描述:在指定位置顯示指定數據

        void Display(uchar site,uchar data)
        {
        if(site==0)
        {
        PORTA=0X00;
        PORTB=data;
        }
        if(site==1)
        {
        PORTA=0X01;
        PORTB=data;
        }
        if(site==2)
        {
        PORTA=0X02;
        PORTB=data;
        }
        }

        //函數名;delay_ms
        //輸入:無
        //輸出:無
        //描述:延時1ms

        void delay_ms(uint ms)
        {
        uint i,j;
        for(i=0;i for(j=0;j<564;j++);
        }

        void main()
        {
        uchar temp;
        I2C_Inti();
        DDRA=0XFF;
        PORTA=0X00;
        DDRB=0XFF;
        PORTB=0X00;
        ON_138;
        temp=Read_24c02(0x08); //讀地址為0x08的存儲數據
        Send_Buffer(temp);
        temp++;
        Write_24c02(0x08,temp); // 寫temp到存儲地址0x08
        while(1)
        {
        Display(0,buffer[0]);
        delay_ms(3);
        Display(1,buffer[1]);
        delay_ms(3);
        Display(2,buffer[2]);
        delay_ms(3);
        }
        }

        附圖:



        關鍵詞: AVRTWI寫24c02芯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鹤山市| 潮州市| 昭苏县| 福建省| 上杭县| 博乐市| 公主岭市| 中西区| 台中市| 时尚| 长宁区| 个旧市| 尼木县| 兰坪| 西和县| 昭觉县| 安丘市| 舞钢市| 瑞金市| 偏关县| 南木林县| 理塘县| 梨树县| 临泽县| 潍坊市| 黔东| 洛宁县| 金秀| 湛江市| 察哈| 云霄县| 莎车县| 星子县| 双柏县| 佳木斯市| 桃源县| 崇州市| 永靖县| 米林县| 于田县| 祥云县|