<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ò) 收藏


          unsigned char twi_write(unsigned char addr, unsigned char dd)
          {
          TWBR = 10;//設(shè)定波特率


          IIC_Start();//硬件發(fā)送START信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
          IIC_Wait();//等待 發(fā)送START完成 TWINT位置位
          if ((TWSR & 0xF8) != 0x08) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = EEPROM_BUS_ADDRESS ;//芯片地址 0xA0 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x18) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = addr;//將寫入數(shù)據(jù)的絕對地址 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = dd;//將要寫入的數(shù)據(jù) ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0

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


          IIC_Stop();//數(shù)據(jù)傳輸完成,發(fā)送STOP信號,釋放對總線的控制
          return 1;//寫入數(shù)據(jù)成功 ,返回1 ,用來判斷是否成功寫入數(shù)據(jù)

          }
          //##############################################################################

          unsigned char twi_read(unsigned char addr)
          {

          unsigned char Receive_Byte ;
          TWBR = 2;//設(shè)定波特率


          IIC_Start();//硬件發(fā)送START信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
          IIC_Wait();//等待 發(fā)送START完成 TWINT位置位
          if ((TWSR & 0xF8) != 0x08) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = EEPROM_BUS_ADDRESS;//芯片地址 0xA0 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x18) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = addr;//將寫入數(shù)據(jù)的絕對地址 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x28) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          IIC_Start();//硬件發(fā)送 RESTART 信號,并且清零TWINT位,使能硬件TWI,使TWI開始工作
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x10) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWDR = 0xA1;//芯片地址 0xA0 并注明是讀取操作(最后一位為 1 ),賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x40) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0


          TWCR = (1 << TWINT) | (1 << TWEN);//對控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
          IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
          if ((TWSR & 0xF8) != 0x58) return 0;//檢測到TWINT位置位,比對TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯誤返回 0
          Receive_Byte = TWDR;//讀取到的數(shù)據(jù)放到局部變量里


          IIC_Stop();//數(shù)據(jù)傳輸完成,發(fā)送STOP信號,釋放對總線的控制

          return Receive_Byte;//將讀取到的數(shù)據(jù)作為函數(shù)的輸出


          }
          //##############################################################################

          void main(void)
          {
          uchar c,d;
          Uart_Init();//串口初始化
          delay_us(20);
          Uart_Transmit(0x55);//測試串口

          c = twi_write(0x51,0xf8);//在地址0x51里寫入數(shù)據(jù)0x22
          Uart_Transmit(c);//將返回值發(fā)送到串口測試是否寫入成功

          delay_ms(2);

          d = twi_read(0x51);//將地址0x51里的數(shù)據(jù)讀出來
          Uart_Transmit(d);//將讀取到的數(shù)據(jù)發(fā)送串口
          while(1);
          }


          上一頁 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); })();