หน้าแรก
วิธีการสั่งซื้อสินค้า
แจ้งชำระเงิน
บทความ
เว็บบอร์ด
เกี่ยวกับเรา
ติดต่อเรา
หน้าแรก
>
บทความ
>
การสื่อสารแบบ I2C
ค้นหาบทความที่นี่
บทความทั้งหมด
การสื่อสารแบบ I2C
5 ปีที่ผ่านมา
โดย
เจ้าของร้าน
Publish : 3 April 2020
I²C ที่เราคุ้นเคยนั้นย่อมาจาก Inter-Integrated Circuit - IIC หรือคุ้นเคยกันในรูป I²C (อ่านว่า "ไอ-สแคว-ซี" แต่ใครจะอ่านว่า "ไอ-ทู-ซี" หรือ "ไอ-ไอ-ซี" ก็ไม่เป็นไร ขอให้เข้าใจตรงกันครับ) เป็นการสื่อสารแบบ Serial รูปแบบหนึ่ง ถูกคิดค้นขึ้นใน ค.ศ.1982 โดย Philip semiconductor (ปัจจุบันคือ NXP Semiconductors) โดยมีจุดประสงค์เพื่อใช้รับส่งข้อมูลความเร็วต่ำระหว่างอุปกรณ์ มีจุดเด่นคือเชื่อมต่อแบบบัสสามารถเชื่อมต่ออุปกรณ์ได้เป็นจำนวนมาก โดยใช้สายสัญญาณเพียง 2 เส้นเท่านั้น จึงช่วยลดปริมาณของสายสัญญาณ และอุปกรณ์มีขนาดเล็กลง
โดยสายสัญญาณ 2 เส้นนั้น คือ
SCL
มีหน้าที่ส่งสัญญาณนาฬิกาเพื่อใช้สำหรับควบคุมการรับส่งข้อมูล ซึ่งความเร็วนี้ตามมาตรฐานคือ 100kHz และมีโหมดอื่นคือ Fast Mode มีความเร็วสูงสุด 400kHz, Hi-Speed Mode มีความเร็วสูงสุด 3.4MHz และ Ultra Fast Mode มีความเร็วสูงสุดที่ 5MHz โดยไมโครคอนโทรลเลอร์แต่ละตัวก็จะมีความเร็วของสัญญาณนาฬิกาต่างกัน (บอร์ด Arduino หรือ STM ที่เราใช้กันทั่ว ๆ ไปนี้ส่วนมากจะรองรับความเร็ว Standard และ Fast Mode เท่านั้น)
SDA
เป็นสายที่ใช้รับส่งข้อมูลที่ต้องการจะสื่อสาร
และเนื่องจากการรับส่งข้อมูลของสายสัญญาณทั้งสองเป็นแบบ Open-Drain จึงจำเป็นต้องต่อ Pull-Up Resistor ที่สายสัญญาณทั้งสอง และต้องอาศัยไฟเลี้ยงด้วย
จากภาพเป็นผังการเชื่อมต่อระหว่างไมโครคอนโทรเลอร์ที่เป็น Master และ Slave อีก 3 ตัว โดยการทำงานนั้น เมื่อเริ่มต้นการสื่อสาร Master จะส่งคำสั่ง Start ออกไปผ่านสาย SDA (SCL ปล่อยสัญญาณนาฬิกาคงที่ตลอดเวลา) หลังจากบิต Start จะเป็น Address ของ Slave ที่ต้องการเรียกใช้งาน ตามด้วยบิตคำสั่งจะให้ Read หรือ Write ในขั้นตอนนี้ Slave ทุกตัวจะทำการตรวจสอบว่า Address ที่ Master เรียกนั้นใช่ตัวเองหรือไม่ หากตรวจสอบแล้วเป็น Address ของตัวเอง Slave ตัวนั้นจะส่งบิต ACK กลับไปที่ Master เพื่อแสดงความพร้อมทำงาน และก็จะมีการรับส่งข้อมูลกันที่ละ 1 ไบต์ (8 บิต) ในแต่ละไบต์จะถูกคั่นด้วย ACK ซ้ำแบบนี้เรื่อย ๆ จนการรับส่งข้อมูลจบลง Master จะส่งบิต Stop เพื่อเป็นสัญญาณจบการสื่อสาร
หากใครยังงง ๆ ลองมาดูตัวอย่างกันดีกว่าครับ (ตัวอย่างกราฟข้อมูลอาจไม่ตรงหลักเป๊ะ ๆ จะแค่ยกมาแบบง่าย ๆ ให้เข้าใจนะครับ) สมมติเราจะส่งตัวอักษร 'A' และ 'B' ไปแสดงที่จอ LCD แบบ I2C ที่มี Address คือ 0x27 ก็จะมีขั้นตอนการทำงานดังนี้
1. Master ส่ง START bit
2. Master ส่ง Address 0x27 คือ 0100111 (มาตรฐานของ I2C ใช้ 7-bit Address)
3. Master ส่ง Read/Write bit ในที่นี้คือ 0 (0 = ให้ Slave รอรับข้อมูล และ 1 = ให้ Slave ส่งข้อมูลกลับมา)
4. Slave ส่ง ACK ตอบกลับมา
5. Master ส่ง 'A' ในรูปข้อมูล 1 byte คือ 01000001
6. Master ส่ง ACK bit
7. Master ส่ง 'B' ในรูปข้อมูล 1 byte คือ 01000010
8. Master ส่ง NACK bit
9. Master ส่ง STOP bit
จำลองลักษณะบล็อกสัญญาณที่ส่งไปดังนี้
อีกตัวอย่าง สมมติจะเรียกข้อมูลจากเซ็นเซอร์วัดอุณหภูมิ โดยให้เซ็นเซอร์ส่งข้อมูลกลับ 3 byte ก็จะมีขั้นตอนดังนี้ (ไม่สมมติ L-H แล้วนะครับ เอาแค่บล็อกไหนของ Master หรือ Slave พอ)
1. Master ส่ง START
2. Master ส่ง Address
3. Master ส่ง Read/Write bit
4. Slave ส่ง ACK ตอบกลับมา
5. Slave ส่งข้อมูล 1 byte
6. Master ส่ง ACK bit เพื่อบอกว่ารับข้อมูลครบ 8 byte แล้ว
7. Slave ส่งข้อมูลไบต์ที่สองอีก 1 byte
8. Master ส่ง ACK bit เพื่อบอกว่ารับข้อมูลครบ 8 byte แล้ว (อีกครั้ง)
9. Slave ส่งข้อมูลไบต์สุดท้าย 1 byte
10. Master ส่ง NACK bit เพื่อบอกว่ารับข้อมูลครบ 8 byte และข้อมูลทั้งหมดก็ได้รับครบแล้ว
11. Master ส่ง STOP เพื่อแจ้งจบการทำงาน
ทีนี้เราลองมาคิดความเร็วในการรับส่งข้อมูล ที่ว่าความเร็วต่ำมันขนาดไหนกัน ในตัวอย่างแรกเรามีการรับส่งข้อมูลกัน 29 บล็อก ก็เท่ากับเราใช้สัญญาณไป 29 ลูกคลื่นนาฬิกา หากเราใช้ Standard Mode ก็จะใช้เวลารับส่งข้อมูลกันทั้งหมด 29/100000 วินาที ส่วนตัวอย่างที่สองนั้นเรารับส่งข้อมูล START+7+1+1+8+1+8+1+8+1+STOP = 38 ก็จะใช้เวลาในการรับส่งข้อมูลทั้งหมด 38/100000 วินาที หรือหากใช้ Fast Mode ก็จะเหลือเพียง 38/400000 วินาที เพียงพริบตาเดียวเท่านั้นก็รับส่งข้อมูลสำเร็จแล้ว แต่ตัวเลขน้อย ๆ แบบนี้เป็นตัวอย่างของเราที่สมมติขึ้นนะครับ ในอุปกรณ์จริง ๆ นั้นอาจมีการรับส่งกันเป็นสิบ หรืออาจเป็นหลายร้อยไบต์ก็ได้ครับ เช่นอย่างเราจะส่งคำว่า 'Fitrox Electronics' ไปแสดงที่จอ LCD เอาเฉพาะคำนี้ก็กินไป 18 byte แล้ว ไหนยังจะต้องมีส่วน setCursor หรือค่าความสว่างของจออีก ก็อาจกินเวลาถึงเกือบ ๆ วินาทีเลยก็ได้
ทีนี้เราลองย้อนดูกันว่าการพัฒนา I2C ตั้งแต่เริ่มต้นถึงปัจจุบันมีอะไรเปลี่ยนแปลงไปบ้าง
ค.ศ.1982 เปิดตัวครั้งแรก มีความเร็วสูงสุดที่ 100kHz ถูกสร้างขึ้นเพื่อเป็นระบบบัสภายใน สำหรับควบคุมและสื่อสารในอุปกรณ์อิเล็กทรอนิกส์ ใช้งานได้ง่าย
ค.ศ.1992 ออกเวอร์ชัน 1 เพิ่ม Fast Mode (Fm) รองรับความเร็วสูงสุด 400kHz และเพิ่มให้สามารถรองรับ Address ได้ 10 bit ทำให้เชื่อมต่ออุปกรณ์ได้มากขึ้น
ค.ศ.1998 ออกเวอร์ชัน 2 เพิ่ม High Speed Mode (Hs) รองรับความเร็วสูงสุด 3.4MHz และปรับปรุงให้ใช้พลังงานน้อยลง
ค.ศ.2000 ออกเวอร์ชัน 2.1 เพื่อเป็นการอธิบายคุณสมบัติของเวอร์ชัน 2 เท่านั้น ไม่มีอะไรเปลี่ยนแปลง (เพื่อ???)
ค.ศ.2007 ออกเวอร์ชัน 3 เพิ่ม Fast Mode Plus (Fm+) รองรับความเร็วสูงสุด 1MHz และเพิ่ม device ID mechanism (ที่มี A0 A1 A2 ให้เราปรับตำแหน่งใด ๆ เป็น H หรือ L ได้เพื่อให้ Address เปลี่ยนไปได้ ทำให้ใช้งานสะดวกขึ้น)
ค.ศ.2012 ออกเวอร์ชัน 4 เพิ่ม Ultra Fast Mode (UFm) รองรับความเร็วสูงสุด 5MHz โดยใช้ USDA สำหรับสัญญาณข้อมูล กับ USCK สำหรับสัญญาณนาฬิกา มีการเปลี่ยนจากการใช้ Pull-Up Resistor เป็น Push-Pull Logic และเพิ่ม manufacturer ID
ค.ศ.2012 ออกเวอร์ชัน 5 เวอร์ชันนี้ออกมาเพื่อแก้ไขข้อผิดพลาดของเวอร์ชันก่อนหน้า (แก้บัก?!)
ค.ศ.2014 ออกเวอร์ชัน 6 เป็นการแก้ไขข้อผิดพลาดของเวอร์ชัน 4 และ 5 ปัจจุบันจะใช้เวอร์ชันนี้เป็นมาตรฐานในอุปกรณ์ต่าง ๆ
ข้อดีของ I2C
- ใช้ขาสัญญาณน้อย เพียงแค่ 2 เส้นเท่านั้น
- แม้ Slave จะมีความต้องการแตกต่างกัน บางตัวเป็น Fm บางตัวเป็น Standard ก็สามารถต่อใช้งานร่วมกันได้
- รองรับการใช้งาน Master หลายตัว
- มีการใช้ ACK/NACK เพื่อจัดการ Error ต่าง ๆ
ข้อเสียของ I2C
- การเขียนโปรแกรมจะมีความซับซ้อน (ยกเว้นมี Library :P - ผู้เขียน)
- ทำงานที่ความเร็วต่ำ
- ทำงานด้วยระบบ Half-Duplex (ก็มี SDA เส้นเดียวนี่)
สำหรับวันนี้ก็หวังว่าจะพอเข้าใจในหลักการ I2C ที่เราได้ใช้งานกันบ้างนะครับ ย้ำอีกครั้งว่าข้อมูลอาจไม่ถูกตามหลักทั้งหมด ผู้เขียนเพียงแค่หยิบยกมาทำให้เข้าใจได้ง่ายที่สุด พอจะรู้หลักการกัน ซึ่งถ้าจะพูดกันให้ถูกต้องคงต้องมานั่งเรียน อธิบายบนกระดาน นั่งถามตอบกันจนกว่าจะเข้าใจ อ้างอิงไปถึงวิชาพื้นฐานดิจิตอลอิเล็กทรอนิกส์ ถ้าเอามาเขียนบทความมันจะเบื่อกันซะก่อนครับ เอาบทความให้อ่านง่าย ๆ พอเข้าใจกันดีกว่า ใครนำไปใช้อ้างอิงทำรายงานหรืออะไรก็ตามกรุณาหาข้อมูลจากแหล่งอื่นประกอบนะครับ สำหรับวันนี้ขอจบไปก่อนแล้วกัน สวัสดีครับ
tips
,
I2C
,
i2c serial
,
serial
,
การสื่อสาร
,
การสื่อสารแบบ i2c
Share
Share :
COPY
Privacy Policy
|
Cookie Policy
|
Copyright © 2025
fitrox.lnwshop.com
All rights reserved.
ตะกร้า
(
0
)
▲
▼
รายการสั่งซื้อของฉัน
เข้าสู่ระบบด้วย
เข้าสู่ระบบ
สมัครสมาชิก
ยังไม่มีบัญชีเทพ
สร้างบัญชีใหม่
ไม่มีค่าใช้จ่าย
สมัครสมาชิก (ฟรี)
รายการสั่งซื้อของฉัน
ข้อมูลร้านค้านี้
Fitrox Electronics
ไฟทร็อก อิเล็กทรอนิกส์ จำหน่ายอุปกรณ์อิเล็กทรอนิกส์ บอร์ดไมโครคอนโทรลเลอร์ และอุปกรณ์สำหรับโปรเจคต่างๆ อ.เมือง จ.เชียงใหม่ (หลัง มช.)
เบอร์โทร :
0897245633
อีเมล :
fitrox.electronics@gmail.com
ส่งข้อความติดต่อร้าน
เกี่ยวกับร้านค้านี้
ค้นหาสินค้าในร้านนี้
ค้นหา
หรือค้นหาอย่างละเอียด
ค้นหาสินค้า
สินค้าที่ดูล่าสุด
{{pdata.name}}
ดูสินค้าทั้งหมดในร้าน
สินค้าที่ดูล่าสุด
บันทึกเป็นร้านโปรด
Join เป็นสมาชิกร้าน
แชร์หน้านี้
แชร์หน้านี้
↑
TOP
เลื่อนขึ้นบนสุด
คุณมีสินค้า
0
ชิ้นในตะกร้า
สั่งซื้อทันที
สินค้าในตะกร้า ({{total_num}} รายการ)
ขออภัย ขณะนี้ยังไม่มีสินค้าในตะกร้า
ราคาสินค้าทั้งหมด
฿ {{price_format(total_price)}}
- ฿ {{price_format(discount.price)}}
ราคาสินค้าทั้งหมด
{{total_quantity}} ชิ้น
฿ {{price_format(after_product_price)}}
ราคาไม่รวมค่าจัดส่ง
ดูสินค้าในตะกร้า
เริ่มการสั่งซื้อ
➜
เลือกซื้อสินค้าเพิ่ม
พูดคุย-สอบถาม
อีเมล fitrox.electronics@gmail.com
โทร 0897245633
channel/UCnHfpCdqN1RkzAfEH_lRLvw?
1924052434588436
Add @zpq2828r