> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/th/support/knowledge-base/commication-bus.md).

# บัสการสื่อสาร (I2C, SPI)

### บัสการสื่อสารคืออะไร <a href="#undefined" id="undefined"></a>

บัสการสื่อสารสามารถเข้าใจได้ว่าเป็นชุดสายสัญญาณและกฎการสื่อสารที่ใช้ร่วมกัน ซึ่งทำให้ MCU บนตัวควบคุมการบินสามารถแลกเปลี่ยนข้อมูลกับเซนเซอร์ หน่วยความจำ หรืออุปกรณ์ต่อพ่วงอื่น ๆ ได้

ในระบบตัวควบคุมการบิน บัสแต่ละชนิดมีบทบาทที่แตกต่างกัน I2C และ SPI มักใช้บนบอร์ดตัวควบคุมการบินหรือในตำแหน่งที่ใกล้ตัวควบคุมการบินมาก เนื่องจากเหมาะกับการสื่อสารระดับบอร์ดระยะสั้นถึงปานกลาง มากกว่าการเชื่อมต่ออุปกรณ์ต่อพ่วงภายนอกระยะไกล

### เหตุใดจึงต้องมีบัสหลายชนิด <a href="#undefined" id="undefined"></a>

ระบบตัวควบคุมการบินต้องจัดการ IMU ความเร็วสูง บารอมิเตอร์ แมกนีโตมิเตอร์ Flash เซนเซอร์วัดระยะ และอุปกรณ์ต่อพ่วงอื่น ๆ พร้อมกัน จึงไม่สามารถพึ่งพาวิธีการสื่อสารเพียงแบบเดียวในการทำงานทั้งหมดได้

การเลือกใช้บัสแต่ละชนิดมักพิจารณาจากหลายด้าน: ความเร็ว ความซับซ้อนของการต่อสาย จำนวนอุปกรณ์ที่เชื่อมต่อได้ ความสามารถในการต้านทานสัญญาณรบกวน และระยะการเดินสายที่ยอมรับได้

## I2C <a href="#i2c" id="i2c"></a>

### I2C คืออะไร <a href="#i2c" id="i2c"></a>

I2C (Inter-Integrated Circuit) คือบัสอนุกรมแบบสองสาย ที่อนุญาตให้อุปกรณ์หลายตัวใช้สายข้อมูลและสายสัญญาณนาฬิกาชุดเดียวกัน

ข้อดีหลักคือต่อสายง่าย ประหยัดขาของ MCU และสามารถเชื่อมต่ออุปกรณ์หลายตัวบนบัสเดียวกัน จึงเหมาะอย่างยิ่งสำหรับการสื่อสารกับเซนเซอร์ความเร็วต่ำถึงปานกลางในระยะสั้น

### สัญญาณพื้นฐานของ I2C <a href="#i2c" id="i2c"></a>

I2C ใช้สายสัญญาณพื้นฐานสองเส้น:

| สัญญาณ | การใช้งาน                                               |
| ------ | ------------------------------------------------------- |
| SCL    | สายสัญญาณนาฬิกา โดยฝั่งควบคุมหลักเป็นผู้ให้สัญญาณนาฬิกา |
| SDA    | สายข้อมูล ใช้ร่วมกันแบบสองทิศทาง                        |

ในทางปฏิบัติ I2C ยังต้องมีสายไฟเลี้ยงและสายกราวดด้วย แต่หัวใจของการสื่อสารมีเพียง SCL และ SDA สองเส้น

### I2C เลือกอุปกรณ์อย่างไร <a href="#i2c" id="i2c"></a>

I2C เป็นบัสแบบกำหนดที่อยู่ได้ แต่ละอุปกรณ์จะมีที่อยู่ (Address) ของตนเอง ฝั่งควบคุมหลักจะใช้ที่อยู่เพื่อกำหนดว่าจะสื่อสารกับอุปกรณ์ตัวใด

สถาปัตยกรรมนี้ทำให้เซนเซอร์หลายตัวใช้สายชุดเดียวกันได้ โดยมีเงื่อนไขว่าที่อยู่ของแต่ละอุปกรณ์บนบัสเดียวกันต้องไม่ซ้ำกัน หากอุปกรณ์สองตัวใช้ที่อยู่เดียวกันและไม่สามารถเปลี่ยนที่อยู่ได้ จะไม่สามารถต่อบน I2C เดียวกันโดยตรงได้

