Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Mọi chuyện bắt đầu với việc tác giả mua một thiết bị thú vị trên thị trường thứ cấp - Smart Response XE (Mô tả ngắn). Nó dành cho các trường học: mỗi học sinh trong lớp nhận được một thiết bị tương tự như một cuốn sổ tay điện tử hoặc một máy phiên dịch từ những năm 802.15.4, giáo viên đặt câu hỏi và học sinh gõ câu trả lời trên bàn phím của thiết bị. kênh radio (XNUMX) đến máy thu được kết nối với PC của giáo viên.

Những thiết bị này đã ngừng hoạt động cách đây vài năm và những thiết bị mà các trường học mua với giá 100-200 USD mỗi chiếc hiện đang xuất hiện trên eBay với giá 10 USD trở xuống. Phần cứng ở đó rất phù hợp cho những thử nghiệm táo bạo:

  • bàn phím 60 phím
  • hiển thị với độ phân giải 384×136, 2 bit trên mỗi pixel - tương tự như BC, CGA, nhưng không phải 4 màu mà là độ sáng tăng dần
  • vi điều khiển ATmega128RFA1 (bộ nhớ flash 128 kB, ROM 4 kB, RAM 16 kB, bộ thu phát 802.15.4)
  • bộ nhớ flash bên ngoài (liên quan đến vi điều khiển, không phải toàn bộ thiết bị) 1 megabit (128 kilobyte) với giao diện SPI
  • ngăn chứa 4 phần tử AAA.

Từ tên của bộ vi điều khiển, rõ ràng nó thuộc họ AVR, điều đó có nghĩa là làm cho thiết bị tương thích với Arduino không phải là một nhiệm vụ tầm thường...

Từ tin tức trên hackaday tác giả đã tìm ra nó là gì đã làm xong (cùng một liên kết cho bạn biết nên kết nối cái gì ở đâu), có cơ hội chạy trò chơi cho Arduboy:


Nhưng tác giả quan tâm nhiều hơn đến cơ hội không phải chơi trên thiết bị mà là nghiên cứu:

  • bộ nhớ flash với giao diện SPI nối tiếp
  • bộ nạp khởi động cho AVR
  • tiêu chuẩn 802.15.4

Tác giả bắt đầu bằng việc viết thư viện (GPL v3), cho phép bạn khởi tạo màn hình, xuất văn bản và hình chữ nhật cũng như truy cập bộ nhớ flash SPI. Sau đó, anh bắt đầu nảy ra ý tưởng để sử dụng thiết bị trong thực tế: thiết bị đầu cuối bỏ túi tương thích VT-100, trò chơi nhiều người chơi. Sau khi chế tạo lại ba thiết bị, anh quyết định “dạy” chúng nhận các bản phác thảo “qua mạng”. Điều sẽ không chỉ thú vị mà còn rất tiện lợi: hộp đựng thiết bị rất khó mở mỗi lần và dưới nắp ngăn chứa pin chỉ có các lỗ cho phép bạn kết nối bộ lập trình JTAG với bo mạch.

Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Điều này là đủ để tải lên bộ tải khởi động Arduino, nhưng không phải bản phác thảo - cổng nối tiếp không được kết nối ở đó, vì vậy bạn vẫn không thể làm gì nếu không mở hộp. Ngoài ra, các đường TX0 và ​​RX0 của cổng nối tiếp đầu tiên được kết hợp với các đường thăm dò của ma trận bàn phím, cụ thể là các đường thăm dò các phím chức năng ở các cạnh của màn hình. Nhưng bạn có thể làm gì - tác giả đã xây dựng điều này:

Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Anh đã mang dòng JTAG tới đó, bây giờ không cần phải mở ngăn đựng pin nữa. Và để có thể tải lên các bản phác thảo, tôi đã kết nối cả hai cổng nối tiếp với cùng một đầu nối, đồng thời thêm một công tắc, vì khi đã lắp pin, về mặt vật lý, không thể tắt thiết bị theo bất kỳ cách nào khác.

Phải mất khá nhiều thời gian để làm việc với bàn hàn, dao tiện ích và súng bắn keo. Nói chung, việc tải lên các bản phác thảo “qua mạng” sẽ thuận tiện hơn nhiều; chúng tôi cần khẩn trương phát minh ra thứ gì đó cho việc này.

