เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

ทุกอย่างเริ่มต้นจากการที่ผู้เขียนซื้ออุปกรณ์ที่น่าสนใจในตลาดรอง - Smart Response XE (คำอธิบายสั้น). มีไว้สำหรับโรงเรียน: นักเรียนแต่ละคนในชั้นเรียนจะได้รับอุปกรณ์ที่คล้ายกับสมุดบันทึกอิเล็กทรอนิกส์หรือเครื่องแปลจากยุค 802.15.4 ครูถามคำถาม และนักเรียนพิมพ์คำตอบบนแป้นพิมพ์ของอุปกรณ์ซึ่งได้รับผ่านทาง ช่องวิทยุ (XNUMX) ไปยังเครื่องรับที่เชื่อมต่อกับพีซีของครู

อุปกรณ์เหล่านี้เลิกผลิตไปหลายปีแล้ว และโรงเรียนที่ซื้อในราคา 100-200 ดอลลาร์ต่อเครื่องก็กำลังปรากฏบน eBay ในราคา 10 ดอลลาร์หรือน้อยกว่านั้น ฮาร์ดแวร์นั้นเหมาะมากสำหรับการทดลองที่เกินบรรยาย:

  • คีย์บอร์ด 60 คีย์
  • จอแสดงผลที่มีความละเอียด 384×136, 2 บิตต่อพิกเซล - คล้ายกับ BC, CGA แต่ไม่ใช่ 4 สี แต่เป็นการไล่ระดับความสว่าง
  • ไมโครคอนโทรลเลอร์ ATmega128RFA1 (หน่วยความจำแฟลช 128 kB, ROM 4 kB, RAM 16 kB, ตัวรับส่งสัญญาณ 802.15.4)
  • ภายนอก (เกี่ยวข้องกับไมโครคอนโทรลเลอร์ ไม่ใช่อุปกรณ์ทั้งหมด) หน่วยความจำแฟลช 1 เมกะบิต (128 กิโลไบต์) พร้อมอินเทอร์เฟซ SPI
  • ช่องสำหรับใส่ชิ้น AAA 4 ชิ้น

จากชื่อของไมโครคอนโทรลเลอร์เป็นที่ชัดเจนว่าอยู่ในตระกูล AVR ซึ่งหมายความว่าการทำให้อุปกรณ์ที่เข้ากันได้กับ Arduino นั้นเป็นมากกว่างานที่ไม่สำคัญ...

จากข่าวคราว. Hackaday ผู้เขียนพบว่ามันคืออะไร ได้ทำไปแล้ว (ลิงก์เดียวกันจะบอกคุณว่าจะเชื่อมต่อที่ไหน) มีโอกาสรันเกมสำหรับ Arduboy:


แต่ผู้เขียนสนใจโอกาสที่จะไม่เล่นบนอุปกรณ์มากกว่า แต่เพื่อศึกษา:

  • หน่วยความจำแฟลชพร้อมอินเทอร์เฟซ SPI แบบอนุกรม
  • บูตโหลดเดอร์สำหรับ AVR
  • มาตรฐาน 802.15.4

ผู้เขียนเริ่มต้นด้วยการเขียน ห้องสมุด (GPL v3) ซึ่งช่วยให้คุณเริ่มต้นการแสดงผล ข้อความเอาท์พุตและสี่เหลี่ยม และเข้าถึงหน่วยความจำแฟลช SPI จากนั้นเขาก็เริ่มคิดไอเดียสำหรับการใช้งานอุปกรณ์ในทางปฏิบัติ: เครื่องพกพาที่รองรับ VT-100, เกมแบบผู้เล่นหลายคน หลังจากสร้างอุปกรณ์ขึ้นมาใหม่สามเครื่อง เขาจึงตัดสินใจ "สอน" อุปกรณ์เหล่านั้นให้รับภาพร่าง "ทางอากาศ" สิ่งที่ไม่เพียงน่าสนใจ แต่ยังสะดวกมากอีกด้วย: เคสอุปกรณ์เปิดยากทุกครั้งและใต้ฝาปิดช่องใส่แบตเตอรี่มีเพียงรูที่ให้คุณเชื่อมต่อโปรแกรมเมอร์ JTAG เข้ากับบอร์ดได้

เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

