<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        ATmega16利用TWI模塊讀寫24C02程序

        作者:蕭文   來源:本站原創   點擊數:  更新時間:2014年04月01日   【字體:

        /********************************************************
        工程名稱:AT_Mega16_master
        創建日期:2007.10.21
        程序編寫:朱海峰
        聯系方式:543376422(QQ)       13405100406(手機)
        AT24C02存儲一個字節,并讀回校驗,正確蜂鳴器響一聲,不正確響兩聲
        AT24C02地址:0XA0
         EEPROM地址:0X01
        TWI工作方式:查詢方式
        ********************************************************/
        #include <iom16v.h>
        #include <macros.h>
        #define uint unsigned int
        #define uchar unsigned char
        #define SLA_W               0xa0  //從機地址,主機寫操作
        #define SLA_R               0xa1  //從機地址,主機讀操作
        #define EE_address   0x01  //EEPROM地址     
        #define Write_data   0x04  //寫入的數據  
        #define Baud_set   100   //TWI波特率設置
        #define P_value    0x03  //預分頻值
        #define beep_on()   DDRD |= (1<<2);PORTD |= (1<<2);
        #define beep_off()   DDRD |= (1<<2);PORTD &= ~(1<<2);
        //TWI讀寫操作公共步驟
        #define ST_FAIL    0 //出錯狀態
        #define ST_START   1 //START狀態檢查
        #define ST_SLAW    2 //SLAW狀態檢查
        #define ST_WADDR   3 //ADDR狀態檢查
        //TWI讀操作步驟
        #define ST_RESTART   4 //RESTART狀態檢查
        #define ST_SLAR    5 //SLAR狀態檢查
        #define ST_RDATA   6 //讀取數據狀態檢查,循環n字節
        //TWI寫操作步驟
        #define ST_WDATA   7 //寫數據狀態檢查,循環n字節

        #define FAIL_MAX   20 //重試次數最大值
        /**********************I2C狀態定義*************************/
        /************************主機發送狀態碼********************/
        #define TW_START    0x08 //START已發送
        #define TW_REP_START   0x10 //重復START已發送
        #define TW_MT_SLA_ACK   0x18 //SLA+W 已發送收到ACK
        #define TW_MT_SLA_NACK   0x20 //SLA+W 已發送接收到NOT ACK
        #define TW_MT_DATA_ACK   0x28 //數據已發送接收到ACK
        #define TW_MT_DATA_NACK   0x30 //數據已發送接收到NOT ACK
        #define TW_MT_ARB_LOST   0x38 //SLA+W 或數據的仲裁失敗
        /*************************主機接收狀態碼*****************/
        //#define TW_START    0x08 //START已發送
        //#define TW_REP_START   0x10 //重復START已發送
        #define TW_MR_ARB_LOST   0x38 //SLA+R 或NOT ACK 的仲裁失敗
        #define TW_MR_SLA_ACK   0x40 //SLA+R 已發送接收到ACK
        #define TW_MR_SLA_NACK   0x48 //SLA+R 已發送接收到NOT ACK
        #define TW_MR_DATA_ACK   0x50 //接收到數據ACK 已返回
        #define TW_MR_DATA_NACK   0x58 //接收到數據NOT ACK已返回
        /************************從機接收狀態碼******************
        #define TW_SR_SLA_ACK   0x60 //自己的SLA+W 已經被接收ACK已返回
        #define TW_SR_ARB_LOST_SLA_ACK 0x68 //SLA+R/W 作為主機的仲裁失;自己的SLA+W 已經被接收ACK 已返回
        #define TW_SR_GCALL_ACK   0x70 //接收到廣播地址ACK 已返回
        #define TW_SR_ARB_LOST_GCALL_ACK 0x78 //SLA+R/W 作為主機的仲裁失;接收到廣播地址ACK已返回
        #define TW_SR_DATA_ACK   0x80 //以前以自己的SLA+W被尋址;數據已經被接收ACK已返回
        #define TW_SR_DATA_NACK   0x88 //以前以自己的SLA+W被尋址;數據已經被接收NOT ACK已返回
        #define TW_SR_GCALL_DATA_ACK 0x90 //以前以廣播方式被尋址;數據已經被接收ACK已返回
        #define TW_SR_GCALL_DATA_NACK 0x98 //以前以廣播方式被尋址;數據已經被接收NOT ACK已返回
        #define TW_SR_STOP    0xA0 //在以從機工作時接收到STOP或重復START
        /*************************從發送狀態碼*******************
        #define TW_ST_SLA_ACK   0xA8 //自己的SLA+R 已經被接收ACK 已返回
        #define TW_ST_ARB_LOST_SLA_ACK 0xB0 //SLA+R/W 作為主機的仲裁失;自己的SLA+R 已經被接收ACK 已返回
        #define TW_ST_DATA_ACK   0xB8 //TWDR 里數據已經發送接收到ACK
        #define TW_ST_DATA_NACK   0xC0 //TWDR 里數據已經發送接收到NOT ACK
        #define TW_ST_LAST_DATA   0xC8 //TWDR 的一字節數據已經發送(TWAE = “0”);接收到ACK
        /****************************其它狀態碼*****************
        #define TW_NO_INFO    0xF8 //沒有相關的狀態信息;TWINT = “0”
        #define TW_BUS_ERROR   0x00 //由于非法的START 或STOP 引起的總線錯誤
         
        /******************************************************/
        void Chip_init(void);
        void TWI_init(void);
        void Delay_ms(uint ms);
        /*****************************************************/
        void main (void)
        {
          uchar temp;
          CLI();
          Chip_init();
          TWI_init();
          Delay_ms(10);
          while(1)
          {
          beep_on();
          Delay_ms(1000);
          beep_off();
          Delay_ms(1000);
        /************將0x04寫入AT24C02內部的以0X01為地址的存儲區****************/
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
          while (!(TWCR & (1<<TWINT)));  //0x08
          TWDR = SLA_W;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x18
          TWDR = EE_address;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x28
          TWDR = Write_data;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x28
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          Delay_ms(50);
        /*********從AT24C02內部的以0X01為地址的存儲區讀出剛剛寫入的數據*************/
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
          while (!(TWCR & (1<<TWINT)));  //0x08
          TWDR = SLA_W;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x18
          TWDR = EE_address;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT))); //0x28
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
          while (!(TWCR & (1<<TWINT)));  //0x10
          TWDR = SLA_R;
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x40
          TWCR = (1<<TWINT) | (1<<TWEN);
          while (!(TWCR & (1<<TWINT)));  //0x58
          temp = TWDR;
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
          if (temp == Write_data)
          {
              beep_on();
              Delay_ms(1000);
              beep_off();
              Delay_ms(1000);
          }
          else
          {
            beep_on();
           Delay_ms(1000);
           beep_off();
           Delay_ms(1000);
           beep_on();
           Delay_ms(1000);
           beep_off();
           Delay_ms(1000);
          }
          for(;;)
          NOP();
          }
        }
        /*****************************************************
        函數名:Chip_init
        作  用:芯片的初始化
        *****************************************************/
        void Chip_init()
        {
          DDRD = 0X04;   //00001000---PD2:蜂鳴器   
         PORTD = 0X00;   //
        }/****************************************************
        函數名:TWI_init
        作  用:TWI接口的初始化
        *****************************************************/
        void TWI_init(void)
        {
             TWAR = 0x00;         //主機模式,該地址無效
             TWCR = 0x00;         //關閉TWI模塊
          TWBR = Baud_set;        //100
          TWSR = P_value;         //64分頻
        }
        /****************************************************/
        void Delay_ms(uint ms)
        {
          uint i,j;
         for(;ms>0;ms--)
          for(i = 0;i<100;i++)
          ;
        }
        /*****************************

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