### ความเร็วที่พบบ่อยของ I2C <a href="#i2c" id="i2c"></a>

ความเร็วที่พบบ่อยของ I2C คือ **100 kHz** และ **400 kHz** ซึ่งสอดคล้องกับโหมดมาตรฐาน (Standard Mode) และโหมดเร็ว (Fast Mode) ตามลำดับ

สำหรับการใช้งานกับตัวควบคุมการบิน ความเร็วนี้เหมาะกับบารอมิเตอร์ แมกนีโตมิเตอร์ LED เครื่องวัดระยะบางรุ่น และเซนเซอร์ความเร็วต่ำอื่น ๆ แต่โดยทั่วไปไม่เหมาะกับสตรีมข้อมูล IMU หลักที่มีอัตราอัปเดตสูงและอ่อนไหวต่อความหน่วง

### การใช้งานที่พบบ่อยของ I2C <a href="#i2c" id="i2c"></a>

ในระบบตัวควบคุมการบิน พบ I2C บ่อยในกรณีต่อไปนี้:

* บารอมิเตอร์หรือแมกนีโตมิเตอร์สำรองบนบอร์ด
* เข็มทิศ LED หรือเครื่องวัดระยะบางรุ่นที่ต่อภายนอกในระยะสั้น
* เซนเซอร์ความเร็วต่ำบางรุ่นที่มีเฉพาะอินเทอร์เฟซ I2C

เอกสาร PX4 ระบุไว้เป็นพิเศษว่า I2C เหมาะสำหรับการเชื่อมต่อระยะสั้น บนบอร์ดหรือระยะใกล้ และมักใช้เชื่อมต่ออุปกรณ์ต่อพ่วง เช่น compass, rangefinder และ LEDs

### ข้อจำกัดของ I2C <a href="#i2c" id="i2c"></a>

แม้ I2C จะต่อสายง่าย แต่ไม่เหมาะกับการใช้งานระยะไกล มีสัญญาณรบกวนสูง หรือต้องการแบนด์วิดท์สูง

ในสภาพแวดล้อมของโดรน หาก I2C ยาวเกินประมาณ 10 ถึง 15 เซนติเมตร จะไม่น่าเชื่อถือได้ง่ายเนื่องจากผลของความจุไฟฟ้าของสายและสัญญาณรบกวน ดังนั้นหากโมดูลภายนอกอยู่ห่างออกไป โดยทั่วไปไม่แนะนำให้ใช้ I2C ต่อไป

### ตัวต้านทาน Pull-up <a href="#pull-up" id="pull-up"></a>

SDA และ SCL ของ I2C ต้องมีตัวต้านทาน pull-up ดึงขึ้นไปที่ 3.3V บัสจึงจะทำงานได้ตามปกติ

บอร์ดตัวควบคุมการบินจำนวนมากมี pull-up เหล่านี้บนบอร์ดอยู่แล้ว แต่หากวงจรของอุปกรณ์ภายนอกหรือบอร์ดแปลงออกแบบต่างกัน ยังควรตรวจสอบว่ามี pull-up ซ้ำซ้อน ขาด pull-up หรือระดับแรงดันไม่เข้ากันหรือไม่

### บัส I2C ค้าง (Bus Lockup) <a href="#i2c" id="i2c"></a>

ปัญหาที่พบบ่อยอย่างหนึ่งของ I2C คืออุปกรณ์บางตัวอาจดึง SDA ลงต่ำค้างไว้เนื่องจากสัญญาณรบกวน ข้อผิดพลาดของเฟิร์มแวร์ หรือการส่งข้อมูลถูกขัดจังหวะ ทำให้ทั้งบัสไม่สามารถทำงานได้ตามปกติอีก

สถานการณ์นี้มักเรียกว่า bus lockup เมื่อเกิดขึ้น มักไม่ใช่ปัญหาของอุปกรณ์เพียงตัวเดียว แต่อุปกรณ์อื่น ๆ บน I2C เดียวกันอาจล้มเหลวไปพร้อมกัน ในหลายกรณีต้องจ่ายไฟใหม่จึงจะกลับมาทำงานได้

### เหตุใดจึงไม่แนะนำให้ IMU หลักใช้ I2C <a href="#imu--i2c" id="imu--i2c"></a>

