It was byuu's recommendation to check the vblank flag like this:
LDA $4212 : BMI CHECK_MINUS
LDA $4212 : BPL CHECK_PLUS
I think he said it was due to timing.
Also, it doesn't look like you set $2115, which controls the auto-increment of the VRAM address ($2116).
Set the highest bit of $2115 to 0 to increment after $2118 (low byte) is written or 1 to increment after $2119 (high byte).
I think you'd typically want the latter. The low 4 bits of $2115 control the increment amount, but I think for transferring tile data, I guess you'd want to leave them at 0000, which increments $2116 by 1 each time.
End result: you're most likely wanting to put lda #$80: sta $2115 somewhere before writing to $420B.
I'm just assuming the NMI routine isn't using channel 7 for DMA/HDMA and mucking with your writes.