最近在工作上碰到一個奇怪的現象,就是整合的arduino板上的USB Driver(ATmega16U2)明明可以正常燒錄,接上PC也可以找的到Arduino裝置,但是在燒錄的時候卻出現:
xNo device found on COMX
最剛開始以為其他電路的問題,後來拿原廠的Arduino board交叉比對,鉤示波器來檢查16U2的石英震盪器發現到在燒錄的時候,原廠的石英震盪器的速度比整合版的速度還要快很多,所以造成燒錄的時序不同,導致在確認裝置的時候,剛好是在RESET訊號啟動的時候,所以造成此問題。
後來才想到可能是IC內部Fuse的問題,用avrdude工具將其值讀出來才發現,原來CKDIV8的設定是啟動的,將設定值修正後,整合板即可正常燒錄。
Fuse的產生可以參考:
Arduino\hardware\arduino\avr\boards.txt
如果是別種的AVR晶片可以使用:
Engbedded Atmel AVR® Fuse Calculator
可以更改表格內的選項,下方的值則會自動產生。
此外,還有一個參數是Lock bit常見的應用如下:
x-U lock:w:0x3F:m //設定 lock byte 為 0x3F (沒保護)-U lock:w:0x0F:m //設定 lock byte 為 0x0F (bootloader保護)-U lock:w:0x07:m //設定 lock byte 為 0x07 (bootloader保護,程式可更新,但無法讀取)
詳細的說明如下:
| Lock Bit | Bit No |
|---|---|
| Reserve | 7 |
| Reserve | 6 |
| BLB12 | 5 |
| BLB11 | 4 |
| BLB02 | 3 |
| BLB01 | 2 |
| LB2 | 1 |
| LB1 | 0 |
| BLB12 | BLB11 | SPM寫到bootloader區 | Applcation區讀取bootloader區資料 |
|---|---|---|---|
| 1 | 1 | 沒有限制 | 沒有限制 |
| 1 | 0 | 限制 | 沒有限制 |
| 0 | 0 | 限制 | 限制 |
| 0 | 1 | 沒有限制 | 限制 |
| BLB02 | BLB01 | SPM寫到Applcation區 | bootloader區讀取Applcation區資料 |
|---|---|---|---|
| 1 | 1 | 沒有限制 | 沒有限制 |
| 1 | 0 | 限制 | 沒有限制 |
| 0 | 0 | 限制 | 限制 |
| 0 | 1 | 沒有限制 | 限制 |
| LB2 | LB1 | Fuse bit,Flash與EEPROM寫入 | Boot lock,Flash與EEPROM驗證 |
|---|---|---|---|
| 1 | 1 | 沒有鎖定限制 | 沒有鎖定限制 |
| 1 | 0 | 鎖定限制 | 沒有鎖定限制 |
| 0 | 0 | 鎖定限制 | 鎖定限制 |
| 0 | 1 | 沒有鎖定限制 | 鎖定限制 |
可以依照自己的需求對IC作設定。
