CAN总线确认错误

问题描述:

我使用STM32F429可以用TJA1041A如CAN Transreciver.The问题总线计划是消息没有得到承认,并随函附上我 附上进一步reference.I代码正在使用PCAN查看看 信息。我请求检查代码并告诉我是否有任何错误。CAN总线确认错误

代码: -

int main(void) 
{ 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE); 

// SystemInit(); 

    GPIO_InitTypeDef GPIO_InitDef; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 
    GPIO_InitDef.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13; 
    GPIO_InitDef.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitDef.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_Init(GPIOB, &GPIO_InitDef); 

/* Connect CAN pins to AF */ 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2); // CAN2_RX 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2); // CAN2_TX 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); 

    GPIO_InitDef.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; 
    GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT; 
    GPIO_InitDef.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL; 
    GPIO_InitDef.GPIO_Speed = GPIO_Speed_100MHz; 

    /* Connect PD5 and PD7 pins for CAN Transreceiver to enable and 
stanby */ 

GPIO_Init(GPIOD, &GPIO_InitDef); 
    GPIO_SetBits(GPIOD, GPIO_Pin_5|GPIO_Pin_7); 

    RCC_ClocksTypeDef  RCC_Clocks; 
    CAN_InitTypeDef  CAN_InitStructure; 
    CAN_FilterInitTypeDef CAN_FilterInitStructure; 

    RCC_GetClocksFreq(&RCC_Clocks); 

    CAN_DeInit(CAN2); 

    CAN_StructInit(&CAN_InitStructure); 

    /* CAN cell init */ 
    CAN_InitStructure.CAN_TTCM = DISABLE; 
    CAN_InitStructure.CAN_ABOM = DISABLE; 
    CAN_InitStructure.CAN_AWUM = DISABLE; 
    CAN_InitStructure.CAN_NART = DISABLE; 
    CAN_InitStructure.CAN_RFLM = DISABLE; 
    CAN_InitStructure.CAN_TXFP = DISABLE; 
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal ; 

    /* quanta 1+14+6 = 21, 21 * 4 = 84, 42000000/84 = 5000000 */ 
    /* CAN Baudrate = 500Kbps (CAN clocked at 42 MHz) Prescale = 4 */ 

    /* Requires a clock with integer division into APB clock */ 

    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // 1+6+7 = 14, 1+14+6 = 21, 
1+15+5 = 21 
    CAN_InitStructure.CAN_BS1 = CAN_BS1_14tq; 
    CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq; 
    CAN_InitStructure.CAN_Prescaler = 4; // quanta by baudrate - 125kbps 

    CAN_Init(CAN2, &CAN_InitStructure); 

    /* CAN filter init */ 
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // 
IdMask or IdList 
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; // 16 
or 32 

    CAN_FilterInitStructure.CAN_FilterIdHigh  = 0x0000; // Everything, 
otherwise 11-bit in top bits 
    CAN_FilterInitStructure.CAN_FilterIdLow  = 0x0000; 
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; 
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; 

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // Rx 
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; 

    //CAN_FilterInitStructure.CAN_FilterNumber = 0; // CAN1 [ 0..13] 

// CAN_FilterInit(&CAN_FilterInitStructure); 

    CAN_FilterInitStructure.CAN_FilterNumber = 14; // CAN2 [14..27] 

    CAN_FilterInit(&CAN_FilterInitStructure); 
    CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE); 

CanTxMsg TxMessage; 

    // transmit */ 
    TxMessage.StdId = 0x321; 
    TxMessage.ExtId = 0x00; 
    TxMessage.RTR = CAN_RTR_DATA; 
    TxMessage.IDE = CAN_ID_STD; 
    TxMessage.DLC = 8; 

    TxMessage.Data[0] = 0x02; 
    TxMessage.Data[1] = 0x11; 
    TxMessage.Data[2] = 0x11; 
    TxMessage.Data[3] = 0x11; 

while(1) 
    { 
    uint32_t i; 
    int j = 0; 
    uint8_t TransmitMailbox = 0; 

    TxMessage.Data[4] = (j >> 0) & 0xFF; // Cycling 
    TxMessage.Data[5] = (j >> 8) & 0xFF; 
    TxMessage.Data[6] = (j >> 16) & 0xFF; 
    TxMessage.Data[7] = (j >> 24) & 0xFF; 
    j++; 

    TransmitMailbox = CAN_Transmit(CAN2, &TxMessage); 

i = 0; 
    while((CAN_TransmitStatus(CAN2, TransmitMailbox) != CANTXOK) && (i 
!= 0xFFFF)) // Wait on Transmit 
    { 
     i++; 
     CAN2RX();// Pump RX 
    } 

    } 

} 
+0

总线上还有其他CAN节点吗?否则,难怪。 – Lundin 2014-11-25 11:58:01

+0

微控制器内部有两个节点,我只使用CAN2,因为不需要CAN1 – user2870154 2014-11-25 12:19:18

这是任何CAN总线的默认行为。总线上至少需要两个CAN控制器才能建立通信。如果只有一个节点,则只会出现错误帧。

为了进行调试,所有的CAN控制器都有一个“回送”调试功能,允许他们确认并收听他们自己的帧。如果你一个人在公车上,你必须启用它。或者,如果在同一个MCU中有两个CAN控制器,则可以启用它们并将它们连接在一起。

+0

我已经启用了微控制器的两个CAN控制器,但仍然看到PCAN视图中的“BUS HEAVY”。 – user2870154 2014-11-25 14:03:52

+0

@ user2870154它可能是任何东西,然后......更可能是软件错误(您没有总线终止?),但您的猜测与我的一样好。为了让别人回答,我们需要原理图......但由于硬件问题不在话题中,因此您需要在http://electronics.stackexchange.com/ – Lundin 2014-11-25 14:15:38

+0

上重新发布问题。我已经检查过了与硬件原理图。 – user2870154 2014-11-25 14:50:04

也许你应该启用传送器:它应该有一些输入电压(Vbat = 12V)和Vi/o,还需要启用EN引脚。

enter image description here