色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > avr單片機(jī)的TWI兩線串行接口

          avr單片機(jī)的TWI兩線串行接口

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


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


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


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


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


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

          本文引用地址:http://cafeforensic.com/article/201611/322111.htm


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

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

          unsigned char twi_read(unsigned char addr)
          {

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


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


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


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


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


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


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


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

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


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

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

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

          delay_ms(2);

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


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


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

          關(guān)閉