Arduino IDE sử dụng chương trình để tải lên bản phác thảo ái kỷ. Nó tương tác với vi điều khiển bằng giao thức STK500, cho phép bạn truyền tệp theo cả hai hướng. Nó tương thích kém với các kênh có thể xảy ra độ trễ, biến dạng và mất dữ liệu thay đổi. Nếu có thứ gì đó bị lỏng hoặc có tiếng sột soạt trong kênh nối tiếp, bạn có thể điên cuồng tìm kiếm nguyên nhân. Có lần tác giả phải chịu đựng nửa ngày cho đến khi nhận ra rằng vấn đề nằm ở sợi cáp kém cũng như bộ chuyển đổi giao diện CP2102 thất thường. Ngay cả một bộ vi điều khiển có bộ chuyển đổi giao diện tích hợp, chẳng hạn như ATmega32u4, đôi khi cũng có thể hoạt động như thế này. Mọi người dùng Arduino đều nhận thấy rằng lỗi khi tải lên bản phác thảo không quá hiếm. Đôi khi quá trình ghi diễn ra tốt đẹp, nhưng trong quá trình đọc thử, người ta phát hiện ra lỗi. Điều này không có nghĩa là có lỗi trong quá trình viết - có lỗi trong quá trình đọc. Bây giờ hãy tưởng tượng rằng khi làm việc “qua mạng”, điều tương tự sẽ xảy ra, nhưng thường xuyên hơn nhiều.

Sau khi thử nhiều cách khác nhau để khắc phục vấn đề này, tác giả đã nghĩ ra cách sau. Thiết bị có bộ nhớ flash 128 KB với giao diện SPI - chúng tôi nhận dữ liệu qua dây (hãy nhớ rằng tác giả đã có một thiết bị có đầu nối ở bên cạnh), sử dụng bộ nhớ này làm bộ đệm và gửi dữ liệu qua radio kênh sang thiết bị khác. Xin chào từ Cybiko.

Sau khi viết mã để làm việc với kênh radio cũng như phông chữ, trình tải trở nên dài hơn 4 kilobyte. Do đó, giá trị HFUSE phải được thay đổi từ 0xDA thành 0xD8. Bây giờ bộ tải khởi động có thể dài tới 8 kilobyte và địa chỉ bắt đầu hiện là 0x1E000. Điều này được phản ánh trong Makefile, nhưng cũng cần được tính đến khi điền bộ nạp khởi động thông qua avrdude.

Bộ thu phát 802.15.4 trong ATmega128RFA1 ban đầu được thiết kế để hoạt động bằng giao thức ZigBee, việc này khá phức tạp nên tác giả quyết định chỉ truyền các gói tin thay thế. Điều này được triển khai trong phần cứng trong ATmega128RFA1, do đó cần ít mã hơn. Ngoài ra, để đơn giản, tác giả đã quyết định sử dụng một kênh cố định, không cho phép bạn chọn kênh đó dù chỉ bằng tay. Chuẩn 802.15.4 hỗ trợ 16 kênh với số lượng từ 11 đến 26. Chúng khá đông, một số còn chồng các kênh WiFi (màu đỏ là kênh ZigBee, xanh dương, xanh lá cây và vàng là WiFi).

Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Hóa ra kênh 15 và 26 ít bị ảnh hưởng bởi WiFi nhất. Tác giả đã chọn kênh thứ hai. Tuyên bố miễn trừ trách nhiệm: người dịch không biết liệu có được phép đơn giản hóa ZigBee theo cách này hay không. Có lẽ chúng ta nên lập trình thêm một chút và triển khai nó một cách hoàn chỉnh?

Trên thiết bị đầu tiên, cần triển khai một máy trạng thái hữu hạn truyền dữ liệu qua giao thức STK500. Phần lớn, các tin nhắn được truyền và nhận là độc lập, nhưng một số được gắn với những tin nhắn đã truyền qua kênh trước đó. Mô tả cuộc đối thoại được đưa ra đây.

