Arduino IIC 主從設備連接通信


目的:
       實現Arduino主從設備之間的互相IIC通信,掌握IIC通信協議的使用方法。
器材:
Arduino UNO R3 一塊
Arduino Nano 三塊
面包板   導線
3K電阻 2個
連接方法:

 

    由於Arduino IIC接口總線沒有上拉電阻,在連接布線時需要提供兩個上拉電阻。
 
首先給出程序:
Master程序
   #include <Wire.h>
void setup() {
  Wire.begin(); // join i2cbus (主機,不用寫IIC地址)
  Serial.begin(9600); // 串口輸出
 }
 
int i = 1;
 
 void loop()
 {
     //向從機寫入數據
     Wire.beginTransmission(2);
     Wire.write(i);
     Wire.endTransmission();
     //讀數據
     Wire.requestFrom(2, 6); // 要求2號IIC設備,通過Wire傳送 6個 char過來
     while(Wire.available()) // 如果Wire上有 char 等讀取
     {
           char c = Wire.read(); // 從Wire 上讀取一個char
            Serial.print(c); //輸出到串口監視器查看
     }
     delay(2000); // 等2秒
     Serial.println( ); // 輸出到下一行方便查看       
    
     //向從機寫入數據
     Wire.beginTransmission(3);
     Wire.write(i);
     Wire.endTransmission();
     //讀數據
     Wire.requestFrom(3, 6); // 要求2號IIC設備,通過Wire傳送 6個 char過來
     while(Wire.available()) // 如果Wire上有 char 等讀取
     {
           char c = Wire.read(); // 從Wire 上讀取一個char
            Serial.print(c); //輸出到串口監視器查看
     }
      delay(2000); // 等2秒
      Serial.println( ); // 輸出到下一行方便查看           
   
     //向從機寫入數據
     Wire.beginTransmission(4);
     Wire.write(i);
     Wire.endTransmission();
     //讀數據
     Wire.requestFrom(4, 6); // 要求2號IIC設備,通過Wire傳送 6個 char過來
     while(Wire.available()) // 如果Wire上有 char 等讀取
     {
           char c = Wire.read(); // 從Wire 上讀取一個char
            Serial.print(c); //輸出到串口監視器查看
     }
      delay(2000); // 等2秒
      Serial.println( ); // 輸出到下一行方便查看     
   
     i++;
     i = i%4;
 
 }// loop
 
 
SALVE程序
#include <Wire.h>
void ggyy();
//接收主機命令
int revData = 0;
void receiveData(int byteCount) {  
  while (Wire.available()) {
    int number = Wire.read();
    Serial.print("data received1: ");
    Serial.println(number);
    revData = number;
    } 
 
void setup()
{
  Wire.begin(3); //通知IIC總線, 是2 號IIC設備地址
  Wire.onReceive(receiveData);
  Wire.onRequest(ggyy); // 注冊當收到主機信息時相應的調用函數ggyy( )
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}
void loop()
{ // 從機,代碼空
      int b = revData;
      revData = 0;
      for(int i = 0; i < b; i++){
      digitalWrite(13,HIGH);
      delay(200);
      digitalWrite(13,LOW);
      delay(200);
    }
}
// 信息處理函數,必須在 setup( ) 內用onRequest( ) 注冊
void ggyy()
{
  Wire.write("World "); // 送出 6 個char給IC 上的主機
}
 
 
程序要點分析:
Master程序用Wire.begin();設置,表示本機為Master
  主機向從機寫入數據格式
     Wire.beginTransmission(從機地址號);
     Wire.write(數據byte);
     Wire.endTransmission();
Master從Salve讀數據
     Wire.requestFrom(從機地址, 字符個數);
     while(Wire.available()) // 如果Wire上有 char 等讀取
     {
           char c = Wire.read(); // 從Wire 上讀取一個char
            Serial.print(c); //輸出到串口監視器查看
     }
SLAVE用Wire.begin(地址號)表示本機為SLAVE,並設置地址號
5.  注冊用於接收和發送的函數
Wire.onReceive(receiveData);
     Wire.onRequest(sendData);
兩個函數的格式:
void receiveData(int byteCount);
void sendData ();
 
當主機發出requestForm請求時,從機響應,開始發送數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM