Failing to access AVR ATTiny13A with very slow clock (128kHz/128 or 128kHz/256) (avrdude: error: program enable: target doesn't answer)
Failing to access AVR ATTiny13A with very slow clock (128kHz/128 or 128kHz/256) (avrdude: error: program enable: target doesn't answer)
我正在尝试使用 USBasp 适配器 (guloprog) 和 avrdude 对 AVR ATTiny13A 进行编程。上传程序和 运行 它第一次对新的 ATTiny13A 设备工作正常,但再次重新上传失败。 avrdude 根本无法 see/access 设备。 avrdude 的行为就像设备未连接一样。
>avrdude -c usbasp -p t13 -B120 -U lfuse:r:-:b
avrdude: set SCK frequency to 8000 Hz
avrdude: error: program enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
如果我将通信速度降低到avrdude支持的最低速度
>avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b
我得到 set SCK frequency to 500 Hz
与上面相同的结果。
用示波器查看编程信号,所有信号看起来都不错,除了 MISO,它只显示 0V 和 0.2V 之间的基本通信。
我已将CKSEL 熔丝设置为11,选择内部128kHz 时钟源。在程序中,我将 CLKPR 设置为 8,将 128kHz 时钟除以 256,以获得可能的最慢时钟。 (我也将 CKDIV8 设置为 1,但这应该无关紧要。)
我把 IC 熔断了吗?我没有 HVSP 来清除保险丝。我还能做什么?
如何使用非常慢的时钟分频器设置解开 AVR
该问题是由于在程序中使用非常慢的时钟分频器设置(/128 或/256 与 128kHz 时钟)写入 CLKPR 引起的。程序启动后,编程不再起作用(不管avrdude的-B
设置)。
没有 HVSP 的解决方案(带有 pull-down 电阻):在 RESET 和 GND 之间放置一个 pull-down 电阻(10k 对我有用)。现在您可以再次访问 AVR 并编写不同的程序,将时钟分频器设置为最多 /64。
pull-down 电阻器将在 power-up 之后将 AVR 保持在复位状态,不允许程序 运行,防止设置慢时钟。为了 运行 新程序,您需要移除 pull-down 电阻器。
HVSP 的替代解决方案
如果您有 HVSP,您可以再次将 CKSEL 重置为 10 以使用 9.6 MHz 内部时钟(并可能再次将 CKDIV8 设置为 0)。这将允许您再次访问该设备。
背景
avrdude 将最慢的通信速度限制为至少 500 Hz。这是在源代码中硬编码的,请参阅 https://github.com/avrdudes/avrdude/blob/5cbc9c37fc71c424e99bdcc00bb910fd581c2676/src/usbasp.c#L903
设备的时钟频率必须至少比该速度快四倍。对于 500 Hz 的通信速度,这意味着 AVR 必须 运行 2000 Hz 或更高。这意味着与 avrdude 兼容的 128kHz 时钟的最慢 clock-divider 设置是 128kHz/64 = 2000Hz(这已经处于边缘并且可能会失败,但它对我来说效果很好)。要获得最慢的 avrdude 通信速度 (500 Hz),请使用 -B 2000
选项,例如:
avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b
有效:
avrdude: set SCK frequency to 500 Hz
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.15s
avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: reading lfuse memory:
Reading | ################################################## | 100% 0.05s
avrdude: writing output file "<stdout>"
0b1101011
avrdude: safemode: Fuses OK (E:FF, H:FF, L:6B)
avrdude done. Thank you.
上传程序会很慢,但是对于只有几条指令长的程序是可行的。
我正在尝试使用 USBasp 适配器 (guloprog) 和 avrdude 对 AVR ATTiny13A 进行编程。上传程序和 运行 它第一次对新的 ATTiny13A 设备工作正常,但再次重新上传失败。 avrdude 根本无法 see/access 设备。 avrdude 的行为就像设备未连接一样。
>avrdude -c usbasp -p t13 -B120 -U lfuse:r:-:b
avrdude: set SCK frequency to 8000 Hz
avrdude: error: program enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude done. Thank you.
如果我将通信速度降低到avrdude支持的最低速度
>avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b
我得到 set SCK frequency to 500 Hz
与上面相同的结果。
用示波器查看编程信号,所有信号看起来都不错,除了 MISO,它只显示 0V 和 0.2V 之间的基本通信。
我已将CKSEL 熔丝设置为11,选择内部128kHz 时钟源。在程序中,我将 CLKPR 设置为 8,将 128kHz 时钟除以 256,以获得可能的最慢时钟。 (我也将 CKDIV8 设置为 1,但这应该无关紧要。)
我把 IC 熔断了吗?我没有 HVSP 来清除保险丝。我还能做什么?
如何使用非常慢的时钟分频器设置解开 AVR
该问题是由于在程序中使用非常慢的时钟分频器设置(/128 或/256 与 128kHz 时钟)写入 CLKPR 引起的。程序启动后,编程不再起作用(不管avrdude的-B
设置)。
没有 HVSP 的解决方案(带有 pull-down 电阻):在 RESET 和 GND 之间放置一个 pull-down 电阻(10k 对我有用)。现在您可以再次访问 AVR 并编写不同的程序,将时钟分频器设置为最多 /64。
pull-down 电阻器将在 power-up 之后将 AVR 保持在复位状态,不允许程序 运行,防止设置慢时钟。为了 运行 新程序,您需要移除 pull-down 电阻器。
HVSP 的替代解决方案
如果您有 HVSP,您可以再次将 CKSEL 重置为 10 以使用 9.6 MHz 内部时钟(并可能再次将 CKDIV8 设置为 0)。这将允许您再次访问该设备。
背景
avrdude 将最慢的通信速度限制为至少 500 Hz。这是在源代码中硬编码的,请参阅 https://github.com/avrdudes/avrdude/blob/5cbc9c37fc71c424e99bdcc00bb910fd581c2676/src/usbasp.c#L903
设备的时钟频率必须至少比该速度快四倍。对于 500 Hz 的通信速度,这意味着 AVR 必须 运行 2000 Hz 或更高。这意味着与 avrdude 兼容的 128kHz 时钟的最慢 clock-divider 设置是 128kHz/64 = 2000Hz(这已经处于边缘并且可能会失败,但它对我来说效果很好)。要获得最慢的 avrdude 通信速度 (500 Hz),请使用 -B 2000
选项,例如:
avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b
有效:
avrdude: set SCK frequency to 500 Hz
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.15s
avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: reading lfuse memory:
Reading | ################################################## | 100% 0.05s
avrdude: writing output file "<stdout>"
0b1101011
avrdude: safemode: Fuses OK (E:FF, H:FF, L:6B)
avrdude done. Thank you.
上传程序会很慢,但是对于只有几条指令长的程序是可行的。