ตามคำแนะนำของเอกสาร PX4 ไม่ควรเชื่อมต่อ IMU ผ่าน I2C เนื่องจากความเร็วของ I2C ไม่เพียงพอต่อการตรวจวัดความถี่สูงและงานที่ต้องใช้ข้อมูลแบบเรียลไทม์จำนวนมาก เช่น การกรองการสั่นสะเทือน

นอกจากนี้ เมื่อมีอุปกรณ์บน I2C เดียวกันมากขึ้น ประสิทธิภาพจะลดลงอีก ดังนั้น IMU หลักซึ่งสำคัญที่สุดต่อการควบคุมท่าทางการบิน มักจะใช้ SPI ที่เร็วและเสถียรกว่าแทน

## SPI <a href="#spi" id="spi"></a>

### SPI คืออะไร <a href="#spi" id="spi"></a>

SPI (Serial Peripheral Interface) คือบัสอนุกรมความเร็วสูง ที่ใช้สายส่ง สายรับ และสายสัญญาณนาฬิกาแยกกัน และใช้สายเลือกชิป (Chip Select) กำหนดว่าจะสื่อสารกับอุปกรณ์ตัวใดในขณะนั้น

เมื่อเทียบกับ I2C แล้ว SPI ใช้สายมากกว่า แต่แลกมาด้วยความเร็วที่สูงกว่า ความหน่วงต่ำกว่า และความสามารถในการส่งข้อมูลบนบอร์ดที่เสถียรกว่า จึงมักใช้กับ IMU หลัก Flash และอุปกรณ์ความเร็วสูงอื่น ๆ

### สัญญาณพื้นฐานของ SPI <a href="#spi" id="spi"></a>

สัญญาณที่พบบ่อยที่สุดของ SPI มีดังนี้:

| สัญญาณ | การใช้งาน                                                 |
| ------ | --------------------------------------------------------- |
| SCLK   | สายสัญญาณนาฬิกา โดยฝั่งควบคุมหลักเป็นผู้ให้               |
| MOSI   | เอาต์พุตจากฝั่งควบคุมหลัก อินพุตเข้าอุปกรณ์               |
| MISO   | เอาต์พุตจากอุปกรณ์ อินพุตเข้าฝั่งควบคุมหลัก               |
| CS     | สายเลือกชิป โดยทั่วไปแต่ละอุปกรณ์จะมีสายของตนเองหนึ่งเส้น |

ความแตกต่างที่สำคัญที่สุดประการหนึ่งจาก I2C คือ SPI ไม่มีแนวคิดเรื่องที่อยู่ของอุปกรณ์ แต่ใช้สาย CS กำหนดว่าจะเปิดใช้อุปกรณ์ต่อพ่วงตัวใด

### ความเร็วและคุณลักษณะฟูลดูเพล็กซ์ของ SPI <a href="#spi" id="spi"></a>

ความเร็วที่พบบ่อยของ SPI อยู่ที่ประมาณ **1 ถึง 10 MHz** และอุปกรณ์บางตัวรองรับความเร็วที่สูงกว่านั้น

นอกจากนี้ SPI เป็นการสื่อสารแบบ**ฟูลดูเพล็กซ์ (Full-duplex)** หมายความว่าขณะที่ฝั่งควบคุมหลักส่งข้อมูลไปยังอุปกรณ์ ก็สามารถรับข้อมูลที่อุปกรณ์ส่งกลับมาได้พร้อมกัน ซึ่งเป็นประโยชน์อย่างยิ่งสำหรับเซนเซอร์ความถี่สูงและการแลกเปลี่ยนข้อมูลแบบเรียลไทม์

### การใช้งานที่พบบ่อยของ SPI <a href="#spi" id="spi"></a>

ในระบบตัวควบคุมการบิน SPI มักใช้กับ:

* IMU หลัก (เซนเซอร์วัดความเร่ง ไจโรสโคป)
* เซนเซอร์ความเร็วสูงบนบอร์ด
* หน่วยความจำ Flash ภายนอกหรือบนบอร์ด
* อุปกรณ์ต่อพ่วงบางตัวที่ต้องการอัตราการสุ่มตัวอย่างสูงหรือความหน่วงต่ำ

### ข้อจำกัดของ SPI <a href="#spi" id="spi"></a>

