บอร์ด USB-C ไม่ติดเมื่อใช้สาย C ถึง C เพราะขาด ตัวต้านทาน 5.1 kΩ ที่ขา CC
บอร์ดพอร์ต USB-C ที่เสียบสาย A-to-C ติด แต่สาย C-to-C ไม่ติด เพราะไม่มี 5.1 kΩ ที่ขา CC1 และ CC2 แยกกันคนละตัว ทำไมที่ชาร์จไม่จ่ายไฟ วัดยังไง และแก้ยังไง
- พอร์ต USB-C ฝั่งจ่ายไฟปล่อย VBUS เป็น 0 V จนกว่าจะเห็นตัวต้านทาน Rd ที่ขา CC ของอุปกรณ์ บอร์ดที่ไม่มี Rd จึงไม่ได้ไฟเลย
- อุปกรณ์รับไฟต้องมี 5.1 kΩ ลงกราวด์ที่ CC1 หนึ่งตัว และ CC2 อีกหนึ่งตัว แยกกัน ห้ามใช้ตัวเดียวร่วมกัน
- สาย A-to-C ใช้ได้เพราะพอร์ต USB-A จ่าย 5 V ตลอด และในหัวสายมีตัวต้านทาน 56 kΩ อยู่แล้ว
- วัดง่าย ๆ ด้วยมัลติมิเตอร์ตอนถอดไฟ CC1 กับ CC2 ถึงกราวด์ควรได้ราว 5.1 kΩ ทั้งคู่
บอร์ด ESP32 หรือโมดูลราคาประหยัดหลายตัวมีพอร์ต USB-C แต่พอเสียบสาย C-to-C กับที่ชาร์จมือถือหรือโน้ตบุ๊ก ไฟไม่ติดเลย ขณะที่สาย A-to-C เส้นเก่าใช้ได้ปกติ สาเหตุคือบอร์ดไม่มีตัวต้านทาน 5.1 kΩ ที่ขา CC ทั้งสองขา ที่ชาร์จ USB-C จึงไม่รู้ว่ามีอุปกรณ์เสียบอยู่ และไม่ยอมปล่อยไฟออกมา
บทนี้อธิบายกลไก วิธีวัด และวิธีแก้ ทุกอย่างอยู่ที่ไฟ 5 V จาก USB ถ้ายังไม่แน่ใจเรื่องไฟเลี้ยงบอร์ด อ่านจ่ายไฟ ESP32 ให้ถูก ประกอบ
ขา CC คืออะไร
หัว USB-C มีขา Configuration Channel สองขา คือ CC1 และ CC2 (เพราะเสียบกลับด้านได้) ใช้ให้สองฝั่งรู้จักกันก่อนจ่ายไฟ
- ฝั่งจ่ายไฟ (source) เช่นที่ชาร์จ มีตัวต้านทาน Rp ดึงขึ้นที่ CC
- ฝั่งรับไฟ (sink) เช่นบอร์ดของเรา มีตัวต้านทาน Rd = 5.1 kΩ ดึงลงกราวด์ที่ CC
เมื่อเสียบ Rp กับ Rd ต่อกันเป็นวงจรแบ่งแรงดัน ที่ชาร์จเห็นแรงดันที่ CC ตกลงมา จึงรู้ว่ามีอุปกรณ์รับไฟเสียบอยู่ แล้วค่อยเปิด VBUS
พอร์ต USB-C ที่ทำตามข้อกำหนด ไม่มีอะไรเสียบ VBUS ต้องเป็น 0 V และจะจ่าย 5 V ก็ต่อเมื่อเห็นอุปกรณ์รับไฟผ่านขา CC เท่านั้น
ทำไมสาย A-to-C ใช้ได้ แต่ C-to-C ไม่ได้
| สาย A-to-C | สาย C-to-C | |
|---|---|---|
| ฝั่งจ่ายไฟ | พอร์ต USB-A จ่าย 5 V ตลอด | พอร์ต USB-C รอเห็น Rd ก่อน |
| Rp อยู่ที่ไหน | ในหัวสาย 56 kΩ ต่อกับ VBUS | ในที่ชาร์จ |
| บอร์ดไม่มี Rd | ยังได้ไฟ | ได้ 0 V |
| บอร์ดมี Rd ครบ | ได้ไฟ | ได้ไฟ |
สาย A-to-C แบบเก่าถูกกำหนดให้มี Rp 56 kΩ อยู่ในหัวสาย ค่านี้บอกว่าแหล่งจ่ายเป็นพอร์ต USB ธรรมดา ส่วนพอร์ต USB-A ไม่มีขา CC และปล่อยไฟตลอดอยู่แล้ว บอร์ดที่ไม่มี Rd จึงดูเหมือนปกติ จนวันที่เปลี่ยนมาใช้สาย C-to-C
ตัวอย่าง: ที่ชาร์จอ่านแรงดันที่ CC ยังไง
ค่า Rp ที่ใช้ดึงขึ้นไป 5 V บอกว่าที่ชาร์จจ่ายกระแสได้เท่าไร: 56 kΩ = ค่าเริ่มต้นของ USB, 22 kΩ = 1.5 A, 10 kΩ = 3 A บอร์ดของเรามี Rd 5.1 kΩ แรงดันที่ CC คำนวณแบบวงจรแบ่งแรงดัน
V_CC = 5 V × 5.1 ÷ (Rp + 5.1)
- Rp 56 kΩ: 5 × 5.1 ÷ 61.1 = 0.42 V อยู่ในช่วง 0.20–0.66 V = ค่าเริ่มต้นของ USB
- Rp 22 kΩ: 5 × 5.1 ÷ 27.1 = 0.94 V อยู่ในช่วง 0.66–1.23 V = ได้ถึง 1.5 A
- Rp 10 kΩ: 5 × 5.1 ÷ 15.1 = 1.69 V สูงกว่า 1.23 V = ได้ถึง 3 A
- ไม่มี Rd: CC ไม่มีทางลงกราวด์ แรงดันไม่ตก ที่ชาร์จถือว่าไม่มีอะไรเสียบ VBUS = 0 V
ช่วงแรงดันข้างบนมาจากตารางสรุปที่ใช้กันทั่วไป ต่ำกว่า 0.20 V ถือว่าไม่มีแหล่งจ่ายต่ออยู่ สำหรับบอร์ด ESP32 ทั่วไปไม่ต้องอ่านค่านี้ แค่มี Rd ก็ได้ 5 V แล้ว แต่ถ้าบอร์ดจะดึงกระแสเกินค่าเริ่มต้น (500 mA สำหรับ USB 2.0) ต้องอ่านแรงดัน CC ก่อนว่าที่ชาร์จจ่ายไหว
ต้องแยกคนละตัว ห้ามใช้ตัวเดียวร่วมกัน
ข้อกำหนดให้ CC1 และ CC2 มี Rd ของตัวเองแยกกัน บอร์ด Raspberry Pi 4 (ปี 2019) เคยต่อ CC1 กับ CC2 เข้าหากันแล้วลงตัวต้านทาน 5.1 kΩ ตัวเดียว ผลคือกับสายธรรมดาใช้ได้ แต่กับสายที่มีชิป e-marker (สายรองรับข้อมูลเร็วหรือกระแส 5 A) ที่ชาร์จอาจตีความผิดและไม่จ่ายไฟ บทความวิเคราะห์เรื่องนี้บน kernel.org ชี้ว่าเป็นความผิดพลาดที่เจอบ่อย และแนะนำให้ลอกวงจรตามข้อกำหนดแบบตรงตัว
วงจรฝั่งรับไฟที่ถูกต้อง สำหรับบอร์ด USB 2.0:
- CC1 → 5.1 kΩ → GND
- CC2 → 5.1 kΩ → GND (อีกตัว)
- ขา D+ สองขา (A6, B6) ต่อเข้าหากัน และขา D− สองขา (A7, B7) ต่อเข้าหากัน เพื่อให้เสียบด้านไหนก็ได้ข้อมูล
- ขา SuperSpeed ปล่อยไว้ไม่ต่อ ชิป ESP32 รองรับแค่ USB 2.0
วัดบอร์ดด้วยมัลติมิเตอร์
ถอดสายออกจากบอร์ดก่อน ตั้งมัลติมิเตอร์โหมดวัดความต้านทาน (ถ้ายังไม่คล่อง ดูใช้มัลติมิเตอร์)
| วัดระหว่าง | ค่าที่ควรได้ | ถ้าไม่ใช่ |
|---|---|---|
| CC1 กับ GND | ราว 5.1 kΩ | ไม่มีค่า (เปิดวงจร) = ไม่มี Rd |
| CC2 กับ GND | ราว 5.1 kΩ | เหมือนกัน |
| CC1 กับ CC2 | ราว 10.2 kΩ (สองตัวอนุกรมผ่านกราวด์) | ใกล้ 0 Ω = ต่อรวมกัน แบบ Pi 4 |
จุดวัด CC บนบอร์ดเล็กหาได้จากผังวงจรของบอร์ด หรือใช้บอร์ดแยกขา USB-C (breakout) เสียบแทน อีกวิธีที่ง่ายกว่าคือลองเสียบสาย C-to-C กับที่ชาร์จ USB-C ถ้าไฟไม่ติดแต่สาย A-to-C ติด เกือบแน่นอนว่าขาด Rd
แก้ยังไง
- ใช้สาย A-to-C กับพอร์ต USB-A ทางที่ง่ายสุดและไม่ต้องแก้บอร์ด
- เติม Rd ถ้าบัดกรีชำนาญ เติม 5.1 kΩ จาก CC1 ลงกราวด์ และอีกตัวจาก CC2 ลงกราวด์ ขาบนหัว USB-C เล็กมาก ระวังลัดขาข้างเคียง
- ออกแบบบอร์ดเอง ใส่ 5.1 kΩ 1% สองตัวทุกครั้ง
- ซื้อบอร์ดใหม่ ดูผังวงจรของบอร์ดก่อนซื้อ ว่ามีตัวต้านทาน 5.1 kΩ ที่ CC1 และ CC2 แยกกัน
ข้อผิดพลาดที่เจอบ่อย
- ใช้ตัวต้านทานตัวเดียวให้ CC สองขา ใช้ได้กับสายบางเส้น แต่พังกับสาย e-marker
- เปลี่ยนค่าเป็น 10 kΩ เพราะมีอยู่ในลิ้นชัก ที่ชาร์จอ่านแรงดันผิด ใช้ 5.1 kΩ
- คิดว่าสาย C-to-C เสีย ลองสายอีกเส้นก็ไม่ติดเหมือนกัน ปัญหาอยู่ที่บอร์ด ไม่ใช่สาย
- ต่อ D+ หรือ D− แค่ชุดเดียว เสียบด้านหนึ่งแฟลชโค้ดได้ กลับด้านแล้วคอมไม่เห็นบอร์ด
- คาดหวังไฟ 9 V หรือ 20 V มี Rd อย่างเดียวได้แค่ 5 V ถ้าต้องการแรงดันสูงต้องมีชิป PD และบทนี้อยู่ที่ไฟต่ำ 5 V เท่านั้น
แหล่งข้อมูล
- How to design a proper USB-C power sink (hint, not the way Raspberry Pi 4 did it) — people.kernel.org
- USB Type-C Cable and Adapter Tips and Tricks — Chromium OS
- USB Type-C Hardware Design Guide — Espressif ESP-IoT-Solution
- AN064: USB Type-C introduction — Richtek
- Simple way to use USB Type-C to get 5V at up to 3A — DigiKey TechForum
คำถามที่พบบ่อย
ใช้ 4.7 kΩ หรือ 10 kΩ แทน 5.1 kΩ ได้ไหม
อย่าเปลี่ยน ค่า Rd ที่ข้อกำหนดใช้คือ 5.1 kΩ ที่ชาร์จวัดแรงดันบนตัวต้านทานนี้เพื่อตัดสินว่ามีอุปกรณ์เสียบและจ่ายได้เท่าไร ค่าที่ต่างไปทำให้ผลการตรวจเพี้ยนได้ ใช้ 5.1 kΩ ความคลาดเคลื่อน 1%
บอร์ดได้ไฟ 9 V หรือ 20 V จากที่ชาร์จเร็วไหม
ไม่ได้ ถ้ามีแค่ Rd ที่ชาร์จจะจ่าย 5 V เท่านั้น แรงดันสูงกว่านั้นต้องเจรจาผ่าน USB Power Delivery ซึ่งต้องมีชิปควบคุม PD แยก ชิป ESP32 เองทำ PD ไม่ได้
บอร์ดที่ซื้อมาไม่มี Rd ต้องทิ้งไหม
ไม่ต้อง ใช้สาย A-to-C ต่อกับพอร์ต USB-A ของคอมหรือที่ชาร์จก็ใช้ได้ หรือถ้าบัดกรีเป็น เติม 5.1 kΩ จากแต่ละขา CC ลงกราวด์ได้ แต่ขาบนบอร์ดเล็กมาก ทำเฉพาะเมื่อมั่นใจ
วงจรและโค้ดในบทความทดสอบกับบอร์ดตัวอย่าง บอร์ดต่างรุ่นอาจใช้ขาต่างกัน ตรวจ pinout ของบอร์ดที่ใช้ก่อนต่อไฟเสมอ