นี่เพียงพอที่จะอัปโหลด Arduino bootloader แต่ไม่ใช่ภาพร่าง - พอร์ตอนุกรมไม่ได้เชื่อมต่ออยู่ที่นั่นดังนั้นคุณจึงยังไม่สามารถทำได้โดยไม่ต้องเปิดเคส นอกจากนี้ เส้น TX0 และ RX0 ของพอร์ตอนุกรมแรกจะรวมกับเส้นโพลลิ่งของเมทริกซ์แป้นพิมพ์ ซึ่งก็คือเส้นที่โพลปุ่มฟังก์ชันที่ด้านข้างของจอแสดงผล แต่คุณจะทำอย่างไร - ผู้เขียนสร้างสิ่งนี้:

เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

เขาเอาสาย JTAG ไว้ตรงนั้น และตอนนี้ก็ไม่ต้องเปิดช่องใส่แบตเตอรี่แล้ว และเพื่อให้สามารถอัปโหลดภาพร่างได้ ฉันจึงเชื่อมต่อพอร์ตอนุกรมทั้งสองพอร์ตเข้ากับขั้วต่อเดียวกัน และยังเพิ่มสวิตช์เข้าไปด้วย เนื่องจากเมื่อใส่แบตเตอรี่แล้ว จึงเป็นไปไม่ได้ทางกายภาพที่จะปิดอุปกรณ์ด้วยวิธีอื่นใด

ใช้เวลานานพอสมควรในการทำงานกับหัวแร้ง มีดอรรถประโยชน์ และปืนกาว โดยทั่วไปการอัปโหลดภาพร่างแบบ "ทางอากาศ" จะสะดวกกว่ามาก เราต้องคิดค้นบางสิ่งอย่างเร่งด่วนเพื่อสิ่งนี้

Arduino IDE ใช้โปรแกรมในการอัพโหลดภาพร่าง สวัสดี. มันโต้ตอบกับไมโครคอนโทรลเลอร์โดยใช้โปรโตคอล STK500ซึ่งช่วยให้คุณสามารถถ่ายโอนไฟล์ได้ทั้งสองทิศทาง มันเข้ากันไม่ได้กับช่องสัญญาณที่อาจเกิดความล่าช้าของตัวแปร การบิดเบือน และการสูญเสียข้อมูลได้ หากมีสิ่งใดหลวมหรือเกิดเสียงกรอบแกรบในช่องอนุกรม คุณอาจคลั่งไคล้การค้นหาสาเหตุได้ เมื่อผู้เขียนต้องทนทุกข์ทรมานเป็นเวลาครึ่งวันจนกระทั่งเขาตระหนักว่าปัญหาคือสายเคเบิลที่ไม่ดีรวมถึงตัวแปลงอินเทอร์เฟซ CP2102 ที่ไม่แน่นอน แม้แต่ไมโครคอนโทรลเลอร์ที่มีตัวแปลงอินเทอร์เฟซในตัวเช่น ATmega32u4 ก็สามารถทำหน้าที่เช่นนี้ได้ ผู้ใช้ Arduino ทุกคนสังเกตเห็นว่าข้อผิดพลาดในการอัปโหลดภาพร่างนั้นไม่ได้เกิดขึ้นบ่อยนัก บางครั้งการบันทึกเป็นไปด้วยดี แต่ในระหว่างการทดสอบการอ่านพบว่ามีข้อผิดพลาด นี่ไม่ได้หมายความว่ามีข้อผิดพลาดระหว่างการเขียน - มีข้อผิดพลาดระหว่างการอ่าน ทีนี้ลองจินตนาการว่าเมื่อทำงาน "ทางอากาศ" สิ่งเดียวกันนี้จะเกิดขึ้น แต่บ่อยกว่ามาก

หลังจากลองวิธีต่างๆ เพื่อแก้ไขปัญหานี้แล้ว ผู้เขียนก็ได้ข้อสรุปดังนี้ อุปกรณ์มีหน่วยความจำแฟลชขนาด 128 KB พร้อมอินเทอร์เฟซ SPI - เราได้รับข้อมูลผ่านสาย (โปรดจำไว้ว่าผู้เขียนมีอุปกรณ์หนึ่งเครื่องที่มีขั้วต่อที่ด้านข้างอยู่แล้ว) ใช้หน่วยความจำนี้เป็นบัฟเฟอร์และส่งข้อมูลทางวิทยุ ช่องสัญญาณไปยังอุปกรณ์อื่น สวัสดีจากไซบิโกะ

