SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (ModusToolbox)
Loading...
Searching...
No Matches
J7 — บอร์ดฐาน QWA309: คู่มือฮาร์ดแวร์
variant ที่ใช้ได้
mtb-mpy และ mtb-only

บทนี้ใช้ได้กับทั้ง 2 แพ็กเกจ ฮาร์ดแวร์เป็นชุดเดียวกัน และโค้ด C ที่อ่านบอร์ดฐาน (proj_cm55/modules/cm55_sensor_poll/ และหน้า GPIO & RGB Matrix) ส่งมอบมาในรูปซอร์สในทั้งสองแพ็กเกจ

บทนี้มีไว้เพื่ออะไร

บทนี้คือคู่มือฮาร์ดแวร์ของบอร์ดฐาน QWA309 ที่อยู่ใต้ AI Kit SoM: สวิตช์ ลูกบิด และ header แต่ละตัวคืออะไร ต่อเข้าขาใด และเฟิร์มแวร์อ่านอะไรได้หรืออ่านอะไรไม่ได้ หน้า GPIO & RGB Matrix บนจอคือคู่หูของบทนี้ ทุกสวิตช์และลูกบิดที่หน้านั้นแสดงจะมีชื่อขากำกับไว้ข้าง ๆ

แผนผังขาของบอร์ด

แผนผังด้านล่างรวมทุกตารางในบทนี้ไว้ในภาพเดียว (ภาษาอังกฤษ) คำอธิบายสีและหมายเหตุภาษาไทยอยู่ใต้ภาพ ถ้าต้องการขยายภาพโดยไม่แตก ให้เปิด ไฟล์ SVG แถวใดในภาพที่ยังยืนยันไม่ได้ บทนี้ระบุไว้ว่ายังไม่ยืนยัน

แผนผังขาของบอร์ดฐาน QWA309 รุ่น V3.1
คำอธิบายสีและหมายเหตุ (ภาษาไทย)

สวิตช์ทุกตัวมีสองชื่อ

บอร์ดนี้ใช้ระบบชื่อสองระบบพร้อมกัน: ชื่อที่พิมพ์บนบอร์ด (silkscreen) และ ชื่ออ้างอิงใน schematic (reference designator, refdes) สำหรับสวิตช์ที่ผู้ใช้กดได้ ทั้งสองชื่อไม่ตรงกันเลยสักตัว บทนี้จึงให้ทั้งสองชื่อเสมอ เช่น "SW1 ที่พิมพ์ไว้ (refdes SW5)"

ชื่อ SW3 หมายถึงชิ้นส่วนสองชิ้นที่ต่างกัน: SW3 ที่พิมพ์บนบอร์ดคือสวิตช์เลื่อนที่ตัวควบคุม CapSense อ่าน ส่วน refdes SW3 คือสวิตช์จ่ายไฟของ mikroBUS เมื่ออ่านเอกสารอื่นหรือคุยกับผู้อื่น ให้ถามเสมอว่าหมายถึงชื่อแบบใด

ปุ่มกดสองปุ่มบน E84 คือ SW6 (P17.5 ปุ่มบน) และ SW5 (P17.7 ปุ่มล่าง) ชื่อขาพิมพ์ไว้ข้างปุ่มแต่ละปุ่ม

อินพุตที่ผู้ใช้กดหรือเลื่อนได้

ชื่อที่พิมพ์ refdes ชนิด ต่อเข้า เฟิร์มแวร์อ่านอย่างไร
SW1 SW5 ปุ่มกด ขา P2.5 ของตัวควบคุม CapSense ผ่านตัวควบคุมเท่านั้น และเฉพาะเมื่อเฟิร์มแวร์ของมันใช้ protocol 0x0D หรือ 0x0E
SW2 SW6 ปุ่มกด ขา P3.0 ของตัวควบคุม เหมือนข้างบน
SW3 SW7 สวิตช์เลื่อน ขา P4.0 ของตัวควบคุม เหมือนข้างบน (ON/OFF)
SW4 SW8 สวิตช์เลื่อน ขา P4.1 ของตัวควบคุม เหมือนข้างบน (ON/OFF)
SW5 SW10 ปุ่มกด P17.7 ของ E84 Cy_GPIO_Read() ได้ 0 เมื่อกด
SW6 SW9 ปุ่มกด P17.5 ของ E84 Cy_GPIO_Read() ได้ 0 เมื่อกด — อ่าน P17.5 และ P17.7: ขาที่ใช้ร่วมกัน และอันตรายหนึ่งข้อ ก่อนใช้
BTN0, BTN1, slider — ปุ่มสัมผัสและแถบเลื่อนแบบสัมผัส ตัวควบคุม CapSense ผ่านตัวควบคุม ใช้ได้กับเฟิร์มแวร์ทุกแบบ

