新聞中心

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

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

        作者: 時間:2016-11-27 來源:網絡 收藏


        unsigned char twi_write(unsigned char addr, unsigned char dd)
        {
        TWBR = 10;//設定波特率


        IIC_Start();//硬件發送START信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
        IIC_Wait();//等待 發送START完成 TWINT位置位
        if ((TWSR & 0xF8) != 0x08) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量,如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = EEPROM_BUS_ADDRESS ;//芯片地址 0xA0 ,賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x18) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = addr;//將寫入數據的絕對地址 ,賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = dd;//將要寫入的數據 ,賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0

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


        IIC_Stop();//數據傳輸完成,發送STOP信號,釋放對總線的控制
        return 1;//寫入數據成功 ,返回1 ,用來判斷是否成功寫入數據

        }
        //##############################################################################

        unsigned char twi_read(unsigned char addr)
        {

        unsigned char Receive_Byte ;
        TWBR = 2;//設定波特率


        IIC_Start();//硬件發送START信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
        IIC_Wait();//等待 發送START完成 TWINT位置位
        if ((TWSR & 0xF8) != 0x08) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量,如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = EEPROM_BUS_ADDRESS;//芯片地址 0xA0 ,賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x18) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = addr;//將寫入數據的絕對地址 ,賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        IIC_Start();//硬件發送 RESTART 信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x10) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        TWDR = 0xA1;//芯片地址 0xA0 并注明是讀取操作(最后一位為 1 ),賦值給數據寄存器 TWDR ,等待發送
        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x40) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0


        TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進行清零,然后 使能TWI硬件接口 ,讓TWI進行工作,發送 TWDR寄存器 中的數據
        IIC_Wait();//等待數據發送完畢 TWINT重新置位
        if ((TWSR & 0xF8) != 0x58) return 0;//檢測到TWINT位置位,比對TWSR寄存器內的狀態量 , 如果正確則向下進行數據傳輸,錯誤返回 0
        Receive_Byte = TWDR;//讀取到的數據放到局部變量里


        IIC_Stop();//數據傳輸完成,發送STOP信號,釋放對總線的控制

        return Receive_Byte;//將讀取到的數據作為函數的輸出


        }
        //##############################################################################

        void main(void)
        {
        uchar c,d;
        Uart_Init();//串口初始化
        delay_us(20);
        Uart_Transmit(0x55);//測試串口

        c = twi_write(0x51,0xf8);//在地址0x51里寫入數據0x22
        Uart_Transmit(c);//將返回值發送到串口測試是否寫入成功

        delay_ms(2);

        d = twi_read(0x51);//將地址0x51里的數據讀出來
        Uart_Transmit(d);//將讀取到的數據發送串口
        while(1);
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 乌兰浩特市| 灵石县| 滨海县| 汉寿县| 亳州市| 呼玛县| 定陶县| 顺昌县| 黔西县| 静海县| 昌平区| 通河县| 雷波县| 筠连县| 建昌县| 桃源县| 曲水县| 北流市| 阳江市| 雷州市| 汝城县| 全椒县| 大连市| 河北省| 梓潼县| 方山县| 南陵县| 扶绥县| 冕宁县| 礼泉县| 越西县| 庆云县| 大渡口区| 荆门市| 台安县| 宁晋县| 嘉祥县| 鄂伦春自治旗| 绥江县| 额尔古纳市| 通化市|