Home

Published

- 3 min read

I2C & SPI

img of I2C & SPI

I2C (Inter-Integrated Circuit) และ SPI (Serial Peripheral Interface) ซึ่งเป็นโปรโตคอลการสื่อสารข้อมูลแบบอนุกรมที่ใช้ใน ATmega328P (Arduino Uno R3) โดยสรุปได้ดังนี้:


Inter-Integrated Circuit

I2C (Inter-Integrated Circuit)

I2C เป็นโปรโตคอลการสื่อสารแบบ สองสาย (Two-Wire Interface - TWI) ใช้ SDA (Serial Data) และ SCL (Serial Clock) โดยสามารถเชื่อมต่ออุปกรณ์ได้สูงสุด 128 ตัว

คุณสมบัติของ I2C

  • ใช้สายสัญญาณเพียง 2 เส้น (SDA, SCL)
  • รองรับการทำงานแบบ Master-Slave (หลาย Master และหลาย Slave)
  • Slave แต่ละตัวมี Address 7-bit รองรับ 128 อุปกรณ์
  • รองรับความเร็ว สูงสุด 400 kHz
  • สามารถจัดการสัญญาณรบกวน และ Sleep Mode
  • รองรับมาตรฐาน I2C Protocol

ข้อดี-ข้อเสียของ I2C

✅ ข้อดี

  • ใช้สายสัญญาณน้อยกว่าสื่อสารแบบอื่น
  • รองรับอุปกรณ์หลายตัว (หลาย Master & Slave)
  • มีระบบตรวจสอบความถูกต้องของข้อมูล (ACK/NACK)

❌ ข้อเสีย

  • ความเร็วต่ำกว่า SPI
  • จำกัดข้อมูลที่ส่งครั้งละ 8 bits
  • ซับซ้อนกว่า SPI ในบางกรณี

ขา I2C บน

ขา I2C บน Arduino Uno R3

  • Pin A4 → SDA
  • Pin A5 → SCL

ตัวอย่างโค้ด I2C

Master

Master (ส่งข้อมูลไปยัง Slave)

   #include <Wire.h>
int x = 0;

void setup() {
  Wire.begin(); // กำหนดเป็น Master
}

void loop() {
  Wire.beginTransmission(9); // กำหนด Address ของ Slave
  Wire.write(x);             // ส่งค่าตัวแปร x ไปยัง Slave
  Wire.endTransmission();    // จบการส่งข้อมูล

  x++;
  if (x > 6) {
    x = 0;
  }
  delay(200);
}

Slave

Slave (รับข้อมูลจาก Master และเปิด LED)

   #include <Wire.h>
int LED = 13;
int x = 0;

void setup() {
  pinMode(LED, OUTPUT);
  Wire.begin(9); // ตั้งค่า Address เป็น 9
  Wire.onReceive(receiveEvent);
}

void receiveEvent(int bytes) {
  x = Wire.read(); // อ่านข้อมูลที่เข้ามา
}

