2014-11-25 158 views
-1

我使用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

回答

1

這是任何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

0

也許你應該啓用傳送器:它應該有一些輸入電壓(Vbat = 12V)和Vi/o,還需要啓用EN引腳。

enter image description here