LIS331HH registers only returning zero
How would I go about verifiying the device isn't broken at a hardware level?

You are never able to completely remove the possibility that a device has a hardware fault, no matter how much testing you do (e.g. consider intermittent or subtle faults).
However in the type of situation you describe, you could:

Check that your sensor's power supply voltages, decoupling capacitors, and PCB layout match the requirements explained on its datasheet (especially if you are not using a proven, commercial breakout board for the sensor).

Use an oscilloscope to view the interface signal levels, waveform shape etc. and confirm that there are no problems there. Then...

Use an oscilloscope (or, at this stage, a logic analyser or the protocol decoding functionality built into some oscilloscopes would be better) to capture the command sequences (on whichever interface you are using for that sensor, I2C or SPI) which are sent by your current FRDM-K22F code.

Compare the command sequences sent by your current program, to those shown in the sensor's datasheet. This comparison might require expert assistance, as it may be difficult for you to confirm that your program is definitely sending the correct commands.

Also compare the different command sequences which you mentioned to each other, since you report that accesses to some registers seem to behave as expected, yet others don't.


Or:

As above, first check the power, decoupling, PCB layout etc.

As above, use an oscilloscope to confirm that there are no problems with the interface signal waveforms.

Temporarily connect your sensor to a known-working Arduino.

Use one of the existing Arduino libraries for that sensor (e.g. this one from SparkFun which uses the SPI interface) in order to get confidence in your sensor hardware itself.

Assuming your sensor does work with that Arduino code, then use an oscilloscope or logic analyser as mentioned above, to capture the command sequences when using the &quot;working&quot; Arduino and its library.

Compare the &quot;working&quot; Arduino-initiated command sequences, with those which don't &quot;work&quot; in the current FRDM-K22F code, find the differences, and then use standard debugging approaches to fix that code.


Or, if you don't have an oscilloscope or logic analyser, so you cannot collect the actual command sequences being sent on the sensor's interface:

Visually review the command sequences, especially at initialisation, used by other people's existing code (e.g. in that Arduino library which I mentioned).

Compare those sequences to the ones used in the current FRDM-K22F code.

Concentrate your investigation on differences found between those two sets.
Of course this can only help find problems which are visible in the code, and it assumes that the code written by other people is correct. This is a relatively weak troubleshooting approach compared to looking at what is really happening on the interface, as described in the earlier suggestions in the list.


That's not an exhaustive list of possible troubleshooting approaches, but hopefully they should give some ideas about what could be done in this situation.