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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ATMEGA16通過TWI對24C02進(jìn)行讀寫

          ATMEGA16通過TWI對24C02進(jìn)行讀寫

          作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏

          #ifndef TWI_H
          #define TWI_H

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

          //主機(jī)模式啟動(dòng)狀態(tài)碼
          #define TWI_START 0X08
          #define TWI_RESTART 0X10
          //主機(jī)發(fā)送模式狀態(tài)碼
          #define TWI_MT_SLA_ACK 0X18 //SLA+W 已發(fā)送,接收到ACK
          #define TWI_MT_SLA_NACK 0X20 //SLA+W 已發(fā)送,接收到NOT ACK
          #define TWI_MT_DATA_ACK 0X28 //數(shù)據(jù)已發(fā)送,接收到ACK
          #define TWI_MT_DATA_NACK 0X30 //數(shù)據(jù)已發(fā)送,接收到NOT ACK
          #define TWI_MT_ARB_LOST 0X38 //SLA+W 或數(shù)據(jù)的仲裁失敗
          //主機(jī)接收模式狀態(tài)碼
          #define TWI_MR_ARB_LOST 0X38 //SLA+R 或數(shù)據(jù)的仲裁失敗
          #define TWI_MR_SLA_ACK 0X40 //SLA+R 已發(fā)送,接收到ACK
          #define TWI_MR_SLA_NACK 0X48 //SLA+R 已發(fā)送,接收到NOT ACK
          #define TWI_MR_DATA_ACK 0X50 //數(shù)據(jù)已接收,接收到ACK
          #define TWI_MR_DATA_NACK 0X58 //數(shù)據(jù)已接收,接收到NOT ACK
          //從機(jī)接收模式狀態(tài)碼
          #define TWI_SR_SLA_ACK 0X60 //自己的SLA+W 已經(jīng)被接收,ACK 已返回
          #define TWI_SR_ARB_LOST_SLA_ACK 0X68 //SLA+R/W 作為主機(jī)的仲裁失敗;自己的SLA+W 已經(jīng)被接收,ACK 已返回
          #define TWI_SR_GCALL_ACK 0X70 //接收到廣播地址,ACK 已返回
          #define TWI_SR_ARB_LOST_GCALL_ACK 0X78 //SLA+R/W 作為主機(jī)的仲裁失敗;接收到廣播地址ACK 已返回
          #define TWI_SR_DATA_ACK 0X80 //以前以自己的 SLA+W 被尋址;數(shù)據(jù)已經(jīng)被接收ACK 已返回
          #define TWI_SR_DATA_NACK 0X88 //以前以自己的 SLA+W 被尋址;數(shù)據(jù)已經(jīng)被接收NOT ACK 已返回
          #define TWI_SR_GCALL_DATA_ACK 0X90 //以前以廣播方式被尋址;數(shù)據(jù)已經(jīng)被接收ACK 已返回
          #define TWI_SR_GCALL_DATA_NACK 0X98 //以前以廣播方式被尋址;數(shù)據(jù)已經(jīng)被接收NOT ACK 已返回
          #define TWI_SR_STOP 0XA0 //在以從機(jī)工作時(shí)接收到STOP或重復(fù)START
          //從機(jī)發(fā)送模式狀態(tài)碼
          #define TWI_ST_SLA_ACK 0XA8 //自己的SLA+R 已經(jīng)被接收ACK 已返回
          #define TWI_ST_ARB_LOST_SLA_ACK 0XB0 //SLA+R/W 作為主機(jī)的仲裁失敗;自己的SLA+R 已經(jīng)被接收ACK 已返回
          #define TWI_ST_DATA_ACK 0XB8 //TWDR 里數(shù)據(jù)已經(jīng)發(fā)送,接收到ACK
          #define TWI_ST_DATA_NACK 0XC0 //TWDR 里數(shù)據(jù)已經(jīng)發(fā)送,接收到NOT ACK
          #define TWI_ST_LAST_DATA 0XC8 //TWDR 的一字節(jié)數(shù)據(jù)已經(jīng)發(fā)送(TWAE = “0”);接收到ACK
          //其他狀態(tài)
          #define TWI_NO_INFO 0xF8 //沒有相關(guān)的狀態(tài)信息,TWINT=0
          #define TWI_BUS_ERROR 0x00 //由于非法的START或STOP引起的總線錯(cuò)誤
          //TWI使用時(shí)的控制位
          #define TWI_Start() TWCR = (1< //清零TWINT、清零start狀態(tài)、使能TWI.發(fā)出START 信號(hào)
          #define TWI_Wait() while (!(TWCR & (1< //等待TWINT 置位, TWINT 置位表示START 信號(hào)已發(fā)出
          #define TWI_Status (TWSR & 0xF8) //檢驗(yàn)TWI 狀態(tài)寄存器,屏蔽預(yù)分頻位
          #define TWI_Stop() TWCR=(1< //發(fā)送STOP 信號(hào)
          #define TWI_SendAck() (TWCR|=(1< //使能TWI應(yīng)答
          #define TWI_SendNoAck() (TWCR&=~(1< //不使能TWI應(yīng)答
          #define TWI_RcvNckByte() (TWCR=(1< //使能TWI不產(chǎn)生應(yīng)答
          #define TWI_RcvAckByte() (TWCR=(1< //使能TWI、產(chǎn)生應(yīng)答
          #define TWI_Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<// 定義TWI運(yùn)行狀態(tài)的極性
          #define TWI_ERR 0
          #define TWI_CRR 1

          #define TWI_WRITE 0
          #define TWI_READ 1
          void delay(uint ms)
          {
          uint i,j;
          for(i=ms;i>0;i--)
          for(j=1141;j>0;j--);
          }

          void TWI_Init(void)
          {
          TWBR=0X0F;
          TWSR=0;
          }

          uchar TWIWait(void)
          {
          uchar i=100;
          while(!(TWCR&(1< //等待TWINT置1
          {
          if((--i)==0)
          return TWI_ERR;
          }
          return TWI_CRR;
          }

          uchar TWIStart(void)
          {
          TWI_Start();
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_START)
          return TWI_ERR;
          return TWI_CRR;
          }

          uchar TWIREStart(void)
          {
          TWI_Start();
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_RESTART)
          return TWI_ERR;
          return TWI_CRR;
          }

          uchar TWI_Write_WADDR(uchar addr)
          {
          TWI_Writebyte(addr);
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_MT_SLA_ACK)
          return TWI_ERR;
          return TWI_CRR;
          }


          uchar TWI_Write_RADDR(uchar addr)
          {
          TWI_Writebyte(addr);
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_MR_SLA_ACK)
          return TWI_ERR;
          return TWI_CRR;
          }


          uchar TWI_SendData(uchar data)
          {
          TWI_Writebyte(data);
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_MT_DATA_ACK)
          return TWI_ERR;
          return TWI_CRR;
          }

          uchar TWI_ReciveDATA_ACK(uchar *pdata)
          {
          TWI_RcvAckByte();
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_MR_DATA_ACK)
          return TWI_ERR;
          *pdata=TWDR;
          return TWI_CRR;
          }

          uchar TWI_ReciveDATA_NACK(uchar *pdata)
          {
          TWI_RcvNckByte();
          if(TWIWait()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Status!=TWI_MR_DATA_NACK)
          return TWI_ERR;
          *pdata=TWDR;
          return TWI_CRR;
          }

          uchar TWI_W_Byte(uchar Maddr,uchar Saddr,uchar data)
          {
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保證寫入的SLA+W正確
          return TWI_ERR;
          if(TWI_SendData(Saddr)==TWI_ERR) //器件內(nèi)寄存器的地址作為一般數(shù)據(jù)發(fā)送
          return TWI_ERR;
          if(TWI_SendData(data)==TWI_ERR) //發(fā)送要寫入的數(shù)據(jù)
          return TWI_ERR;
          TWI_Stop();
          return TWI_CRR;
          }

          uchar TWI_W_Data(uchar Maddr,uchar Saddr,uchar *pdata,uchar num)
          {
          uchar i;
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保證寫入的SLA+W正確
          return TWI_ERR;
          if(TWI_SendData(Saddr)==TWI_ERR) //器件內(nèi)寄存器的地址作為一般數(shù)據(jù)發(fā)送
          return TWI_ERR;
          for(i=0;i {
          if(TWI_SendData(*(pdata++))==TWI_ERR)
          return TWI_ERR;
          }
          TWI_Stop();
          return TWI_CRR;
          }

          uchar TWI_R_Byte(uchar Maddr,uchar Saddr,uchar *pdata)
          {
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR) //保證寫入的SLA+W正確
          return TWI_ERR;
          if(TWI_SendData(Saddr)==TWI_ERR) ////器件內(nèi)寄存器的地址作為一般數(shù)據(jù)發(fā)送
          return TWI_ERR;
          if(TWIREStart()==TWI_ERR) //這里的重新發(fā)送start很重要,這里我們的主機(jī)不想放棄TWI的使用權(quán) 參看《深入淺出AVR單片機(jī)》289頁
          return TWI_ERR;
          if(TWI_Write_RADDR((Maddr&0xfe)|TWI_READ)==TWI_ERR) //參看《深入淺出AVR單片機(jī)》289頁
          return TWI_ERR;
          if(TWI_ReciveDATA_NACK(pdata)==TWI_ERR) //讀取數(shù)據(jù)時(shí),最后1字節(jié)的數(shù)據(jù)讀取完成以后發(fā)送NAK而不是ACK
          return TWI_ERR;
          TWI_Stop();
          return TWI_CRR;
          }

          uchar TWI_R_Data(uint Maddr,uchar Saddr,uchar *pdata,uchar num)
          {
          uchar i;
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR)
          return TWI_ERR;
          if(TWI_SendData(Saddr)==TWI_ERR)
          return TWI_ERR;
          if(TWIREStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_RADDR((Maddr&0xfe)|TWI_READ)==TWI_ERR)
          return TWI_ERR;
          for(i=0;i {
          if(TWI_ReciveDATA_ACK(pdata+i)==TWI_ERR)
          return TWI_ERR;
          }
          if(TWI_ReciveDATA_NACK(pdata+i)==TWI_ERR) //讀取數(shù)據(jù)時(shí),最后1字節(jié)的數(shù)據(jù)讀取完成以后發(fā)送NAK而不是ACK,這點(diǎn)很重要
          return TWI_ERR;
          TWI_Stop();
          return TWI_CRR;
          }

          uchar TWI_W_NAddr(uchar addr,uchar data)
          {
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_WADDR(addr)==TWI_ERR)
          return TWI_ERR;
          if(TWI_SendData(data)==TWI_ERR)
          return TWI_ERR;
          TWI_Stop();
          return TWI_CRR;
          }

          uchar TWI_R_NAddr(uchar addr,uchar *pdata)
          {
          if(TWIStart()==TWI_ERR)
          return TWI_ERR;
          if(TWI_Write_RADDR(addr)==TWI_ERR)
          return TWI_ERR;
          if(TWI_ReciveDATA_NACK(pdata)==TWI_ERR)
          return TWI_ERR;
          TWI_Stop();
          return TWI_CRR;
          }
          #endif


          #include
          #include "IIC.h"
          void port_init(void)
          {
          DDRB=0XFF;
          PORTB=0XFF;
          TWCR=0X44;
          DDRD=0XFF;
          PORTD=0XFF;
          }

          uchar temp1[8]={18,17,16,15,14,13,12,11};
          uchar temp2[8]={0};
          uchar temp3[8]={0,0,0,0,0,0,0,0};
          void main(void)
          {
          TWI_Init();
          port_init();
          if(TWI_W_Data(0Xa0,0x00,temp1,8)==TWI_ERR)
          PORTD&=~(BIT(PD0));
          delay(5); //這里的延時(shí)很重要,如果不加,讀出來的數(shù)據(jù)很是匪夷所思
          if((TWI_R_Data(0Xa1,0x00,temp2,8))==TWI_ERR)
          PORTD&=~BIT(PD7);
          if(temp2[1]==17)
          PORTB=0X00;
          while(1)
          {
          if(temp2[0]==18)
          {
          PORTB=0XFE;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }
          if(temp2[1]==17)
          {
          PORTB=0XFD;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }
          if(temp2[2]==16)
          {
          PORTB=0XFB;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }

          if(temp2[3]==15)
          {
          PORTB=0XF7;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }

          if(temp2[4]==14)
          {
          PORTB=0XEF;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }

          if(temp2[5]==13)
          {
          PORTB=0XDF;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }

          if(temp2[6]==12)
          {
          PORTB=0XBF;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }

          if(temp2[7]==11)
          {
          PORTB=0X7F;
          delay(100);
          PORTB=0XFF;
          delay(50);
          }
          }
          }

          仿真PROTUES7.5圖如下



          示波器查看波形如圖


          IIC接收數(shù)據(jù)查看如圖


          關(guān)鍵詞: ATMEGA16TWI24C0

          評論


          技術(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); })();