SW1 ถึง SW4 ไม่ได้ต่อเข้า E84 ไม่มีขาใดของ E84 ที่อ่านสวิตช์เหล่านี้ได้โดยตรง ทิศทางที่เป็น ON ของ SW3 และ SW4 ดูจาก drawing ไม่ได้ ให้เลื่อนสวิตช์แล้วดูค่าบนหน้า GPIO & RGB Matrix

ลูกบิด VR1 ถึง VR4

ชื่อที่พิมพ์ ขา ช่อง SAR refdes
VR1 P15.5 5 VR2
VR2 P15.4 4 VR1
VR3 P15.6 6 VR3
VR4 P15.7 7 VR4

ชื่อขาที่พิมพ์ข้างลูกบิดแต่ละตัวถูกต้อง มีแต่หมายเลข VR1/VR2 ที่สลับกับ refdes ใน schematic เฟิร์มแวร์ยึดชื่อที่พิมพ์ไว้ (s_pot_adc_ch[] มีค่า { 5, 4, 6, 7 } ใน cm55_sensor_poll.c)

ลูกบิดแต่ละตัวเป็น 10 kOhm ต่อคร่อมระหว่างราง analog 1.8 V กับ GND ขากลางจึงแกว่งได้ 0 ถึง 1800 mV และ SAR อ่านช่วงนั้นเป็น 0 ถึง 4095 ค่ามิลลิโวลต์จึงเป็น raw * 1800 / 4095 หน้า GPIO & RGB Matrix แสดงทั้งค่า mV และค่า raw

สวิตช์จ่ายไฟและสวิตช์เลือกฟังก์ชัน

สวิตช์กลุ่มนี้เป็นสวิตช์เลื่อนทั้งหมด และ เฟิร์มแวร์อ่านตำแหน่งของมันไม่ได้ (ชื่อในตารางเป็น refdes)

refdes หน้าที่
SW2 ไฟ 3.3 V ของกล้อง
SW3 ไฟ 3.3 V และ 5 V ของช่อง mikroBUS ทั้งสามช่อง
SW4 ไฟ 3.3 V และ 5 V ของ header Arduino
SW11 ไฟ 5 V ของ RGB matrix
SW12 ON: ต่อตัวควบคุม CapSense เข้าบัส I2C หลัก (P17.0/P17.1) OFF: แยกออก
SW13 ON: ต่อ P16.2/P16.3 เข้าตัวรับส่ง CAN OFF: ปล่อยขาให้กล้องหรือ SPI
SW14 ON: ต่อ P17.5 เข้าขา RE และ P17.7 เข้าขา DE ของตัวรับส่ง RS-485

สายข้อมูลของ RS-485 ต่ออยู่ตลอด ไม่ผ่านสวิตช์: RO ของตัวรับส่ง ISL3178 เข้า P13.1 (SCB7 UART RX) และ DI รับจาก P13.2 (SCB7 UART TX) SW14 สลับเฉพาะขา RE และ DE

ตัวควบคุม CapSense

มันคือ MCU อีกตัวหนึ่ง ตัวควบคุม CapSense คือ PSoC 4000T (U6) ที่อยู่บนบอร์ดฐาน มีเฟิร์มแวร์ของตัวเอง และใช้ไฟ 1.8 V การ flash E84 ผ่าน KitProg3 ไม่เคย เปลี่ยนเฟิร์มแวร์ของมัน ช่องทางเดียวที่โปรแกรมมันได้คือ header P4 (SWD, 1.8 V เท่านั้น)

E84 คุยกับมันอย่างไร ที่ I2C address 0x08 บน P17.0/P17.1 เมื่อ SW12 อยู่ที่ ON ตัวควบคุมยังออกที่ header P5 ซึ่งเป็นบัส 1.8 V ด้วย ห้ามต่ออุปกรณ์ 3.3 V เข้า P5

