<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > avr單片機(jī)的TWI兩線串行接口

          avr單片機(jī)的TWI兩線串行接口

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/322111.htm

          首先要明確TWI 發(fā)送和接受的流程:

          發(fā)送:

          1,設(shè)定數(shù)據(jù)傳輸波特率

          2,發(fā)送START信號,等待應(yīng)答==》《== 應(yīng)答信號

          3,發(fā)送芯片地址,等待應(yīng)答==》《==應(yīng)答信號

          4,發(fā)送數(shù)據(jù)的絕對地址,等待應(yīng)答 ==》《==應(yīng)答信號

          5,發(fā)送要寫入的數(shù)據(jù),等待應(yīng)答==》《==應(yīng)答信號

          6,發(fā)送STOP信號,釋放總線==》數(shù)據(jù)寫入成功

          接收:

          1,設(shè)定數(shù)據(jù)傳輸波特率

          2,發(fā)送START信號,等待應(yīng)答==》《== 應(yīng)答信號

          3,發(fā)送芯片地址,等待應(yīng)答==》《==應(yīng)答信號

          4,發(fā)送數(shù)據(jù)的絕對地址,等待應(yīng)答 ==》《==應(yīng)答信號

          5,發(fā)送RESTART信號,等待應(yīng)答==》《==應(yīng)答信號

          6,發(fā)送芯片地址并注明讀操作,等待應(yīng)答 ==》《==應(yīng)答信號

          7,讀取數(shù)據(jù),等待應(yīng)答==》《==應(yīng)答信號

          8,發(fā)送STOP信號,釋放總線==》數(shù)據(jù)讀操作成功

          應(yīng)用芯片 :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<//允許發(fā)送和接收
          UCSRC = (1<

          UBRRH=0x00;//設(shè)置波特率寄存器低位字節(jié)
          UBRRL=47;//9600//設(shè)置波特率寄存器高位字節(jié)

          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//器件地址





          //主機(jī)發(fā)送模式時各狀態(tài)字的后續(xù)動作
          #define TW_START0x08//開始信號已發(fā)出
          #define TW_REP_START0x10//重復(fù)開始信號已發(fā)出
          #define TW_MT_SLA_ACK0x18//寫字節(jié)已發(fā)出并受到ACK信號
          #define TW_MT_SLA_NACK0x20//寫字節(jié)已發(fā)出并受到NACK信號
          #define TW_MT_DATA_ACK0x28//數(shù)據(jù)已發(fā)出并受到ACK 信號
          #define TW_MT_DATA_NACK0x30//數(shù)據(jù)已發(fā)出并受到NACK 信號
          #define TW_MT_ARB_LOST0x38//丟失總線控制權(quán)
          //主機(jī)接收模式時各狀態(tài)字的后續(xù)動作
          #define TW_MR_ARB_LOST0x38//丟失總線控制權(quán),未收到應(yīng)答信號
          #define TW_MR_SLA_ACK0x40//讀命令已發(fā)出并受到ACK
          #define TW_MR_SLA_NACK0x48//讀命令已發(fā)出并受到NACK
          #define TW_MR_DATA_ACK0x50//數(shù)據(jù)已收到,ACK已發(fā)出
          #define TW_MR_DATA_NACK0x58//數(shù)據(jù)已收到,NACK已發(fā)出

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

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

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


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();