2 คะแนน โดย GN⁺ 2024-06-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

คู่มือการพัฒนาอุปกรณ์ USB

สารบัญ

  • พื้นหลัง
  • USB คืออะไร?
  • สาย USB
    • ข้อควรระวังเกี่ยวกับ USB-C
    • การส่งข้อมูลผ่านคู่สายดิฟเฟอเรนเชียล
  • USB บน PCB
  • ความเร็วหลากหลายระดับของ USB
    • ข้อควรระวังสั้น ๆ เรื่องความเร็วบน PCB
  • โปรโตคอลและเลเยอร์ซอฟต์แวร์
    • คลาสอุปกรณ์ USB และวิธีที่โฮสต์ใช้งาน
  • การสร้างอุปกรณ์พอร์ตซีเรียล
    • ไมโครคอนโทรลเลอร์ STM32 และบอร์ด Nucleo
    • การตั้งค่าพอร์ต USB จริง
    • การเขียนซอฟต์แวร์
    • การแฟลชและการรัน
  • บทสรุป

พื้นหลัง

  • อุปกรณ์ USB มีประโยชน์ในการขยายความสามารถของคอมพิวเตอร์
  • เป้าหมายของบทความนี้คือแนะนำกระบวนการสร้างอุปกรณ์ USB ตั้งแต่ต้นจนจบ

USB คืออะไร?

  • USB เป็นมาตรฐานอุตสาหกรรมสำหรับการแลกเปลี่ยนข้อมูลและการจ่ายพลังงาน
  • USB เป็นบัสแบบอนุกรม โดยบิตจะถูกส่งทีละหนึ่งบิต
  • USB ไม่ได้เป็นเพียงมาตรฐานการเชื่อมต่อเท่านั้น แต่ยังรวมถึงโปรโตคอลการสื่อสารด้วย

สาย USB

  • การเชื่อมต่อ USB 2.0 มีสายหลัก 4 เส้น:
    • สาย +5V: จ่ายพลังงานจากโฮสต์ไปยังอุปกรณ์
    • สาย D- และ D+: ส่งข้อมูล 1 บิตในรูปแบบคู่สายดิฟเฟอเรนเชียล
    • สาย GND: ทำหน้าที่เป็นกราวด์

ข้อควรระวังเกี่ยวกับ USB-C

  • USB-C สามารถเสียบได้ทั้งสองด้าน
  • USB-C ไม่ได้บ่งบอกความเร็วหรือเวอร์ชัน

การส่งข้อมูลผ่านคู่สายดิฟเฟอเรนเชียล

  • คู่สายดิฟเฟอเรนเชียลใช้สาย 2 เส้นในการส่งข้อมูล 1 บิต
  • คู่สายดิฟเฟอเรนเชียลมีข้อได้เปรียบในการลดสัญญาณรบกวนแรงดันไฟฟ้า

USB บน PCB

  • เมื่อต้องเพิ่มคอนเนกเตอร์ USB ลงบน PCB ต้องรักษาความยาวของคู่สายดิฟเฟอเรนเชียลให้เท่ากัน
  • ลายวงจรของคู่สายดิฟเฟอเรนเชียลควรอยู่ใกล้กัน
  • ต้องรักษาอิมพีแดนซ์ตามค่าที่กำหนด

ความเร็วหลากหลายระดับของ USB

  • USB 2.0 สามารถทำงานได้ที่ Full Speed (12 Mbit/s) และ High Speed (480 Mbit/s)
  • โฮสต์และอุปกรณ์จะเจรจาความเร็วกันตอนเชื่อมต่อ

ข้อควรระวังสั้น ๆ เรื่องความเร็วบน PCB

  • สำหรับ Full Speed ข้อกำหนดเรื่องอิมพีแดนซ์และความยาวลายวงจรไม่เข้มงวดมากนัก

