Tác giả:TorchIoTBootCamp
Liên kết:https://zhuanlan.zhihu.com/p/339700391
Từ:Quora
1. Giới thiệu
Silicon Labs đã cung cấp giải pháp host+NCP cho thiết kế cổng Zigbee. Trong kiến trúc này, host có thể giao tiếp với NCP thông qua giao diện UART hoặc SPI. Phổ biến nhất, UART được sử dụng vì nó đơn giản hơn nhiều so với SPI.
Silicon Labs cũng đã cung cấp một dự án mẫu cho chương trình chủ, đó là mẫuMáy chủ Z3Gateway
. Mẫu chạy trên hệ thống giống Unix. Một số khách hàng có thể muốn mẫu máy chủ có thể chạy trên RTOS, nhưng thật không may, hiện tại không có mẫu máy chủ dựa trên RTOS. Người dùng cần phát triển chương trình máy chủ của riêng họ dựa trên RTOS.
Điều quan trọng là phải hiểu giao thức cổng UART trước khi phát triển chương trình máy chủ tùy chỉnh. Đối với cả NCP dựa trên UART và NCP dựa trên SPI, máy chủ sử dụng giao thức EZSP để giao tiếp với NCP.EZSPlà viết tắt củaGiao thức nối tiếp EmberZnetvà nó được định nghĩa trongUG100. Đối với NCP dựa trên UART, một giao thức lớp thấp hơn được triển khai để truyền dữ liệu EZSP một cách đáng tin cậy qua UART, đó làTROgiao thức, viết tắt củaMáy chủ nối tiếp không đồng bộ. Để biết thêm chi tiết về ASH, vui lòng tham khảoUG101VàUG115.
Mối quan hệ giữa EZSP và ASH có thể được minh họa bằng sơ đồ sau:
Định dạng dữ liệu của EZSP và giao thức ASH có thể được minh họa bằng sơ đồ sau:
Trong trang này, chúng tôi sẽ giới thiệu quá trình đóng khung dữ liệu UART và một số khung chính thường được sử dụng trong cổng Zigbee.
2. Khung
Quá trình đóng khung chung có thể được minh họa bằng biểu đồ sau:
Trong biểu đồ này, dữ liệu có nghĩa là khung EZSP. Nhìn chung, các quy trình đóng khung là: |Không|Bước|Tham chiếu|
|:-|:-|:-|
|1|Điền vào Khung EZSP|UG100|
|2|Ngẫu nhiên hóa dữ liệu|Mục 4.3 của UG101|
|3|Thêm Byte Điều khiển|Chương 2 và Chương 3 của UG101|
|4|Tính toán CRC|Mục 2.3 của UG101|
|5|Nhồi byte|Mục 4.2 của UG101|
|6|Thêm Cờ Kết Thúc|Mục 2.4 của UG101|
2.1. Điền vào Khung EZSP
Định dạng khung EZSP được minh họa trong Chương 3 của UG100.
Xin lưu ý rằng định dạng này có thể thay đổi khi SDK nâng cấp. Khi định dạng thay đổi, chúng tôi sẽ cung cấp cho nó một số phiên bản mới. Số phiên bản EZSP mới nhất là 8 khi bài viết này được viết (EmberZnet 6.8).
Vì định dạng khung EZSP có thể khác nhau giữa các phiên bản khác nhau nên có yêu cầu bắt buộc là máy chủ và NCPPHẢIlàm việc với cùng phiên bản EZSP. Nếu không, chúng không thể giao tiếp như mong đợi.
Để đạt được điều đó, lệnh đầu tiên giữa máy chủ và NCP phải là lệnh phiên bản. Nói cách khác, máy chủ phải lấy lại phiên bản EZSP của NCP trước bất kỳ giao tiếp nào khác. Nếu phiên bản EZSP khác với phiên bản EZSP của máy chủ, giao tiếp phải bị hủy bỏ.
Yêu cầu ngầm định đằng sau điều này là định dạng của lệnh phiên bản có thểKHÔNG BAO GIỜ THAY ĐỔI. Định dạng lệnh phiên bản EZSP như sau:
链接:https://zhuanlan.zhihu.com/p/339700391
来源: 知乎
Bạn có thể làm điều đó bằng cách sử dụng nó.
2.2. Ngẫu nhiên hóa dữ liệu
Quá trình ngẫu nhiên hóa chi tiết được mô tả trong phần 4.3 của UG101. Toàn bộ khung EZSP sẽ được ngẫu nhiên hóa. Quá trình ngẫu nhiên hóa là loại trừ-OR khung EZSP và một chuỗi giả ngẫu nhiên.
Dưới đây là thuật toán tạo chuỗi giả ngẫu nhiên.
- rand0 = 0×42
- nếu bit 0 của randi là 0, randi+1 = randi >> 1
- nếu bit 0 của randi là 1, randi+1 = (randi >> 1) ^ 0xB8
2.3. Thêm Byte Điều khiển
Byte điều khiển là dữ liệu một byte và phải được thêm vào phần đầu của khung. Định dạng được minh họa bằng bảng dưới đây:
Tổng cộng có 6 loại byte điều khiển. Ba loại đầu tiên được sử dụng cho các khung chung có dữ liệu EZSP, bao gồm DATA, ACK và NAK. Ba loại cuối cùng được sử dụng mà không có dữ liệu EZSP chung, bao gồm RST, RSTACK và ERROR.
Định dạng của RST, RSTACK và ERROR được mô tả trong phần 3.1 đến 3.3.
2.4. Tính toán CRC
CRC 16 bit được tính toán trên các byte từ byte điều khiển cho đến hết dữ liệu. CRCCCITT chuẩn (g(x) = x16 + x12 + x5 + 1) được khởi tạo thành 0xFFFF. Byte quan trọng nhất đứng trước byte ít quan trọng nhất (chế độ big-endian).
2.5. Nhồi byte
Như đã mô tả trong phần 4.2 của UG101, có một số giá trị byte được dành riêng được sử dụng cho mục đích đặc biệt. Các giá trị này có thể được tìm thấy trong bảng sau:
Khi các giá trị này xuất hiện trong khung, một xử lý đặc biệt sẽ được thực hiện với dữ liệu. – Chèn byte thoát 0x7D vào trước byte được dành riêng – Đảo ngược bit5 của byte được dành riêng đó
Dưới đây là một số ví dụ về thuật toán này:
2.6. Thêm Cờ Kết Thúc
Bước cuối cùng là thêm cờ kết thúc 0x7E vào cuối khung. Sau đó, dữ liệu có thể được gửi đến cổng UART.
3. Quá trình phá bỏ khuôn khổ
Khi nhận được dữ liệu từ UART, chúng ta chỉ cần thực hiện các bước ngược lại để giải mã dữ liệu.
4. Tài liệu tham khảo
Thời gian đăng: 08-02-2022