My guess would be that you are missing a necessary delay in your initialization sequence. If the display is busy when you try to send a command, that command will be ignored. If when you start your procedure, the display is in four bit mode and has just had "0000" clocked in as the first half of a command, then when you clock in "0011" the display will see the whole command as "00000011", which will cause the display to be busy for up to 1.6ms.
Incidentally, it is good if possible to wire the low-order data wires from the display in such a way that when a "0011" command is sent to the display, the whole 8 bits seen by the display will form a mode-set command which is correct for the type of display you are using. That will help avoid any display glitches when resetting a display which is already in use (periodically resetting the display is a good idea, if it can be done glitchlessly, since it will ensure that if the display somehow gets into a bad mode it will fix itself).