โปรโตคอลและเลเยอร์ซอฟต์แวร์

  • USB ทำงานคล้ายเครือข่าย และมี endpoint กับ configuration หลายแบบ
  • โฮสต์จะรู้จักและใช้งานอุปกรณ์ USB ผ่านไดรเวอร์

คลาสอุปกรณ์ USB และวิธีที่โฮสต์ใช้งาน

  • ระบบปฏิบัติการสามารถรู้จักคลาสอุปกรณ์ USB ได้หลากหลาย
  • ตัวอย่างเช่น อุปกรณ์เก็บข้อมูลแบบมวลรวม หรืออุปกรณ์ซีเรียล

การสร้างอุปกรณ์พอร์ตซีเรียล

  • ลองสร้างอุปกรณ์ USB พอร์ตซีเรียลแบบง่าย
  • ใช้ไมโครคอนโทรลเลอร์ STM32 และบอร์ด Nucleo

ไมโครคอนโทรลเลอร์ STM32 และบอร์ด Nucleo

  • ใช้บอร์ด NUCLEO-F103RB
  • บอร์ดประกอบด้วยโปรแกรมเมอร์และไมโครคอนโทรลเลอร์

การตั้งค่าพอร์ต USB จริง

  • ตั้งค่าพอร์ต USB และตั้งจัมเปอร์ให้ใช้แหล่งจ่ายไฟ 5V ภายนอก
  • ตั้งค่าขา PA12 และ PA11 เป็น USB_DP และ USB_DM
  • ต่อรีซิสเตอร์ 1.5 kΩ แบบ pull-up ที่ขา PA12

การเขียนซอฟต์แวร์

  • ตั้งค่าโหมดอุปกรณ์ USB ใน STM32CubeIDE
  • ตั้งค่าเป็นอุปกรณ์พอร์ตซีเรียลเพื่อให้โฮสต์รู้จัก
  • เขียนโค้ดให้เปิด LED ในรูทีน CDC_Receive_FS

การแฟลชและการรัน

  • บิลด์โค้ดและใช้ STM32CubeProgrammer เพื่อแฟลชลงบอร์ด
  • ต่อบอร์ดเข้ากับแหล่งจ่ายไฟ 5V ภายนอก และควบคุม LED ผ่านพอร์ตซีเรียล

บทสรุป

  • ได้ลองสร้างอุปกรณ์ USB พอร์ตซีเรียลตั้งแต่ต้นจนจบ
  • โค้ด boilerplate จำนวนมากและการตั้งค่าผ่าน UI ของ STM32CubeIDE อาจทำให้ใช้งานไม่สะดวก
  • การใช้ Linux-based SoC อาจเป็นแนวทางที่สะอาดกว่า

ความเห็นของ GN⁺

  • โค้ด boilerplate ของ STM32CubeIDE: อาจมีการสร้างโค้ด boilerplate จำนวนมาก ทำให้รีวิวโค้ดได้ยาก
  • แนวทางแบบ Linux-based: หากใช้ Linux SoC ก็อาจใช้ API ที่เป็นมาตรฐานมากขึ้นและแยกโค้ดได้สะอาดกว่า
  • อิมพีแดนซ์และความยาวลายวงจร: สำหรับการเชื่อมต่อ USB ความเร็วสูง จำเป็นต้องใส่ใจกับอิมพีแดนซ์และความยาวลายวงจร
  • ข้อดีของคู่สายดิฟเฟอเรนเชียล: คู่สายดิฟเฟอเรนเชียลช่วยลดสัญญาณรบกวนแรงดันไฟฟ้า จึงทำให้การส่งข้อมูลมีความเสถียรมากขึ้น
  • การเลือกไมโครคอนโทรลเลอร์: สิ่งสำคัญคือการเลือกไมโครคอนโทรลเลอร์ที่เหมาะกับโปรเจกต์ โดยนอกจาก STM32 แล้วก็ยังมีตัวเลือกอื่นอีกมากมาย

