Question
Maintaining bit definition order in bitmapped structures
I am trying to use bitmapped structures to send data to an i2c DAC. I defined the fields as:
typedef enum {
mcp4726_command_code_write_volatile_dac_register = 0b000,
mcp4726_command_code_write_volatile_memory = 0b010,
mcp4726_command_code_write_all_memory = 0b011,
mcp4726_command_code_write_volatile_configuration_bits = 0b100
} mcp4726_command_code_e;
typedef enum {
mcp4726_config_ref_select_vdd = 0b00,
mcp4726_config_ref_select_vref_unbuffered = 0b10,
mcp4726_config_ref_select_vref_buffered = 0b11
} mcp4726_config_ref_select_e;
typedef enum {
mcp4726_config_power_down_select_not_powered_down = 0b00,
mcp4726_config_power_down_select_powered_down_1k = 0b01,
mcp4726_config_power_down_select_powered_down_100k = 0b10,
mcp4726_config_power_down_select_powered_down_500k = 0b11
} mcp4726_config_power_down_select_e;
typedef enum {
mcp4726_config_gain_select_1x = 0b0,
mcp4726_config_gain_select_2x = 0b1
} mcp4726_config_gain_select_e;
typedef struct {
mcp4726_command_code_e command_code : 3;
mcp4726_config_ref_select_e ref_select: 2;
mcp4726_config_power_down_select_e power_down_select: 2;
mcp4726_config_gain_select_e gain_select: 1;
unsigned data: 12;
unsigned unused: 4;
} __attribute__((packed)) mcp4726_config_t;I am then defining my i2C data as:
mcp4726_config_t data;
data.command_code = mcp4726_command_code_write_all_memory;
data.ref_select = mcp4726_config_ref_select_vdd;
data.power_down_select = mcp4726_config_power_down_select_not_powered_down;
data.gain_select = mcp4726_config_gain_select_1x;
data.data = MCP4726_CONFIG_DAC;
data.unused = 0;This should result in three bytes: [0x60, 0x00, 0x00]. What I'm actually getting, however, is [0x03, 0x00, 0x00]. Is there some other way that I can force these bitmaps to be in the order I expect?