ไฟ LED สีเขียว D4 ข้าง P4 ติดเฉพาะเมื่อมีอุปกรณ์ที่ต่อเข้า P4 หรือ P5 จ่ายไฟราว 1.8 V ที่ขา 1 เช่นเครื่องโปรแกรม ไม่มีวงจรบนบอร์ดใดจ่ายไฟให้ขานี้ D4 ที่ดับอยู่จึงเป็นเรื่องปกติ และไม่ได้บอกว่าตัวควบคุมไม่มีไฟ

ข้อมูลที่มันส่งมา ตัวควบคุมอาจรันเฟิร์มแวร์แบบใดแบบหนึ่งจากสองแบบ:

  • แบบเดิม (legacy) สามไบต์แรกคือปุ่ม 0 ปุ่ม 1 และ slider ไม่มีสถานะของ SW1 ถึง SW4
  • แบบ snapshot, protocol 0x0D หรือ 0x0E หกไบต์แรกคือ: ไบต์ระบุ 0xC5, หมายเลข protocol, ตัวนับที่เพิ่มทุกครั้งที่ข้อมูลใหม่, ไบต์สถานะ และตำแหน่ง slider แบบ 16 บิต little-endian (0 ถึง 100 หรือ 0xFFFF เมื่อไม่มีใครแตะ)

บิตในไบต์สถานะของแบบ snapshot:

บิต ความหมาย
0x01 แตะ BTN0 อยู่
0x02 กด SW1 อยู่
0x04 กด SW2 อยู่
0x08 SW3 อยู่ที่ ON
0x10 SW4 อยู่ที่ ON
0x20 แตะ BTN1 อยู่
0x40 ตัวควบคุมรายงานความผิดพลาด
0x80 ตัวควบคุมกำลังทำงาน

ตัวควบคุมกรองการเด้งของ SW1 ถึง SW4 ให้แล้วก่อนรายงาน

เทมเพลตอ่านอย่างไร ทุก 50 ms CM55 อ่านหกไบต์จาก 0x08 โดยไม่เขียน register address ก่อน (การอ่านจึงเริ่มที่ต้นบัฟเฟอร์ของตัวควบคุม) แล้วถอดรหัสได้ทั้งสองแบบ (cm55_capsense_frame.h) ถ้าสองไบต์แรกเป็น C5 0D หรือ C5 0E ก็ใช้แบบ snapshot มิฉะนั้นใช้แบบเดิม สถานะของ SW1 ถึง SW4 มีให้เฉพาะเมื่อเป็นแบบ snapshot

เมื่อ CapSense ไม่แสดงอะไร

บรรทัดสถานะของหน้า GPIO & RGB Matrix บอกได้ว่าอยู่ในกรณีใด:

  • "no answer at 0x08" — ตัวควบคุมไม่ตอบตอนเริ่มระบบ เลื่อน SW12 ไปที่ ON และ รีสตาร์ตบอร์ด เพราะเฟิร์มแวร์ถามหาตัวควบคุมเพียงครั้งเดียวตอนเริ่มระบบ
  • "legacy 3-byte firmware" — ปุ่มสัมผัสและ slider ใช้ได้ แต่ SW1 ถึง SW4 ต้องใช้เฟิร์มแวร์ของตัวควบคุมที่ใช้ protocol 0x0D หรือ 0x0E
  • "protocol 0x0D" หรือ "protocol 0x0E" — ใช้ได้ทุกอย่าง

การ flash E84 ใหม่แก้ปัญหาที่ตัวควบคุมไม่ได้ และในทางกลับกัน การเปลี่ยนเฟิร์มแวร์ของตัวควบคุมก็เปลี่ยนสิ่งที่หน้าจอแสดงได้ แม้ E84 จะยังรันอิมเมจเดิม

header Arduino Uno

หมายเลข D เป็นตำแหน่งมาตรฐานของ Arduino Uno ไม่ได้พิมพ์ไว้บนบอร์ด

