最近在工作上碰到一個奇怪的現象,就是整合的arduino板上的USB Driver(ATmega16U2)明明可以正常燒錄,接上PC也可以找的到Arduino裝置,但是在燒錄的時候卻出現:
x
No 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作設定。