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?
Lesezeichen