<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程序

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

          作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
          /********************************************************

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

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

          #define FAIL_MAX 20 //重試次數(shù)最大值
          /**********************I2C狀態(tài)定義*************************/
          /************************主機(jī)發(fā)送狀態(tài)碼********************/
          #define TW_START 0x08 //START已發(fā)送
          #define TW_REP_START 0x10 //重復(fù)START已發(fā)送
          #define TW_MT_SLA_ACK 0x18 //SLA+W 已發(fā)送收到ACK
          #define TW_MT_SLA_NACK 0x20 //SLA+W 已發(fā)送接收到NOT ACK
          #define TW_MT_DATA_ACK 0x28 //數(shù)據(jù)已發(fā)送接收到ACK
          #define TW_MT_DATA_NACK 0x30 //數(shù)據(jù)已發(fā)送接收到NOT ACK
          #define TW_MT_ARB_LOST 0x38 //SLA+W 或數(shù)據(jù)的仲裁失敗
          /*************************主機(jī)接收狀態(tài)碼*****************/
          //#define TW_START 0x08 //START已發(fā)送
          //#define TW_REP_START 0x10 //重復(fù)START已發(fā)送
          #define TW_MR_ARB_LOST 0x38 //SLA+R 或NOT ACK 的仲裁失敗
          #define TW_MR_SLA_ACK 0x40 //SLA+R 已發(fā)送接收到ACK
          #define TW_MR_SLA_NACK 0x48 //SLA+R 已發(fā)送接收到NOT ACK
          #define TW_MR_DATA_ACK 0x50 //接收到數(shù)據(jù)ACK 已返回
          #define TW_MR_DATA_NACK 0x58 //接收到數(shù)據(jù)NOT ACK已返回
          /************************從機(jī)接收狀態(tài)碼******************
          #define TW_SR_SLA_ACK 0x60 //自己的SLA+W 已經(jīng)被接收ACK已返回
          #define TW_SR_ARB_LOST_SLA_ACK 0x68 //SLA+R/W 作為主機(jī)的仲裁失??;自己的SLA+W 已經(jīng)被接收ACK 已返回
          #define TW_SR_GCALL_ACK 0x70 //接收到廣播地址ACK 已返回
          #define TW_SR_ARB_LOST_GCALL_ACK 0x78 //SLA+R/W 作為主機(jī)的仲裁失??;接收到廣播地址ACK已返回
          #define TW_SR_DATA_ACK 0x80 //以前以自己的SLA+W被尋址;數(shù)據(jù)已經(jīng)被接收ACK已返回
          #define TW_SR_DATA_NACK 0x88 //以前以自己的SLA+W被尋址;數(shù)據(jù)已經(jīng)被接收NOT ACK已返回
          #define TW_SR_GCALL_DATA_ACK 0x90 //以前以廣播方式被尋址;數(shù)據(jù)已經(jīng)被接收ACK已返回
          #define TW_SR_GCALL_DATA_NACK 0x98 //以前以廣播方式被尋址;數(shù)據(jù)已經(jīng)被接收NOT ACK已返回
          #define TW_SR_STOP 0xA0 //在以從機(jī)工作時(shí)接收到STOP或重復(fù)START
          /*************************從發(fā)送狀態(tài)碼*******************
          #define TW_ST_SLA_ACK 0xA8 //自己的SLA+R 已經(jīng)被接收ACK 已返回
          #define TW_ST_ARB_LOST_SLA_ACK 0xB0 //SLA+R/W 作為主機(jī)的仲裁失敗;自己的SLA+R 已經(jīng)被接收ACK 已返回
          #define TW_ST_DATA_ACK 0xB8 //TWDR 里數(shù)據(jù)已經(jīng)發(fā)送接收到ACK
          #define TW_ST_DATA_NACK 0xC0 //TWDR 里數(shù)據(jù)已經(jīng)發(fā)送接收到NOT ACK
          #define TW_ST_LAST_DATA 0xC8 //TWDR 的一字節(jié)數(shù)據(jù)已經(jīng)發(fā)送(TWAE = “0”);接收到ACK
          /****************************其它狀態(tài)碼*****************
          #define TW_NO_INFO 0xF8 //沒有相關(guān)的狀態(tài)信息;TWINT = “0”
          #define TW_BUS_ERROR 0x00 //由于非法的START 或STOP 引起的總線錯(cuò)誤

          /******************************************************/
          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內(nèi)部的以0X01為地址的存儲(chǔ)區(qū)****************/
          TWCR = (1< while (!(TWCR & (1< TWDR = SLA_W;
          TWCR = (1< while (!(TWCR & (1< TWDR = EE_address;
          TWCR = (1< while (!(TWCR & (1< TWDR = Write_data;
          TWCR = (1< while (!(TWCR & (1< TWCR = (1< Delay_ms(50);
          /*********從AT24C02內(nèi)部的以0X01為地址的存儲(chǔ)區(qū)讀出剛剛寫入的數(shù)據(jù)*************/
          TWCR = (1< while (!(TWCR & (1< TWDR = SLA_W;
          TWCR = (1< while (!(TWCR & (1< TWDR = EE_address;
          TWCR = (1< while (!(TWCR & (1< TWCR = (1< while (!(TWCR & (1< TWDR = SLA_R;
          TWCR = (1< while (!(TWCR & (1< TWCR = (1< while (!(TWCR & (1< temp = TWDR;
          TWCR = (1< 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();
          }
          }
          /*****************************************************
          函數(shù)名:Chip_init
          作 用:芯片的初始化
          *****************************************************/
          void Chip_init()
          {
          DDRD = 0X04; //00001000---PD2:蜂鳴器
          PORTD = 0X00; //
          }/****************************************************
          函數(shù)名:TWI_init
          作 用:TWI接口的初始化
          *****************************************************/
          void TWI_init(void)
          {
          TWAR = 0x00; //主機(jī)模式,該地址無效
          TWCR = 0x00; //關(guān)閉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++)
          ;
          }
          /*****************************



          關(guān)鍵詞: ATmega16TWI模塊24C0

          評(píng)論


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