I've encountered this problem today. I made two boards with new parts. The 32u4 will respond to fuse read but not to write.
I was first using avrdude 6.3 from arduino 1.8.5 (few lines removed to fit within 9000 chars)
avrdude.exe: Version 6.3, compiled on Jan 17 2017 at 12:00:53
System wide configuration file is "D:\Downloads\arduino-1.8.5\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM27
Using Programmer : stk500v1
Overriding Baud Rate : 57600
AVR Part : ATmega32U4
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 9000 9000 0x00 0x00
flash 65 6 128 0 yes 32768 128 256 4500 4500 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude.exe: Device signature = 0x1e9587 (probably m32u4)
avrdude.exe: safemode: hfuse reads as 99
avrdude.exe: safemode: efuse reads as F3
avrdude.exe: reading input file "0xff"
avrdude.exe: writing lfuse (1 bytes):
Writing | | 0% 0.00s ***failed;
Writing | ################################################## | 100% 0.07s
avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0xff:
avrdude.exe: load data lfuse data from input file 0xff:
avrdude.exe: input file 0xff contains 1 bytes
avrdude.exe: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.01s
avrdude.exe: verifying ...
avrdude.exe: verification error, first mismatch at byte 0x0000
0x5e != 0xff
avrdude.exe: verification error; content mismatch
avrdude.exe: safemode: hfuse reads as 99
avrdude.exe: safemode: efuse reads as F3
avrdude.exe: safemode: lfuse changed! Was ff, and is now 5e
Would you like this fuse to be changed back? [y/n] n
avrdude.exe: safemode: Fuses OK (E:F3, H:99, L:FF)
avrdude.exe done. Thank you.
Is there any reason for this to happen? My boards look nice, no short circuits.
I also tried 1.6.5-r5 that has avrdude.6.0.1. Writes were successful although it complained that EF reads back as CD instead of FD. I think that's just a reserved bit thing.
avrdude.exe: Version 6.0.1, compiled on Apr 15 2015 at 19:59:58
System wide configuration file is "D:\Downloads\arduino-1.6.5-r5\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM27
Using Programmer : stk500v1
Overriding Baud Rate : 57600
AVR Part : ATmega32U4
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 9000 9000 0x00 0x00
flash 65 6 128 0 yes 32768 128 256 4500 4500 0x00 0x00
Programmer Type : STK500
Description : Atmel STK500 Version 1.x firmware
Hardware Version: 2
Firmware Version: 1.18
Topcard : Unknown
Vtarget : 0.0 V
Varef : 0.0 V
Oscillator : Off
SCK period : 0.1 us
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
avrdude.exe: Device signature = 0x1e9587
avrdude.exe: safemode: lfuse reads as 5E
avrdude.exe: safemode: hfuse reads as 99
avrdude.exe: safemode: efuse reads as F3
avrdude.exe: reading input file "0xff"
avrdude.exe: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0xff:
avrdude.exe: load data lfuse data from input file 0xff:
avrdude.exe: input file 0xff contains 1 bytes
avrdude.exe: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.01s
avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lfuse verified
avrdude.exe: reading input file "0xd7"
avrdude.exe: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.02s
avrdude.exe: 1 bytes of hfuse written
avrdude.exe: verifying hfuse memory against 0xd7:
avrdude.exe: load data hfuse data from input file 0xd7:
avrdude.exe: input file 0xd7 contains 1 bytes
avrdude.exe: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.01s
avrdude.exe: verifying ...
avrdude.exe: 1 bytes of hfuse verified
avrdude.exe: reading input file "0xfd"
avrdude.exe: writing efuse (1 bytes):
Writing | | 0% 0.00s ***failed;
Writing | ################################################## | 100% 0.07s
avrdude.exe: 1 bytes of efuse written
avrdude.exe: verifying efuse memory against 0xfd:
avrdude.exe: load data efuse data from input file 0xfd:
avrdude.exe: input file 0xfd contains 1 bytes
avrdude.exe: reading on-chip efuse data:
Reading | ################################################## | 100% 0.01s
avrdude.exe: verifying ...
avrdude.exe: verification error, first mismatch at byte 0x0000
0xcd != 0xfd
avrdude.exe: verification error; content mismatch
avrdude.exe: safemode: lfuse reads as FF
avrdude.exe: safemode: hfuse reads as D7
avrdude.exe: safemode: efuse reads as CD
avrdude.exe: safemode: efuse changed! Was fd, and is now cd
Would you like this fuse to be changed back? [y/n] n
avrdude.exe: safemode: Fuses OK (H:FD, E:D7, L:FF)
avrdude.exe done. Thank you.
My programmer is an adafruit feather 328p at 3.3V. Target board is 3.3V. Measured 3.3V rail got 3.25V. I jacked up the arduinoasisp setting to 57600. Flashing code worked with no issues. I was doing another board last week but didn't encounter this issue.