在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

            ATMEGA16通過(guò)TWI對(duì)24C02進(jìn)行讀寫(xiě)

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

            #ifndef TWI_H
            #define TWI_H

            本文引用地址:http://www.biyoush.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ī)的仲裁失?。唤邮盏綇V播地址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 //沒(méi)有相關(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) //保證寫(xiě)入的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ā)送要寫(xiě)入的數(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) //保證寫(xiě)入的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) //保證寫(xiě)入的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頁(yè)
            return TWI_ERR;
            if(TWI_Write_RADDR((Maddr&0xfe)|TWI_READ)==TWI_ERR) //參看《深入淺出AVR單片機(jī)》289頁(yè)
            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í)很重要,如果不加,讀出來(lái)的數(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

            評(píng)論


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

            關(guān)閉