My test switchport was configured with the same VLAN for both the voice and data VLAN on that port, which the phone did not like. Once we switched it to a "normal" config with the test VLAN as voice and the live data VLAN as the default access VLAN, it came right up.
My voice subnets are large enough that I was able to split them up between the existing DHCP server on the controller and add a unique range within the same subnet on the Windows DHCP server, which in turn has failover set up to a backup server. The subnets are /16, and the existing pools were the first /22 within that subnet, so I just added the next /22 as the pool for Windows DHCP. The phone will grab the offer it receives first, so now I've got some redundancy.