ข้อจำกัดหลักของ SPI ไม่ใช่ความเร็ว แต่เป็นต้นทุนการเดินสายเมื่อขยายระบบและระยะทาง

เนื่องจากทุกครั้งที่เพิ่มอุปกรณ์ SPI หนึ่งตัว มักต้องเพิ่มสาย CS แยกอีกหนึ่งเส้น นอกจากนี้ SPI ไม่ได้ออกแบบมาสำหรับการส่งข้อมูลผ่านสายยาว โดยทั่วไปเหมาะกับการเชื่อมต่อบนบอร์ดหรือระยะสั้นมากเท่านั้น ไม่เหมาะกับการเดินสาย SPI ความเร็วสูงไปยังปลายสุดของตัวโดรนเพื่อต่อโมดูลภายนอก

### เหตุใด SPI จึงเหมาะกับ IMU หลัก <a href="#spi--imu" id="spi--imu"></a>

IMU หลักต้องการการส่งข้อมูลที่มีความถี่สูง ความหน่วงต่ำ และเสถียร เพื่อรองรับการประมาณท่าทางการบิน ลูปควบคุม และการจัดการการสั่นสะเทือน

เมื่อเทียบกับ I2C แล้ว SPI ให้สัญญาณนาฬิกาที่สูงกว่า การชนกันจากการใช้บัสร่วมกันน้อยกว่า และความเป็นเรียลไทม์ที่ดีกว่า ตัวควบคุมการบินสมัยใหม่ส่วนใหญ่จึงให้ IMU หลักใช้ SPI แทน I2C

### การเปรียบเทียบ I2C กับ SPI <a href="#i2c--spi" id="i2c--spi"></a>

### ความแตกต่างพื้นฐาน <a href="#undefined" id="undefined"></a>

I2C และ SPI พบได้บ่อยบนบอร์ดตัวควบคุมการบิน แต่มีการใช้งานที่แตกต่างกัน

| หัวข้อ              | I2C                                           | SPI                                           |
| ------------------- | --------------------------------------------- | --------------------------------------------- |
| จำนวนสาย            | สายสัญญาณหลัก 2 เส้น: SCL, SDA                | สายใช้ร่วม 3 เส้น บวก CS 1 เส้นต่ออุปกรณ์     |
| วิธีเลือกอุปกรณ์    | ที่อยู่ (Address)                             | สายเลือกชิป CS                                |
| ความเร็วทั่วไป      | 100 kHz, 400 kHz                              | 1–10 MHz                                      |
| ความสามารถในการขยาย | อุปกรณ์หลายตัวใช้สองสายร่วมกัน ขยายง่าย       | เพิ่มอุปกรณ์หนึ่งตัวมักต้องเพิ่ม CS หนึ่งเส้น |
| ระยะทางที่เหมาะสม   | สั้นมาก บนบอร์ดหรือระยะใกล้                   | บนบอร์ดหรือระยะสั้นมาก                        |
| การใช้งานที่พบบ่อย  | บารอมิเตอร์ แมกนีโตมิเตอร์ เครื่องวัดระยะ LED | IMU หลัก, Flash, เซนเซอร์ความเร็วสูง          |

### ควรเลือกอย่างไร <a href="#undefined" id="undefined"></a>

หากความต้องการคือ**ต่อสายง่าย มีอุปกรณ์จำนวนมาก และปริมาณข้อมูลไม่มาก** โดยทั่วไป I2C จะเหมาะสมกว่า

หากความต้องการคือ**ความเร็วสูง ความหน่วงต่ำ และอัตราอัปเดตสูง** โดยเฉพาะที่เกี่ยวข้องกับ IMU หลักหรือหน่วยความจำความเร็วสูง SPI มักเป็นตัวเลือกที่ดีกว่า

## ความสัมพันธ์กับบัสอื่น ๆ <a href="#undefined" id="undefined"></a>

### เหตุใดอุปกรณ์ต่อพ่วงภายนอกจึงมักใช้ CAN หรือ UART <a href="#can--uart" id="can--uart"></a>

แม้ I2C และ SPI จะมีความสำคัญมาก แต่ส่วนใหญ่เป็นบัสที่ใช้บนบอร์ดหรือในระยะใกล้