void loop() {
  if (x <= 3) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

Serial Peripheral Interface

SPI (Serial Peripheral Interface)

SPI เป็นโปรโตคอลสื่อสารแบบ High-Speed Synchronous ใช้สำหรับเชื่อมต่ออุปกรณ์หลายตัวที่ต้องการรับ-ส่งข้อมูลความเร็วสูง

คุณสมบัติของ SPI

  • ใช้สายสัญญาณ 4 เส้น
    • MOSI (Master Out Slave In) → ส่งข้อมูลจาก Master ไปยัง Slave
    • MISO (Master In Slave Out) → ส่งข้อมูลจาก Slave ไปยัง Master
    • SCK (Clock) → ใช้ส่งสัญญาณ Clock
    • SS/CS (Slave Select/Chip Select) → ใช้เลือก Slave ที่ต้องการสื่อสาร
  • รองรับเฉพาะ 1 Master หลาย Slave
  • ความเร็วสูงกว่าทั้ง UART และ I2C
  • เลือกส่งข้อมูลแบบ MSB หรือ LSB ก่อน ได้
  • มี Interrupt Flag สำหรับตรวจสอบสถานะการรับส่งข้อมูล

ข้อดี-ข้อเสียของ SPI

✅ ข้อดี

  • ไม่มี Start/Stop Bits ทำให้ส่งข้อมูลต่อเนื่องได้เร็ว
  • ไม่ต้องใช้ Slave Addressing เหมือน I2C
  • มี แยกเส้นสัญญาณ MISO/MOSI ทำให้ส่งและรับข้อมูลพร้อมกันได้

❌ ข้อเสีย

  • ใช้สายมากกว่า I2C (4 เส้น เทียบกับ I2C ที่ใช้เพียง 2 เส้น)
  • ไม่มีการตรวจสอบความผิดพลาดเหมือน UART (Parity Bit)
  • รองรับ Master ได้เพียงตัวเดียว

ขา SPI

ขา SPI บน Arduino Uno R3

  • Pin 10 → SS (Slave Select)
  • Pin 11 → MOSI (Master Out Slave In)
  • Pin 12 → MISO (Master In Slave Out)
  • Pin 13 → SCK (Clock)

ตัวอย่างโค้ด SPI

Master

Master (ส่งข้อมูลไปยัง Slave)

   #include <SPI.h>

void setup() {
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV8); // ตั้ง Clock Divider
  pinMode(SS, OUTPUT);
}

void loop() {
  digitalWrite(SS, LOW);
  byte received = SPI.transfer(1); // ส่งค่า "1" และรับค่ากลับจาก Slave
  digitalWrite(SS, HIGH);
  delay(1000);
}

Slave

Slave (รับข้อมูลจาก Master และเปิด LED)

   #include <SPI.h>

volatile byte receivedData;

void setup() {
  pinMode(MISO, OUTPUT);
  SPCR |= _BV(SPE); // เปิด SPI (Enable)
  SPI.attachInterrupt();
}

ISR (SPI_STC_vect) {
  receivedData = SPDR; // อ่านค่าจาก SPI Data Register
}

void loop() {
  if (receivedData == 1) {
    digitalWrite(13, HIGH); // เปิด LED
  } else {
    digitalWrite(13, LOW); // ปิด LED
  }
}

สรุป

I2C (Inter-Integrated Circuit)

  • จำนวนสาย: 2 เส้น (SDA, SCL)
  • ความเร็ว: 100 kHz - 400 kHz
  • การใช้งาน: ใช้ใน Sensor, EEPROM และอุปกรณ์ที่ต้องการเชื่อมต่อหลายตัว
  • Master/Slave: รองรับ หลาย Master & Slave
  • ข้อดี:
    • ใช้สายสัญญาณน้อย
    • รองรับอุปกรณ์หลายตัว
    • มีระบบตรวจสอบข้อมูล (ACK/NACK)
  • ข้อเสีย:
    • ความเร็วต่ำกว่าทางเลือกอื่น
    • ซับซ้อนกว่า SPI

SPI (Serial Peripheral Interface)

  • จำนวนสาย: 4 เส้น (MOSI, MISO, SCK, SS)
  • ความเร็ว: สูงกว่า I2C (MHz ระดับสูง)
  • การใช้งาน: ใช้ใน SD Card, Display และอุปกรณ์ที่ต้องการส่งข้อมูลเร็ว
  • Master/Slave: รองรับ 1 Master, หลาย Slave
  • ข้อดี:
    • ความเร็วสูงมาก
    • รับ-ส่งข้อมูลได้พร้อมกัน (Full-Duplex)
    • ไม่มี Overhead จาก Start/Stop Bit
  • ข้อเสีย:
    • ใช้สายมากกว่า I2C
    • ไม่มีระบบตรวจสอบข้อผิดพลาด (เช่น Parity Bit)
    • รองรับ Master ได้เพียงตัวเดียว