Hi there!
According to the following article, the transfer() function will return a value after the argument is sent over the bus. With "SPI.transfer(0);" you are sending the value zero via the bus, and what you are getting back is a zero.
Perhaps, and this may be completely wrong, is there enough time for the first transfer to complete before the next one starts? Perhaps increase the 1ms delays to 5ms and see what difference that could make.
As an additional check, add a variable to see what is returned from the "SPI.transfer(regs);" and see what that variable reads.