AVR High-Voltage Serial Programming Instruction Set for ATtiny13A *ATtiny13A datasheet revision.E : doc8126.pdf ------------------------------------------------------------------------------- Instruction Instruction Format(SDI/SII/SDO) Instr.1 Instr.2 Instr.3 Instr.4 Instr.5 Instr.6 Operation Remarks ------------------------------------------------------------------------------- Chip Erase SDI 0_1000_0000_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 3 until SDO goes high for the Chip Erase cycle to finish. Load "Write Flash" Command SDI 0_0001_0000_00 SII 0_0100_1100_00 SDO x_xxxx_xxxx_xx Enter Flash Programming code. Load Flash Page Buffer SDI 0_bbbb_bbbb_00 0_eeee_eeee_00 0_dddd_dddd_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0010_1100_00 0_0011_1100_00 0_0111_1101_00 0_0111_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Repeat after Instr. 1 - 5 until the entire page buffer is filled or until all data within the page is filled. See Note 1. Load Flash High Address and Program Page SDI 0_0000_000a_00 0_0000_0000_00 0_0000_0000_00 SII 0_0001_1100_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 3 until SDO goes high. Repeat Instr. 2 - 3 for each loaded Flash Page until the entire Flash or all data is programmed. Repeat Instr. 1 for a new 256 byte page. See Note 1. Load "Read Flash" Command SDI 0_0000_0010_00 SII 0_0100_1100_00 SDO x_xxxx_xxxx_xx Enter Flash Read mode. Read Flash Low and High Bytes SDI 0_bbbb_bbbb_00 0_0000_000a_00 0_0000_0000_00 0_0000_0000_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0001_1100_00 0_0110_1000_00 0_0110_1100_00 0_0111_1000_00 0_0111_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx q_qqqq_qqqx_xx x_xxxx_xxxx_xx p_pppp_pppx_xx Repeat Instr. 1, 3 - 6 for each new address. Repeat Instr. 2 for a new 256 byte page. Load "Write EEPROM" Command SDI 0_0001_0001_00 SII 0_0100_1100_00 SDO x_xxxx_xxxx_xx Enter EEPROM Programming mode. Load EEPROM Page Buffer SDI 0_00bb_bbbb_00 0_eeee_eeee_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0010_1100_00 0_0110_1101_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Repeat Instr. 1 - 4 until the entire page buffer is filled or until all data within the page is filled. See Note 2. Load EEPROM Page Buffer(*) SDI 0_00bb_bbbb_00 0_aaaa_aaaa_00 0_eeee_eeee_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0001_1100_00 0_0010_1100_00 0_0110_1101_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Repeat Instr. 1 - 5 until the entire page buffer is filled or until all data within the page is filled. Program EEPROM Page SDI 0_0000_0000_00 0_0000_0000_00 SII 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 2 until SDO goes high. Repeat Instr. 1 - 2 for each loaded EEPROM page until the entire EEPROM or all data is programmed. Write EEPROM Byte SDI 0_00bb_bbbb_00 0_eeee_eeee_00 0_0000_0000_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0010_1100_00 0_0110_1101_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Repeat Instr. 1 - 5 for each new address. Wait after Instr. 5 until SDO goes high. See Note 3. Write EEPROM Byte (*) SDI 0_00bb_bbbb_00 0_aaaa_aaaa_00 0_eeee_eeee_00 0_0000_0000_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0001_1100_00 0_0010_1100_00 0_0110_1101_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Repeat Instr. 1 - 6 for each new address. Wait after Instr. 6 until SDO goes high. Load "Read EEPROM" Command SDI 0_0000_0011_00 SII 0_0100_1100_00 SDO x_xxxx_xxxx_xx Enter EEPROM Read mode. Read EEPROM Byte SDI 0_bbbb_bbbb_00 0_aaaa_aaaa_00 0_0000_0000_00 0_0000_0000_00 SII 0_0000_1100_00 0_0001_1100_00 0_0110_1000_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx q_qqqq_qqq0_00 Repeat Instr. 1, 3 - 4 for each new address. Repeat Instr. 2 for a new 256 byte page. Write Fuse Low Bits SDI 0_0100_0000_00 0_A987_6543_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0010_1100_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 4 until SDO goes high. Write A - 3 = "0" to program the Fuse bit. Write Fuse High Bits SDI 0_0100_0000_00 0_000F_EDCB_00 0_0000_0000_00 0_0000_0000_00 (*)Instr. 2 = 0_IHGF_EDCB_00 SII 0_0100_1100_00 0_0010_1100_00 0_0111_0100_00 0_0111_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 4 until SDO goes high. Write F - B = "0" to program the Fuse bit. Write I - B = "0" to program the Fuse bit. (*) Write Fuse Extended Bits (*) SDI 0_0100_0000_00 0_0000_000J_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0010_1100_00 0_0110_0110_00 0_0110_1110_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 4 until SDO goes high. Write J = "0" to program the Fuse bit. Write Lock Bits SDI 0_0010_0000_00 0_0000_0021_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0010_1100_00 0_0110_0100_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx Wait after Instr. 4 until SDO goes high. Write 2 - 1 = "0" to program the Lock Bit. Read Fuse Low Bits SDI 0_0000_0100_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0110_1000_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx A_9876_543x_xx Reading A - 3 = "0" means the Fuse bit is programmed. Read Fuse High Bits SDI 0_0000_0100_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0111_1010_00 0_0111_1110_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxFE_DCBx_xx (*)Instr. 3 = I_HGFE_DCBx_xx Reading F - B = "0" means the fuse bit is programmed. Reading I - B = "0" means the Fuse bit is programmed. (*) Read Fuse Extended Bits(*) SDI 0_0000_0100_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0110_1010_00 0_0110_1110_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxJx_xx Reading J = "0" means the Fuse bit is programmed. Read Lock Bits SDI 0_0000_0100_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0111_1000_00 0_0111_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_x21x_xx Reading 2, 1 = "0" means the lock bit is programmed. Read Signature Bytes SDI 0_0000_1000_00 0_0000_00bb_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0000_1100_00 0_0110_1000_00 0_0110_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx q_qqqq_qqqx_xx Repeats Instr. 2 - 4 for each signature byte address. Read Calibration Byte SDI 0_0000_1000_00 0_0000_000b_00 0_0000_0000_00 0_0000_0000_00 SII 0_0100_1100_00 0_0000_1100_00 0_0111_1000_00 0_0111_1100_00 SDO x_xxxx_xxxx_xx x_xxxx_xxxx_xx x_xxxx_xxxx_xx p_pppp_pppx_xx Load "No Operation" Command SDI 0_0000_0000_00 SII 0_0100_1100_00 SDO x_xxxx_xxxx_xx ------------------------------------------------------------------------------- Note: a = address high bits, b = address low bits, d = data in high bits, e = data in low bits, p = data out high bits, q = data out low bits, x = don't care, 1 = Lock Bit1, 2 = Lock Bit2, 3 = CKSEL0 fuse, 4 = CKSEL1 fuse, 5 = SUT0 fuse, 6 = SUT1 fuse, 7 = CKDIV8 fuse, 8 = WDTON fuse, 9 = EESAVE fuse, A = SPIEN fuse, B = RSTDISBL fuse, C = BODLEVEL0 fuse, D= BODLEVEL1 fuse, E = MONEN fuse, F = SELFPRGEN fuse Note: The EEPROM is written page-wise. But only the bytes that are loaded into the page are actually written to the EEPROM. Pagewise EEPROM access is more efficient when multiple bytes are to be written to the same page. Note that auto-erase of EEPROM is not available in High-voltage Serial Programming, only in SPI Programming. ------------------------------------------------------------------------------- (*) ATtiny25/45/85 datasheet revision.N : doc2586.pdf Note: a = address high bits, b = address low bits, d = data in high bits, e = data in low bits, p = data out high bits, q = data out low bits, x = don't care, 1 = Lock Bit1, 2 = Lock Bit2, 3 = CKSEL0 Fuse, 4 = CKSEL1 Fuse, 5 = CKSEL2 Fuse, 6 = CKSEL3 Fuse, 7 = SUT0 Fuse, 8 = SUT1 Fuse, 9 = CKOUT Fuse, A = CKDIV8 Fuse, B = BODLEVEL0 Fuse, C = BODLEVEL1 Fuse, D = BODLEVEL2 Fuse, E = EESAVE Fuse, F = WDTON Fuse, G = SPIEN Fuse, H = DWEN Fuse, I = RSTDISBL Fuse, J = SELFPRGEN Fuse