Я пытаюсь передать некоторые данные по шине CAN между двумя микроконтроллерами синей таблетки STM32 (STM32F103C8T6). Передаваемый массив данных состоит из данных, считанных с других устройств шины CAN, с выводов АЦП и из модуля I2C акселерометра / гироскопа. В передатчике я могу визуализировать все данные в массиве непосредственно перед передачей с использованием отладчика ST-link. Однако на приемнике я получаю все правильные данные, за исключением тех модулей модуля ускорения / гироскопа, которые становятся просто нулями.
Я пытался изменить положение данных модуля в массиве, но все равно получаю нули вэти позиции. Итак, я решил передать только данные ускорения / гироскопа, но по-прежнему получать нули;если я добавлю несколько фиктивных данных в этот массив, я получу только фиктивные данные и нули. Я также попытался изменить MCU приема и превратить массив в энергозависимый или статический, но ничего нового не произошло. Более того, я попытался обработать данные перед передачей, объединяя байты в 16-битные данные, преобразовывая их в плавающие в некоторый масштаб и, наконец, снова преобразовывая в 8-битные данные на шину CAN, но не работал.
Кодниже для чтения модуля;данные в позиции 0 просто фиктивные, чтобы знать, была ли передача успешной.
void MPU_Read(void){
uint8_t add, accel_data[6], gyro_data[6];
int i;
add = ACCEL_XOUT_H;
while(HAL_I2C_Master_Transmit(&hi2c2, 0xD0, &add, 1, 1000) != HAL_OK);
while(HAL_I2C_Master_Receive(&hi2c2, 0xD0, accel_data, 6, 1000) != HAL_OK);
add = GYRO_XOUT_H;
while(HAL_I2C_Master_Transmit(&hi2c2, 0xD0, &add, 1, 1000) != HAL_OK);
while(HAL_I2C_Master_Receive(&hi2c2, 0xD0, gyro_data, 6, 1000) != HAL_OK);
MPU_data[0] = 0xAF;
for(i=1;i<6;i++){
MPU_data[i] = accel_data[i];
}
for(i=0;i<6;i++){
MPU_data[6+i] = gyro_data[i];
}
}
Код ниже предназначен для передачи данных по шине CAN.
void Send_Tel(){
txHeader.DLC = 8;
txHeader.StdId = 0x610;
while(HAL_CAN_AddTxMessage(&hcan, &txHeader, (uint8_t*)&MPU_data[0], &txMailbox)!= HAL_OK);
txHeader.DLC = 4;
txHeader.StdId = 0x611;
while(HAL_CAN_AddTxMessage(&hcan, &txHeader, (uint8_t*)&MPU_data[8], &txMailbox)!= HAL_OK);
}
Код нижеполучать данные с шины CAN.
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan){
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, &can_rx_data[0]);
if((rxHeader.StdId & 0x0FF0) == 0x610){
switch(rxHeader.StdId){
case 0x610:
for(int j=0; j<=7; j++){
data_tel[j] = can_rx_data[j];
}
break;
case 0x611:
for(int j=0; j<=7; j++){
data_tel[j+8] = can_rx_data[j];
}
break;
}
flag_can = 0;
}
}