ขาของ Uno ขาของ E84 หมายเหตุ
D0 P15.0 UART RX (SCB9)
D1 P15.1 UART TX
D2 P13.0
D3 P13.5 ใช้ร่วมกับ INT ของ mikroBUS ช่อง 2
D4 P13.6 ใช้ร่วมกับ INT ของ mikroBUS ช่อง 3
D5 P13.4 PWM
D6 P13.3 PWM
D7 P13.7
D8 P15.3 PWM หรือ GPIO ใช้เป็นอนาล็อกไม่ได้ (ดูหมายเหตุใต้ตาราง)
D9 P15.2 PWM หรือ GPIO ใช้เป็นอนาล็อกไม่ได้ (ดูหมายเหตุใต้ตาราง)
D10 P9.0 SPI SS บอร์ดพิมพ์ไว้ว่า "P9.2" ซึ่งผิด
D11 P9.2 SPI MOSI
D12 P9.1 SPI MISO
D13 P9.3 SPI SCK
SDA / SCL P17.1 / P17.0 บัส I2C หลัก
  • header นี้ไม่มีอินพุตอนาล็อก ตำแหน่ง A0 ถึง A3 ไม่ได้ต่อสาย (ขา 1 ถึง 4 ของ J10) ส่วน P15.2 และ P15.3 ซึ่งเป็นขาที่ ADC ของ E84 อ่านได้ ไปถึง D9 และ D8 ผ่านชิปแปลงระดับแรงดัน TXB0106 (U7) ซึ่งเป็นชิปดิจิทัล จึงใช้ D8/D9 เป็นอินพุตอนาล็อกไม่ได้ ข้อนี้อนุมานจากชนิดของชิป ยังไม่ได้วัดจริง อินพุตอนาล็อกของบอร์ดฐานมีเพียงลูกบิด VR1 ถึง VR4
  • ขา D0 ถึง D13 ทุกขาเป็นลอจิก 3.3 V ผ่านชิปแปลงระดับแรงดัน TXB0106 แบบเลือกทิศทางเอง (U7, U8, U9) ฝั่ง SoM เป็น 1.8 V
  • header J1 (6 ขา SPI 1.8 V: ไฟ 1.8 V, P9.3 SCK, P9.2 MOSI, P9.1 MISO, P9.0 SS, GND) ต่ออยู่ฝั่ง SoM ของ U7 จึงใช้ขา P9 ชุดเดียวกับ D10 ถึง D13
  • ไฟ 3.3 V และ 5 V ของ header มาผ่าน SW4 ส่วนขา RST, AREF, VIN และ IOREF ไม่ได้ต่อ

ช่อง mikroBUS ทั้งสาม

ขา ช่อง 1 ช่อง 2 ช่อง 3
AN, RST ไม่ต่อ ไม่ต่อ ไม่ต่อ
CS ไม่ต่อ ไม่ต่อ P16.4
SCK ไม่ต่อ ไม่ต่อ P16.0
MISO ไม่ต่อ ไม่ต่อ ไม่ต่อ
MOSI ไม่ต่อ ไม่ต่อ P16.1
PWM P16.5 P16.6 P16.7
INT ไม่ต่อ P13.5 P13.6
TX ไม่ต่อ P17.2 P11.1
RX ไม่ต่อ P17.3 P17.4
SCL / SDA P17.0 / P17.1 P17.0 / P17.1 P17.0 / P17.1
  • ช่อง 3 ไม่มี MISO บอร์ด Click ที่ต้องอ่านข้อมูลกลับทาง SPI จึงใช้ช่องนี้ไม่ได้หากไม่เดินสายเพิ่มเอง
  • แถว TX/RX ของช่อง 2 และช่อง 3 เขียนตามที่พิมพ์บนบอร์ด แต่ชื่อ net ใน schematic บอกทิศตรงข้าม ยังสรุปไม่ได้ว่าข้างใดถูก ทั้งช่อง 2 และช่อง 3 ให้ตรวจก่อนใช้ UART บนสองช่องนี้
  • ไฟของทั้งสามช่องมาผ่าน SW3 ขา P16.x, P17.2 ถึง P17.4 และ P11.1 ทุกขาใช้ร่วมกับสายของกล้อง DVP ด้วย

I2C และ I3C

บอร์ดฐาน ไม่มี I3C ไม่มี net I3C บน schematic แผ่นใดเลย I3C ที่พบในเอกสารเป็นของ SoM ซึ่งใช้ภายในกับ BMM350 header ที่พิมพ์ว่า "I2C 1.8V ONLY" คือ P5 ซึ่งเป็นบัสของตัวควบคุม CapSense เอง บัส 3.3 V หลัก (P17.0/P17.1) ใช้ pull-up บน SoM ตัวต้านทาน pull-up บนบอร์ดฐาน (R1/R2) ไม่ได้ใส่ บัสนี้ออกมาที่พอร์ต I2C 4 ขาสองตัว คือ P2 และ P14 (1 SCL, 2 SDA, 3 GND, 4 3.3 V) ตำแหน่งของสองพอร์ตนี้บนบอร์ดยังไม่ได้ระบุ

