Khi bạn đặt lại Uno đang chạy bộ tải Optiboot, bộ tải khởi động trước tiên sẽ nhấp nháy pin 13 lần.
Dòng trên cùng (màu xám) được gửi đến Arduino, dòng giữa (màu cam) được gửi từ Arduino.
Trong khi điều đó đang xảy ra, chương trình avrdude
đang chạy trên máy tính của bạn đang gửi một truy vấn đến thiết bị:
STK_GET_SYNC / CRC_EOP (0x30/0x20)
Arduino không chú ý đến "get sync" đầu tiên bởi vì nó đang bận nhấp nháy pin 13. Sau khi hoàn thành, nó sẽ thông báo "get sync" (nó sẽ được đệm bởi phần cứng nối tiếp) và trả lời:
STK_INSYNC / STK_OK (0x14/0x10)
Có vẻ như avrdude có một chút thiếu kiên nhẫn và hết thời gian, bởi vì nó thử lại với truy vấn "get sync". Lần này Optiboot trả lời ngay lập tức.
Phần còn lại của việc tải lên được mô tả trong hình ảnh tiếp theo. Ví dụ sản xuất tải lên chương trình chứng khoán "Blink".
(Nhấp vào hình trên để xem ảnh lớn hơn)
Các bước là:
- Truy vấn: Nhận đồng bộ hóa? Trả lời: Trong Đồng bộ hóa.
- Truy vấn: Nhận tham số? (phiên bản chính) Trả lời: phiên bản 4.
- Truy vấn: Nhận tham số? (phiên bản nhỏ) Trả lời: phiên bản 4.
Đặt tham số thiết bị. Các thông số thiết bị sau đây được gửi đến chip:
0x42 // STK_SET_DEVICE
0x86 // device code
0x00 // revision
0x00 // progtype: “0” – Both Parallel/High-voltage and Serial mode
0x01 // parmode: “1” – Full parallel interface
0x01 // polling: “1” – Polling may be used
0x01 // selftimed: “1” – Self timed
0x01 // lockbytes: Number of Lock bytes.
0x03 // fusebytes: Number of Fuse bytes
0xFF // flashpollval1
0xFF // flashpollval2
0xFF // eeprompollval1
0xFF // eeprompollval2
0x00 // pagesizehigh
0x80 // pagesizelow
0x04 // eepromsizehigh
0x00 // eepromsizelow
0x00 // flashsize4
0x00 // flashsize3
0x80 // flashsize2
0x00 // flashsize1
0x20 // Sync_CRC_EOP
Optiboot bỏ qua tất cả những điều đó và trả lời bằng In Sync / OK. :)
Đặt tham số thiết bị mở rộng:
0x45 // STK_SET_DEVICE_EXT
0x05 // commandsize: how many bytes follow
0x04 // eeprompagesize: EEPROM page size in bytes.
0xD7 // signalpagel:
0xC2 // signalbs2:
0x00 // ResetDisable: Defines whether a part has RSTDSBL Fuse
0x20 // Sync_CRC_EOP
Optiboot cũng bỏ qua tất cả những thứ đó và trả lời bằng In Sync / OK.
Vào chế độ chương trình. Trả lời: Trong Sync / OK.
Đọc chữ ký. Optiboot trả lời 0x1E 0x95 0x0F
mà không thực sự đọc chữ ký .
Viết cầu chì (bốn lần). Optiboot không viết cầu chì mà chỉ trả lời trong Sync / OK.
Tải địa chỉ (ban đầu 0x0000). Địa chỉ bằng chữ (nghĩa là một từ có hai byte). Điều này đặt địa chỉ cho nơi trang dữ liệu tiếp theo sẽ được viết.
Trang chương trình (tối đa 128 byte được gửi). Optiboot trả lời "Đồng bộ hóa" ngay lập tức. Sau đó, có một khoảng dừng khoảng 4 ms trong khi nó thực sự lập trình trang. Sau đó, nó trả lời "OK".
Tải địa chỉ (hiện 0x0040). Đây là địa chỉ 64 trong số thập phân, tức là. 128 byte từ khi bắt đầu bộ nhớ chương trình.
Một trang khác được viết. Trình tự này tiếp tục cho đến khi tất cả các trang được viết.
Tải địa chỉ (trở về 0x0000). Điều này là để xác minh viết.
Trang đọc (tối đa 128 byte được đọc). Đây là để xác minh. Lưu ý rằng ngay cả khi xác minh thất bại, dữ liệu xấu đã được ghi vào chip.
Để chế độ lập trình.
"Không đồng bộ" nghĩa là gì?
Như bạn có thể thấy ở trên, mỗi bước trong chuỗi lập trình, Arduino dự kiến sẽ trả lời bằng "In Sync" (0x14), có thể theo sau là một số dữ liệu, theo sau là "OK" (0x10).
Nếu đó là "không đồng bộ", điều đó có nghĩa là avrdude không nhận được phản hồi "đồng bộ hóa". Lý do có thể là:
- Tốc độ truyền sai được sử dụng
- Cổng nối tiếp sai được chọn trong IDE
- Loại bảng sai được chọn trong IDE
- Không có bộ tải khởi động được cài đặt
- Cài đặt bộ tải khởi động sai
- Board không được cấu hình để sử dụng bộ tải khởi động (trong cầu chì)
- Một số thiết bị cắm vào chân D0 và D1 trên Arduino, gây trở ngại cho các giao tiếp nối tiếp
- Chip giao diện USB (ATmega16U2) không hoạt động đúng
- Đồng hồ sai cho bảng
- Cài đặt cầu chì sai trên Atmega328P (ví dụ: "chia đồng hồ cho 8")
- Bảng mạch / chip bị hỏng
- Cáp USB bị lỗi (một số cáp USB chỉ cung cấp năng lượng và không dành cho dữ liệu, ví dụ: cáp giá rẻ cho quạt USB)
"Đồng bộ" là gì?
Như đã đề cập ở trên, phản hồi "Đồng bộ hóa" có nghĩa là Arduino (bộ nạp khởi động) được đồng bộ hóa với chương trình tải lên.
Giao thức nào đang được sử dụng?
Giao thức là giao thức STK500 như tài liệu của Atmel. Xem các tài liệu tham khảo dưới đây.
Người giới thiệu
Lưu ý : STK500 Phiên bản 2 không được sử dụng trong Optiboot, nhưng nó được bao gồm để biết thông tin trong trường hợp bạn đang sử dụng các bảng như Mega2560.
Hằng số STK500
/* STK500 constants list, from AVRDUDE */
#define STK_OK 0x10
#define STK_FAILED 0x11 // Not used
#define STK_UNKNOWN 0x12 // Not used
#define STK_NODEVICE 0x13 // Not used
#define STK_INSYNC 0x14 // ' '
#define STK_NOSYNC 0x15 // Not used
#define ADC_CHANNEL_ERROR 0x16 // Not used
#define ADC_MEASURE_OK 0x17 // Not used
#define PWM_CHANNEL_ERROR 0x18 // Not used
#define PWM_ADJUST_OK 0x19 // Not used
#define CRC_EOP 0x20 // 'SPACE'
#define STK_GET_SYNC 0x30 // '0'
#define STK_GET_SIGN_ON 0x31 // '1'
#define STK_SET_PARAMETER 0x40 // '@'
#define STK_GET_PARAMETER 0x41 // 'A'
#define STK_SET_DEVICE 0x42 // 'B'
#define STK_SET_DEVICE_EXT 0x45 // 'E'
#define STK_ENTER_PROGMODE 0x50 // 'P'
#define STK_LEAVE_PROGMODE 0x51 // 'Q'
#define STK_CHIP_ERASE 0x52 // 'R'
#define STK_CHECK_AUTOINC 0x53 // 'S'
#define STK_LOAD_ADDRESS 0x55 // 'U'
#define STK_UNIVERSAL 0x56 // 'V'
#define STK_PROG_FLASH 0x60 // '`'
#define STK_PROG_DATA 0x61 // 'a'
#define STK_PROG_FUSE 0x62 // 'b'
#define STK_PROG_LOCK 0x63 // 'c'
#define STK_PROG_PAGE 0x64 // 'd'
#define STK_PROG_FUSE_EXT 0x65 // 'e'
#define STK_READ_FLASH 0x70 // 'p'
#define STK_READ_DATA 0x71 // 'q'
#define STK_READ_FUSE 0x72 // 'r'
#define STK_READ_LOCK 0x73 // 's'
#define STK_READ_PAGE 0x74 // 't'
#define STK_READ_SIGN 0x75 // 'u'
#define STK_READ_OSCCAL 0x76 // 'v'
#define STK_READ_FUSE_EXT 0x77 // 'w'
#define STK_READ_OSCCAL_EXT 0x78 // 'x'