1 ความคิดเห็น

 
GN⁺ 2024-06-04
ความคิดเห็นจาก Hacker News
  • ความเห็นเกี่ยวกับการใช้ไมโครคอนโทรลเลอร์ ST: เป็นบทความที่ดีเกี่ยวกับการใช้งาน USB แต่เน้นไปที่ไมโครคอนโทรลเลอร์ของ ST เป็นหลัก ช่วงหลังระบบนิเวศของ ESP32 มีแนวทางแบบ plug-and-play ที่ง่ายกว่า สำหรับผู้เริ่มต้น การใช้ USB controller IC พื้นฐานแทนงานความเร็วสูงอาจเหมาะสมกว่า

  • ประสบการณ์การทดสอบความสอดคล้องตามมาตรฐาน USB: เมื่อนานมาแล้วตอนทำการทดสอบความสอดคล้องตามมาตรฐาน USB พบปัญหามากกับการทดสอบกระแสกระชากตอนเริ่มต้นใช้งาน มักจะโฟกัสกับการออกแบบดิจิทัลความเร็วสูงได้ง่าย แต่ในการทดสอบความสอดคล้อง รายละเอียดเล็กน้อยกลับสำคัญ

  • เคล็ดลับเกี่ยวกับ USB-C: ต้องต่อขา CC เข้ากับตัวต้านทานที่เหมาะสม สำหรับ USB 2.0 การเดินลาย differential และอิมพีแดนซ์ไม่ใช่ปัญหาใหญ่ แค่ต่อแบบตรงและให้ความยาวใกล้เคียงกันก็พอ

  • ข้อเสนอทางเลือกแทน STM32: หากบัดกรีโปรเซสเซอร์ ARM ได้ยาก ก็อาจพิจารณาใช้คอนโทรลเลอร์ขนาดเล็กหรือไลบรารี VUSB ได้เช่นกัน หากชอบการเขียนโปรแกรมสไตล์ Arduino ก็มีบอร์ดจำนวนมากที่ใช้งานเป็นอุปกรณ์ USB ได้ง่าย

  • ESP32 และวิธีแฮ็กต้นทุนต่ำ: โดยปกติใช้ ESP32 เป็นหลัก แต่ก็สามารถนำบอร์ดควบคุมจากคีย์บอร์ด USB ที่ถูกทิ้งมาใช้สร้างคอนโทรลเลอร์แบบคัสตอมที่ราคาถูกและทนทานได้

  • การรองรับการรับข้อมูลเกิน 64 ไบต์บน STM32: มีคำถามเกี่ยวกับวิธีรับเฟรมที่ใหญ่กว่า 64 ไบต์ ความยากคือการตั้งค่าที่ระบุใน reference manual ไม่ได้เป็นรีจิสเตอร์ทั่วไป

  • ประสบการณ์เขียนโค้ด USB แบบ bare metal: การเขียนโค้ด USB แบบ bare metal บน MCU ซับซ้อนกว่า SPI หรือ I2C ควรใช้ซอฟต์แวร์ที่ผู้ผลิตจัดเตรียมไว้ให้มากที่สุด สำหรับการส่งข้อมูลความเร็วสูงควรใช้ bulk transfer และต้องตรวจสอบปัญหาฝั่งโฮสต์ด้วย

  • การสร้างอุปกรณ์ USB เสมือน: ใช้ Raspberry Pi สร้างอุปกรณ์ USB เสมือนเพื่อเชื่อมต่อกับพีซี กำลังใช้มันในการจำลองกล้อง MTP เพื่อหลอกซอฟต์แวร์

  • คำถามเกี่ยวกับบอร์ดพัฒนาที่รองรับ USB 3: ต้องการทำต้นแบบ USB C monitor sink แต่หาบอร์ดที่มีกำลังประมวลผลพอจะรับ DisplayPort ได้ยาก

  • ต้นทุนในการใช้งาน USB: USB ไม่ได้ฟรี ต้องจ่ายค่าธรรมเนียมครั้งเดียว $6,000 เพื่อให้ได้ vendor ID.