Символьные константы 'a'
, 'b'
. и др c. то, что вы использовали для инициализации data_name[]
, не имеет никакого отношения к переменным с именами a
, b
, et c.
Также в этом коде:
char *array_name_pointer[7];
array_name_pointer[i] = &data_name[i];
Не ясно, каково значение i
на данный момент. Если i
находится вне диапазона от 0 до 6, доступ к этому массиву будет вне диапазона, что приведет к неопределенному поведению .
В этом коде:
if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), (uint8_t*)(&array_name_pointer), sizeof(data_name[i]), HAL_MAX_DELAY) != HAL_OK){
Массив array_name_pointer
из char *
используется в качестве буфера значений uint8_t
. Предполагая, что указатель имеет длину 4 байта, тогда, поскольку i
зацикливается от 0 до 5 включительно (завершается при i == 6
), это приведет к засорению любых значений указателя, содержащихся в array_name_pointer[0]
и array_name_pointer[1]
.
This код:
printf("%c has value %d \n\r", (data_name[i]), sub_data_reg);
sub_data_reg ++;
напечатает a = 0, b = 1, c = 2 и др. c. 0, 1 и 2 не являются данными, считанными из регистров I2 C. Это просто индексы считываемых регистров I2 C.
В этом коде:
xl = a;
xh = b;
yl = c;
yh = d;
zl = e;
zh = f;
Переменные a
, b
, et c. вероятно, никогда не были инициализированы или назначены, что приводило к предупреждениям компилятора.
Что вам, вероятно, нужно сделать, это прочитать регистры I2 C в массив uint8_t
и извлечь значения из этого массив:
uint8_t reg_vals[6];
uint8_t sub_data_reg = 0x00;
for (i = 0; i < 6; i++) {
if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), ®_vals[i], sizeof(reg_vals[i]), HAL_MAX_DELAY) != HAL_OK){
Error_Handler();
printf("Could not get raw data \n\r");
}
printf("%c has value %d \n\r", data_name[i], reg_vals[i]);
sub_data_reg ++;
}
xl = reg_vals[0];
xh = reg_vals[1];
yl = reg_vals[2];
yh = reg_vals[3];
zl = reg_vals[4];
zh = reg_vals[5];
Если устройство I2 C поддерживает чтение блока регистров с автоматически увеличенными адресами регистров, вы можете изменить приведенный выше код так, чтобы он вызывал HAL_I2C_Mem_Read
один раз вместо 6 раз:
uint8_t reg_vals[6];
uint8_t sub_data_reg = 0x00;
if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), ®_vals[0], 6 * sizeof(reg_vals[0]), HAL_MAX_DELAY) != HAL_OK){
Error_Handler();
printf("Could not get raw data \n\r");
}
sub_data_reg += 6;
for (i = 0; i < 6; i++) {
printf("%c has value %d \n\r", data_name[i], reg_vals[i]);
}
xl = reg_vals[0];
xh = reg_vals[1];
yl = reg_vals[2];
yh = reg_vals[3];
zl = reg_vals[4];
zh = reg_vals[5];