CAN总线在传输时使数据无效

时间:2019-10-19 22:02:26

标签: c embedded microcontroller stm32 can-bus

我正在尝试通过CAN总线在两个STM32蓝色药丸MCU(STM32F103C8T6)之间传输一些数据。要传输的数据阵列由从其他CAN总线设备,ADC引脚和加速度计/陀螺仪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;
    }
}

0 个答案:

没有答案