Da ist noch ein Schnatzer:

(uint16_t*)(i*2)+2

Du castest den int i*2 nach uint16_t*. Auf diesen Pointer addierst du 2, was nach der Semantik von C ist +2*sizeof(uint16_t), also den Pointer um 2 Einheiten worauf er zeigt, weiterzählen.

Was du wahrscheinlich meinst ist

(uint16_t*)((i*2)+2)

Erst die Addition als Skalar, und danach erst den Cast?