Did I break my nano?

I was messing around with a couple of different stepper motor drivers, and trying different voltages. In a perfect derp moment, I forgot to switch the wires back around when I switched from 5v to 12v, so I had 12v on the 5v pin on the nano. I unplugged, things still seemed to work and I'm pretty sure I even uploaded a few more times before it stopped working.

When I plug it into USB the POW light comes on and the L light blinks very rapidly, is off for a short time, then blinks consistently a few times per second. I have tried burning the bootloader to the nano using the uno as the programmer. It said it succeeded in burning the bootloader, but I still can't upload sketches to the nano through USB.

When I try uploading through USB (COM5 and AVRISP mkII as programmer, and it shows up in device manager as "USB - SERIAL - CH340") I get this error:

Arduino: 1.8.5 (Windows 7), Board: "Arduino Nano, ATmega328P"

Sketch uses 928 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b57600 -D -Uflash:w:C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:i 

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 57600
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         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  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 2
         Firmware Version: 1.16
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex"
avrdude: writing flash (928 bytes):

Writing | ################################################## | 100% 0.30s

avrdude: 928 bytes of flash written
avrdude: verifying flash memory against C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:
avrdude: load data flash data from input file C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:
avrdude: input file C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex contains 928 bytes
avrdude: reading on-chip flash data:

Reading | #####################################An error occurred while uploading the sketch
############# | 100% 0.22s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0082
         0x0c != 0x04
avrdude: verification error; content mismatch

avrdude done.  Thank you.

Now, while writing this post and trying things, I figured out that I can program it using the uno and the programming port (I missed the "upload with programmer" option for a moment there). After successfully uploading the blink sketch via the uno, I tried again with USB and I still fail, but it takes forever and now I get this error:

Arduino: 1.8.5 (Windows 7), Board: "Arduino Nano, ATmega328P"

Sketch uses 928 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b57600 -D -Uflash:w:C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:i 

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 57600
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x12
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x12

avrdude done.  Thank you.

Problem uploading to board.  See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

I'm wondering if I toasted my CH340, it seems that way, but it's odd that it's still perfectly detected as such by windows.

I don't know the cause of the verification error in the first output. It gets reported here occasionally but I don't remember ever seeing a definite conclusion. I think it's usually recommended to try burning bootloader (see below).

I do know the cause of the second upload failure. When you do an "Upload Using Programmer" it overwrites the bootloader, which is required to do regular uploads via USB. So you always need to connect your ISP programmer (sounds like you're using and Uno as "Arduino as ISP" in this case) to the target board and do a Tools > Burn Bootloader before you can go back to doing a regular USB upload again. Since that's a possible solution to the first problem you'll be killing two birds with one stone hopefully.

Okey dokey, so I did as you suggested, reburned the bootloader to the nano via the uno, that went without issue. I then disconnected them (nothing connected to any pins on the nano), plugged the nano into USB, changed the settings to board: nano/328p, port: COM5, programmer: AVRISP mkII and clicked upload, and I get this error:

Arduino: 1.8.5 (Windows 7), Board: "Arduino Nano, ATmega328P"

Sketch uses 928 bytes (3%) of program storage space. Maximum is 30720 bytes.
Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b57600 -D -Uflash:w:C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:i 

avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : arduino
         Overriding Baud Rate          : 57600
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         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  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 2
         Firmware Version: 1.16
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex"
avrdude: writing flash (928 bytes):

Writing | ################################################## | 100% 0.30s

avrdude: 928 bytes of flash written
avrdude: verifying flash memory against C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:
avrdude: load data flash data from input file C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex:
avrdude: input file C:\Users\HALO2F~1\AppData\Local\Temp\arduino_build_756897/Blink.ino.hex contains 928 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.22s

avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0288
         0x0e != 0x06
avrdude: verification error; content mismatch

avrdude done.  Thank you.

the selected serial port 
 does not exist or your board is not connected

That has to mean that I toasted the ch340, right? Just for completeness, I unplugged that nano and plugged in a brand new one, and uploaded the blink sketch without issue, on the same USB port too.

Well, at least you got back to the first error and eliminated the bootloader as the cause of the verification error. Unfortunately I just don't know where the specific problem is that's causing this. Certainly the CH340 is one link in the chain. You could test this by using a separate USB-TTL serial adapter to do the upload (that's the purpose of the CH340). It's possible to use the Uno for this purpose, though it's a bit easier if you own a dedicated USB-TTL serial adapter board or cable.

I have both a CH340 breakout board as well as an FTDI1232 breakout. I assume I would use the programming headers on the nano for this? I've never actually used the FTDI before, I've use the CH340 to program ESP-01 modules though. I didn't see an FTDI or CH340 option in the programmer menu though.

Sweet! It's always odd to me that people use an Uno for that purpose, though it does work in a pinch.

Make the following connections:

CH340/FT232 Nano
RX TX
TX RX
VCC 5V
GND GND
DTR RST (via a 0.1 uF capacitor)

The DTR-RST connection provides the auto-reset at the start of the upload. If you don't have the capacitor or your boards don't break out the DTR pin (you can also use CTS) then you can just manually press the reset button on your Nano right when the upload starts (after compilation finishes). To be able to see when the upload starts you should turn on verbose output during upload:

  1. Select File > Preferences from the Arduino IDE menus.
  2. Check the box next to "Show verbose output during: ☐ upload".
  3. Click the OK button.

You don't need to select anything from the Tools > Programmer menu. You will be doing a standard "Upload", not an "Upload Using Programmer". The Tools > Programmer selection only matters during the "Upload Using Programmer" or "Burn Bootloader" operations. All you need to do is select the port of the adapter from the Tools > Port menu.

Thank you so much for that information. I didn't toss out the "broken" nano, so I'll give that a try once I finish this youtube video. I've never used the FTDI breakout before, so I think I'll try it with that first, but I'll end up trying it with both because I want to understand how it all works. Thank you again, I'll update with how it all works!