As one who just implemented SD Card interface on a project - here is what I would do.
1) Take a look at FatFS - It is Open Source, on the Web and quite easy to understand C code. You can take a look at how it implemented the initialization sequence. Compare this to the SD Card specifications. It will start to make sense.
2) I understand your reluctance to use the Fat File System, especially when your initial attempt did not work. I too had this idea as a backup plan if I could not get the Fat File System going. Fortunately I found the some FatFs examples that worked (see below). Just think of the interoperability and ease of use if you can examine data easily on a PC directly without some other translation software because you are storing the data on a standard File System.
With this in mind I found that the example posted here works,
Microchip uses FatFS as the basis for their SD Card driver- you can find FatFS buried in their code.
This example shows you how to setup Harmony and the other drivers properly.
Then to get this working you can copy the application code from the example application "sdcard_fat_single_disk" App.c and you will have a working example in a short period of time.
When I had this working it proved that my hardware did indeed work, but this example uses the Harmony Dynamic drivers - this would not work for me in my final application - So I found an example of FatFs using register SPI Calls.
This uses FatFS directly and uses Register based calls to do the SPI (and no interrupts). I was able to quickly understand this implementation and rewire just a few calls to use my Static SPI implementation.
This tutorial (above) does use a timer for timeouts, but it is written in such a way as to not require the timer, if you never timeout - which was a good assumption for my exact application. Your mileage may vary.
Based on these two examples I was able to get the latest version of FatFs directly from the author, make about 6 changes in his code and I was done.
Hopefully this helps you also. :-)