หลังจากเขียนโค้ดเพื่อทำงานกับช่องวิทยุและฟอนต์ ตัวโหลดก็มีความยาวมากกว่า 4 กิโลไบต์ ดังนั้นจึงต้องเปลี่ยนค่า HFUSE จาก 0xDA เป็น 0xD8 ตอนนี้ bootloader สามารถมีความยาวได้สูงสุด 8 กิโลไบต์ และที่อยู่เริ่มต้นคือ 0x1E000 สิ่งนี้สะท้อนให้เห็นใน Makefile แต่ควรนำมาพิจารณาเมื่อกรอกด้วย bootloader ผ่านทาง avrdude

ตัวรับส่งสัญญาณ 802.15.4 ใน ATmega128RFA1 เดิมได้รับการออกแบบให้ทำงานโดยใช้โปรโตคอล ZigBeeซึ่งค่อนข้างซับซ้อนผู้เขียนจึงตัดสินใจส่งแพ็กเก็ตแทน สิ่งนี้ถูกนำไปใช้ในฮาร์ดแวร์ใน ATmega128RFA1 ดังนั้นจึงจำเป็นต้องใช้โค้ดเพียงเล็กน้อย นอกจากนี้ เพื่อความเรียบง่าย ผู้เขียนจึงตัดสินใจใช้ช่องทางคงที่ โดยไม่อนุญาตให้คุณเลือกด้วยตนเอง มาตรฐาน 802.15.4 รองรับ 16 ช่องสัญญาณที่มีตัวเลขตั้งแต่ 11 ถึง 26 ซึ่งค่อนข้างหนาแน่น บางช่องยังทับซ้อนช่อง WiFi (สีแดงคือช่อง ZigBee, สีฟ้า, สีเขียว และสีเหลืองคือ WiFi)

เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

ปรากฎว่าช่อง 15 และ 26 มีความไวต่อการรบกวนจาก WiFi น้อยที่สุด ผู้เขียนเลือกช่องที่สอง ข้อจำกัดความรับผิดชอบ: ผู้แปลไม่ทราบว่าได้รับอนุญาตให้ทำให้ ZigBee ง่ายขึ้นด้วยวิธีนี้หรือไม่ บางทีเราควรเขียนโปรแกรมเพิ่มเติมอีกเล็กน้อยและนำไปใช้งานให้สมบูรณ์?

บนอุปกรณ์เครื่องแรก จำเป็นต้องใช้เครื่องสถานะจำกัดที่ส่งข้อมูลผ่านโปรโตคอล STK500 ข้อความที่ส่งและรับส่วนใหญ่จะพึ่งตนเองได้ แต่บางข้อความก็เชื่อมโยงกับข้อความที่ส่งผ่านช่องทางก่อนหน้านี้ คำอธิบายของบทสนทนาจะได้รับ ที่นี่.

องค์ประกอบที่สำคัญของบทสนทนานี้คือการส่งแพ็กเก็ตที่ตั้งใจจะเขียนลงในหน่วยความจำแฟลชของอุปกรณ์ปลายทาง สำหรับไมโครคอนโทรลเลอร์อย่างง่ายในตระกูล AVR ขนาดหน้าคือ 128 ไบต์ แต่สำหรับ ATmega128RFA1 จะเป็น 256 และสำหรับหน่วยความจำแฟลชที่เชื่อมต่อผ่านโปรโตคอล SPI ก็เหมือนกัน โปรแกรมในอุปกรณ์เครื่องแรกเมื่ออัปโหลดภาพร่างจะไม่ถ่ายโอนไปยังเครื่องที่สองทันที แต่เขียนลงในหน่วยความจำนี้ เมื่อ Arduino IDE ตรวจสอบความถูกต้องของรายการ รายการจะถูกส่งไปที่นั่น ตอนนี้เราต้องส่งข้อมูลที่ได้รับผ่านสถานีวิทยุไปยังอุปกรณ์ตัวที่สอง ในขณะเดียวกัน การเปลี่ยนจากการรับเป็นการส่งสัญญาณและย้อนกลับเกิดขึ้นค่อนข้างบ่อย โปรโตคอล STK500 ไม่แยแสกับความล่าช้า แต่ไม่ยอมให้ข้อมูลสูญหาย (แปลก แต่มีการกล่าวไว้ข้างต้นว่าความล่าช้ายังส่งผลต่อการถ่ายโอนข้อมูลด้วย) และความสูญเสียระหว่างการส่งสัญญาณไร้สายเป็นสิ่งที่หลีกเลี่ยงไม่ได้ ATmega128RFA1 มีการติดตั้งฮาร์ดแวร์ในตัวสำหรับคำขอซ้ำ ๆ เมื่อมีข้อสงสัยเกี่ยวกับความถูกต้องของการถ่ายโอน แต่ผู้เขียนตัดสินใจที่จะติดตั้งแบบเดียวกันในซอฟต์แวร์ด้วยตัวเอง เขาพัฒนาโปรโตคอลที่ข้อมูลไหลไปทางเดียวมากกว่าอีกทางหนึ่ง

