คู่มือการพัฒนาอุปกรณ์ 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 ความคิดเห็น
ความคิดเห็นจาก 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.