Một thành phần quan trọng của cuộc đối thoại này là việc truyền các gói được ghi vào bộ nhớ flash của thiết bị đích. Đối với các bộ vi điều khiển đơn giản thuộc họ AVR, kích thước trang là 128 byte, nhưng đối với ATmega128RFA1 là 256. Và đối với bộ nhớ flash được kết nối qua giao thức SPI, điều này cũng tương tự. Chương trình trong thiết bị đầu tiên, khi tải bản phác thảo lên, không chuyển ngay nó sang thiết bị thứ hai mà ghi nó vào bộ nhớ này. Khi Arduino IDE kiểm tra tính chính xác của mục nhập, nó sẽ gửi những gì được viết ở đó. Bây giờ chúng ta cần truyền dữ liệu nhận được qua kênh radio đến thiết bị thứ hai. Đồng thời, việc chuyển từ nhận sang truyền và ngược lại diễn ra khá thường xuyên. Giao thức STK500 không quan tâm đến độ trễ, nhưng không chấp nhận mất dữ liệu (lạ, nhưng ở trên đã nói rằng độ trễ cũng ảnh hưởng đến việc truyền dữ liệu). Và tổn thất trong quá trình truyền tải không dây là điều không thể tránh khỏi. ATmega128RFA1 có phần cứng tích hợp triển khai các yêu cầu lặp đi lặp lại khi có nghi ngờ về tính chính xác của quá trình truyền, nhưng tác giả đã quyết định tự mình thực hiện điều tương tự trong phần mềm. Ông đã phát triển một giao thức trong đó nhiều dữ liệu được truyền theo chiều này hơn chiều kia.

Nó không hoàn hảo, nhưng nó hoạt động. Trang 256 byte được chia thành bốn phân đoạn, mỗi phân đoạn được truyền qua mạng dưới dạng một gói. Một gói có thể chứa tối đa 125 byte dữ liệu cộng với một byte cho độ dài và hai byte cho CRC. Vì vậy, các đoạn dài 64 byte cùng với số trang và số phân đoạn (từ 0 đến 3) được đặt ở đó. Thiết bị nhận có một biến cho phép nó theo dõi số lượng phân đoạn đã được nhận và khi cả bốn phân đoạn đến nơi, thiết bị gửi sẽ nhận được xác nhận rằng toàn bộ trang đã được nhận. Không có xác nhận (CRC không khớp) - gửi lại toàn bộ trang. Tốc độ thậm chí còn lớn hơn khi truyền qua cáp. Nhìn thấy:


Nhưng nói chung, cần phải cung cấp một cách thuận tiện để kết nối cáp với các thiết bị để tải lên bản phác thảo và thông qua nó. Ví dụ: đặt bên trong bộ chuyển đổi giao diện như vậy trên CP2102, như trong ảnh và dán nó vào bo mạch để nó có thể chịu được lực khi kết nối và ngắt kết nối cáp Micro USB.

Chúng tôi đang viết bộ tải khởi động OTA cho ATmega128RFA1 (như một phần của thiết bị Smart Response XE)

Nó cũng có bộ ổn định 3,3 volt (và cách sử dụng nó trong thiết bị có nguồn điện 6 volt - nếu nó có cùng bộ ổn định và bạn có thể thêm hai điốt để tự động chọn cái nào trong số chúng sẽ cấp nguồn cho thiết bị) . Tất cả ba đèn LED phải được tháo ra khỏi bảng chuyển đổi giao diện, nếu không chúng sẽ nạp thêm pin khi hoạt động trên chúng, đồng thời cản trở việc bỏ phiếu của bàn phím và hoạt động với bộ nhớ flash với giao diện SPI.

Theo đuổi một mục tiêu hóa ra còn thú vị hơn cả việc đạt được nó (và không cần phải nói đùa về chiếc xe buýt nữa). Tác giả đã tìm hiểu rất nhiều về bộ tải khởi động AVR, bộ nhớ flash SPI, giao thức STK500 và tiêu chuẩn 802.15.4.

Tất cả các mã khác ngoài thư viện được mô tả ở trên là − đây, và nó cũng thuộc GPL v3. Twitter của tác giả - đây.

Nguồn: www.habr.com

Thêm một lời nhận xét