Шина CAN обнуляет данные при передаче - PullRequest
1 голос
/ 20 октября 2019

Я пытаюсь передать некоторые данные по шине 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;
    }
}
...