P17.5 และ P17.7: ขาที่ใช้ร่วมกัน และอันตรายหนึ่งข้อ

ขา ใช้ร่วมกับ
P17.5 ปุ่มกด SW6 · สายกล้องบน J4 (net ของบอร์ดฐานชื่อ PEN ส่วน BSP ของ SoM เรียกว่า camera reset) · ขา RE ของ RS-485 ผ่าน SW14 · ขาเปิดไฟ VBUS ของ USB host
P17.7 ปุ่มกด SW5 · สายกล้องบน J4 (net ชื่อ PDN, BSP เรียกว่า camera power-down) · ขา DE ของ RS-485 ผ่าน SW14

โมดูลกล้องและสวิตช์ไฟของมัน (SW2) อาจโหลดสายเหล่านี้ได้ ผลต่อการอ่านปุ่มยังไม่ได้วัด

Warning
อย่ากดปุ่มบน P17.5 ก่อนเปิดหน้า GPIO & RGB Matrix ตอนบูต BSP ตั้ง P17.5 เป็นขาเอาต์พุตแบบ strong และขับเป็น high (ขานี้คือ camera reset และขาเปิด VBUS ของ USB host) ปุ่มบน P17.5 ต่อขานั้นลง GND ตรง ๆ โดยไม่มีตัวต้านทานอนุกรม การกดปุ่มก่อนที่เฟิร์มแวร์จะตั้งขาใหม่จึงเป็นการลัดวงจรเอาต์พุตที่ขับ high ลงกราวด์ตลอดเวลาที่กดค้าง หน้า GPIO & RGB Matrix ตั้ง P17.5 ใหม่เป็นอินพุตพร้อม pull-up เมื่อเปิดหน้าครั้งแรก ยังไม่พบความเสียหาย แต่นี่ไม่ใช่ขีดจำกัดที่ได้วัดไว้ ปุ่มบน P17.7 ไม่มีความเสี่ยงนี้ เพราะ P17.7 ถูกขับเป็น low

ขาเปิด VBUS ของ USB host ใช้ P17.5 ร่วมกับปุ่มนี้ หน้า GPIO & RGB Matrix ตั้ง P17.5 ใหม่เป็นอินพุต

ภาพ pinout ชุดเก่าไม่ใช่แหล่งข้อมูล

ภาพ pinout ชุดเก่าที่แจกพร้อมบอร์ด (ไม่ใช่แผนผังในบทนี้) (ระบุว่า Version 3.1) ขัดกับ schematic สี่จุด: แสดง A0 ถึง A3 อยู่บน P15.2 ถึง P15.5 (ที่จริงไม่ได้ต่อสาย), แสดง VR1 อยู่บน P15.2, แสดงปุ่ม SW5/SW6 อยู่บน "P8.x" และแสดง D0 เป็น P9.0 (ที่จริงคือ P15.0) ให้ใช้บทนี้หรือ schematic แทน

อ่านบอร์ดฐานจากโค้ด C

ทุกอย่างด้านล่างทำงานบน CM55 และเรียกจาก GFX task (task ที่ LVGL ทำงาน) ซึ่งเป็นสิ่งที่หน้า GPIO & RGB Matrix (page_gpio_rgb.c) ทำ

  • ลูกบิด cm55_pot_read_all(uint16_t out[4]) คืนค่า raw 0 ถึง 4095 ตามลำดับชื่อที่พิมพ์ (VR1 ถึง VR4) และคืน 0 จนกว่า SAR จะพร้อม
  • ปุ่มบน P17.5/P17.7 ตั้งขาด้วย Cy_GPIO_Pin_FastInit(port, pin, CY_GPIO_DM_PULLUP, 1, HSIOM_SEL_GPIO) แล้ว Cy_GPIO_Read() คืน 0 เมื่อกด
  • CapSense cm55_capsense_info() (cm55_sensor_poll.h) บอกว่าตัวควบคุมตอบหรือไม่ protocol อะไร และสถานะ SW1 ถึง SW4 เมื่อมี ส่วน BTN0, BTN1 และ slider มาทาง snapshot ของ sensor hub (ipc_sensor_capsense_t ซึ่งไม่ได้เปลี่ยนรูปแบบ) และ CM33 อ่านค่าชุดเดียวกันได้ผ่าน hook cm55_controls_snapshot