Потом усматриваю здесь ошибку. Попытка подгадать, как биты в битовом поле располагаются и через union записать туда u16. Так делать нельза -- это гоновкод. Биты могут в шахматном порядке располагаться -- ничто не запрещает. Нужно прямо битовое поле и инициализировать тогда. Более того, тогда u16 непонятно зачем нужен. Попытка его использовать для расчёта CRC, например -- тоже ошибочная (я не уверен, что битовое поле займёт как u16...) Нужно структуру привести к uint8_t* и считать побайтно, например.