เมื่อเซนเซอร์อยู่ห่างจากตัวควบคุมการบินมาก หรือสภาพแวดล้อมของระบบมีสัญญาณรบกวนทางแม่เหล็กไฟฟ้ารุนแรง อุปกรณ์ต่อพ่วงภายนอกมักจะเปลี่ยนไปใช้ UART หรือ CAN โดย CAN มักมีข้อได้เปรียบด้านการทนต่อสัญญาณรบกวนและความน่าเชื่อถือในระยะไกล

### ปัญหาที่พบบ่อย <a href="#undefined" id="undefined"></a>

### ปัญหาที่พบบ่อยของ I2C <a href="#i2c" id="i2c"></a>

ปัญหาทั่วไปของ I2C ได้แก่:

* ที่อยู่ซ้ำกัน อุปกรณ์สองตัวใช้ที่อยู่เดียวกัน
* ขาดหรือมีตัวต้านทาน pull-up ซ้ำซ้อน
* สายยาวเกินไป ทำให้คุณภาพสัญญาณลดลง
* อุปกรณ์บางตัวทำให้บัสค้าง ส่งผลให้ทั้ง bus ไม่สามารถทำงานได้

### ปัญหาที่พบบ่อยของ SPI <a href="#spi" id="spi"></a>

ปัญหาทั่วไปของ SPI ได้แก่:

* ต่อสาย CS ผิดหรือปล่อยลอย (Floating) ทำให้อุปกรณ์ไม่ถูกเลือกอย่างถูกต้อง
* จับคู่ MOSI, MISO, SCLK ผิด
* เดินสาย SPI ภายนอกยาวเกินไป ทำให้คุณภาพสัญญาณลดลง
* เมื่ออุปกรณ์หลายตัวใช้สายร่วมกัน การควบคุมการเลือกชิปไม่ถูกต้องทำให้ข้อมูลชนกัน

### ลำดับการแก้ไขปัญหาที่แนะนำ <a href="#undefined" id="undefined"></a>

หากอุปกรณ์ต่อพ่วง I2C หรือ SPI ไม่ทำงานตามปกติ แนะนำให้ตรวจสอบตามลำดับต่อไปนี้:

1. ตรวจสอบว่าชื่อสายสัญญาณและการต่อสายจริงสอดคล้องกันถูกต้อง
2. ตรวจสอบว่าระดับแรงดันและการจ่ายไฟปกติ
3. สำหรับ I2C ให้ตรวจสอบที่อยู่ของอุปกรณ์และตัวต้านทาน pull-up
4. สำหรับ SPI ให้ตรวจสอบว่าสาย CS ต่อถูกต้องและถูกควบคุมโดยขาที่ถูกต้อง
5. ตรวจสอบว่าเฟิร์มแวร์ตัวควบคุมการบินรองรับอุปกรณ์และบัสที่เกี่ยวข้องหรือไม่
6. หากจำเป็น ให้ใช้ลอจิกอะนาไลเซอร์ (Logic Analyzer) สังเกตรูปคลื่นและแพ็กเก็ตจริงของ SCL/SDA หรือ SCLK/MOSI/MISO/CS

### ข้อควรระวัง <a href="#undefined" id="undefined"></a>

**ข้อควรระวัง:** ทั้ง I2C และ SPI ไม่ใช่บัสที่ออกแบบมาสำหรับการเดินสายภายนอกระยะไกล หากโมดูลต้องอยู่ห่างจากตัวควบคุมการบิน ควรพิจารณาใหม่ก่อนว่าควรเปลี่ยนไปใช้อินเทอร์เฟซที่เหมาะสมกว่าหรือไม่

**ข้อควรระวัง:** อย่าสรุปทันทีว่าสามารถสลับใช้สองโหมดได้ตามใจเพียงเพราะเซนเซอร์รองรับทั้ง I2C และ SPI ในความเป็นจริงยังต้องดูว่าบอร์ดตัวควบคุมการบินมีบัสที่เกี่ยวข้องให้ใช้ภายนอกหรือไม่ และเฟิร์มแวร์รองรับหรือไม่

**ข้อควรระวัง:** IMU หลักมีความสัมพันธ์อย่างมากกับการควบคุมท่าทางการบิน โดยทั่วไปควรใช้ SPI เป็นอันดับแรก ไม่แนะนำให้ใช้ I2C เป็นแหล่งสัญญาณตรวจวัดท่าทางหลัก
