新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > avr單片機的TWI兩線串行接口

        avr單片機的TWI兩線串行接口

        作者: 時間:2016-11-27 來源:網絡 收藏
        ATMEL的TWI和 PHILIPS的IIC基本上應該是算一個東西,但是他們在名義上是不同的,這樣誰都不用支付給對方使用費。他們的協議是一樣的,所有我們作為使用者基本可以簡單的看成 TWI就是IIC 。

        廢話說完,開始正題。這次是關于在ATMega16 平臺下的硬件IIC(還不太習慣說TWI)的使用。在ATMega16的Datasheet里我們可以看到很強大的功能,主從設置很多。本文只說一種最常用的方式,那就是“ATMega16 硬件TWI 的 掃描發送 和 掃描讀取”。

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

        首先要明確TWI 發送和接受的流程:

        發送:

        1,設定數據傳輸波特率

        2,發送START信號,等待應答==》《== 應答信號

        3,發送芯片地址,等待應答==》《==應答信號

        4,發送數據的絕對地址,等待應答 ==》《==應答信號

        5,發送要寫入的數據,等待應答==》《==應答信號

        6,發送STOP信號,釋放總線==》數據寫入成功

        接收:

        1,設定數據傳輸波特率

        2,發送START信號,等待應答==》《== 應答信號

        3,發送芯片地址,等待應答==》《==應答信號

        4,發送數據的絕對地址,等待應答 ==》《==應答信號

        5,發送RESTART信號,等待應答==》《==應答信號

        6,發送芯片地址并注明讀操作,等待應答 ==》《==應答信號

        7,讀取數據,等待應答==》《==應答信號

        8,發送STOP信號,釋放總線==》數據讀操作成功

        應用芯片 :ATMega 16晶振 : 7.3728

        代碼文件:Project

        |___TWI.C

        ||_____ IAR_DELAY.H

        |___UART.C

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        IAR_DELAY.H

        #ifndef __IAR_DELAY_H
        #define __IAR_DELAY_H

        #include

        #define XTAL 7.3728//可定義為你所用的晶振頻率(單位Mhz)


        #define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) )
        #define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1000) )
        #define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*1000000) )

        #endif

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        UART.C

        #include
        #define uchar unsigned char
        #define uint unsigned int

        //###########################################################

        voidUart_Init(void)
        {
        UCSRB = (1<//允許發送和接收
        UCSRC = (1<

        UBRRH=0x00;//設置波特率寄存器低位字節
        UBRRL=47;//9600//設置波特率寄存器高位字節

        DDRD_Bit1=1;//配置TX為輸出(很重要)
        }
        //###########################################################

        voidUart_Transmit(uchar data)
        {
        while(!(UCSRA&(1<
        //while(UCSRA_UDRE==0);
        UDR = data;
        }

        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        #include
        #include "IAR_DELAY.H"
        #define uchar unsigned char
        #define uint unsigned int

        void Uart_Init(void);
        void Uart_Transmit(uchar data);


        //變量聲明
        #define EEPROM_BUS_ADDRESS 0xA0//器件地址





        //主機發送模式時各狀態字的后續動作
        #define TW_START0x08//開始信號已發出
        #define TW_REP_START0x10//重復開始信號已發出
        #define TW_MT_SLA_ACK0x18//寫字節已發出并受到ACK信號
        #define TW_MT_SLA_NACK0x20//寫字節已發出并受到NACK信號
        #define TW_MT_DATA_ACK0x28//數據已發出并受到ACK 信號
        #define TW_MT_DATA_NACK0x30//數據已發出并受到NACK 信號
        #define TW_MT_ARB_LOST0x38//丟失總線控制權
        //主機接收模式時各狀態字的后續動作
        #define TW_MR_ARB_LOST0x38//丟失總線控制權,未收到應答信號
        #define TW_MR_SLA_ACK0x40//讀命令已發出并受到ACK
        #define TW_MR_SLA_NACK0x48//讀命令已發出并受到NACK
        #define TW_MR_DATA_ACK0x50//數據已收到,ACK已發出
        #define TW_MR_DATA_NACK0x58//數據已收到,NACK已發出

        #define IIC_Start()TWCR =(1<// TWINT位 通過寫1進行清零,一旦清零則TWI開始工作,當相應硬件工作完成后 TWINT位會重新置位為1
        // TWSTA位 會讓硬件在總線上產生一個START的信號 , 聲明自己希望成為主機
        // TWEN 位 使能TWI功能,將 PC0 和 PC1 管腳切換到第二功能上來, 如果清零則為中斷 TWI的傳輸
        #define IIC_Stop()TWCR =(1<// TWSTO位 在主機模式下,會讓硬件在總線上產生一個STOP得信號,并且SCL 和 SDA 兩個引腳位高阻態

        #define IIC_Wait()while(!(TWCR&(1<// TWINT位 經過一次置位使硬件TWI開始工作 ,然后在檢測 TWCR 寄存器的 TWINT 位是不是被置位,如果置位為1則表示工作完成可以向下進行

        //##############################################################################


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 呼玛县| 荣昌县| 白玉县| 南投市| 沙河市| 铜梁县| 丽江市| 三河市| 左云县| 德兴市| 尉氏县| 秭归县| 渝中区| 通江县| 万州区| 中方县| 兰考县| 赤峰市| 丰台区| 江华| 体育| 尉犁县| 项城市| 瑞金市| 乌海市| 井研县| 仙居县| 宣汉县| 武义县| 广河县| 休宁县| 布拖县| 四子王旗| 嘉义县| 金乡县| 阳东县| 黔西| 福海县| 阜城县| 右玉县| 抚远县|