มันไม่สมบูรณ์แบบแต่ก็ใช้งานได้ เพจขนาด 256 ไบต์แบ่งออกเป็นสี่ส่วน โดยแต่ละส่วนจะถูกส่งทางอากาศในรูปแบบแพ็กเก็ต แพ็กเก็ตสามารถเก็บข้อมูลได้สูงสุด 125 ไบต์บวกหนึ่งไบต์สำหรับความยาวและสองไบต์สำหรับ CRC ดังนั้นแฟรกเมนต์ที่มีความยาว 64 ไบต์พร้อมกับหมายเลขหน้าและเซ็กเมนต์ (ตั้งแต่ 0 ถึง 3) จึงถูกวางไว้ที่นั่น อุปกรณ์รับมีตัวแปรที่ช่วยให้ติดตามจำนวนเซ็กเมนต์ที่ได้รับ และเมื่อทั้งสี่เซ็กเมนต์มาถึง อุปกรณ์ส่งจะได้รับการยืนยันว่าได้รับทั้งเพจแล้ว ไม่มีการยืนยัน (CRC ไม่ตรงกัน) - ส่งทั้งหน้าอีกครั้ง ความเร็วนั้นยิ่งใหญ่กว่าเมื่อส่งสัญญาณผ่านสายเคเบิล ดู:


แต่โดยทั่วไปจำเป็นต้องจัดเตรียมวิธีที่สะดวกในการเชื่อมต่อสายเคเบิลเข้ากับอุปกรณ์สำหรับการอัพโหลดแบบร่างและผ่านมัน ตัวอย่างเช่น วางภายในตัวแปลงอินเทอร์เฟซบน CP2102 ดังในภาพ แล้วติดไว้กับบอร์ดเพื่อให้สามารถทนต่อแรงเมื่อเชื่อมต่อและถอดสาย Micro USB

เรากำลังเขียน OTA bootloader สำหรับ ATmega128RFA1 (ซึ่งเป็นส่วนหนึ่งของอุปกรณ์ Smart Response XE)

นอกจากนี้ยังมีโคลง 3,3 โวลต์ (และวิธีใช้ในอุปกรณ์ที่มีแหล่งจ่ายไฟ 6 โวลต์ - หากมีเพียงโคลงเดียวกันและคุณสามารถเพิ่มไดโอดสองตัวเพื่อเลือกโดยอัตโนมัติว่าจะให้พลังงานแก่อุปกรณ์ใด) . ต้องถอด LED ทั้งสามดวงออกจากบอร์ดตัวแปลงอินเทอร์เฟซ มิฉะนั้นจะโหลดแบตเตอรี่เพิ่มเติมเมื่อใช้งาน และยังรบกวนการหยั่งเสียงแป้นพิมพ์และทำงานกับหน่วยความจำแฟลชด้วยอินเทอร์เฟซ SPI

การบรรลุเป้าหมายนั้นน่าสนใจยิ่งกว่าการบรรลุเป้าหมาย (และไม่จำเป็นต้องล้อเล่นเรื่องรถบัสด้วยซ้ำ) ผู้เขียนได้เรียนรู้มากมายเกี่ยวกับ AVR bootloaders, หน่วยความจำแฟลช SPI, โปรโตคอล STK500 และมาตรฐาน 802.15.4

รหัสอื่น ๆ ทั้งหมดนอกเหนือจากไลบรารีที่อธิบายไว้ข้างต้นคือ − ที่นี่และอยู่ภายใต้ GPL v3 ด้วย ทวิตเตอร์ของผู้เขียน - ที่นี่.

ที่มา: will.com

เพิ่มความคิดเห็น