Skip to main content
muhammet
Associate II
May 12, 2014 5:56 PM UTC
Question

Can-Bus Error

Posted on May 12, 2014 at 19:56

The original post was too long to process during our migration. Please click on the attachment to read the original post.
    This topic has been closed for replies.

    26 replies

    muhammet
    muhammetAuthor
    Associate II
    May 13, 2014 5:19 PM UTC
    Posted on May 13, 2014 at 19:19

    Clive1 do you see any mistake my code?

    Tesla DeLorean
    Guru
    May 13, 2014 5:35 PM UTC
    Posted on May 13, 2014 at 19:35

    Clive1 do you see any mistake my code?

    Well, I'm pretty sure your APB clock is NOT 30 MHz, and the CAN baud is not 1 Mbps. Those seem like STM32F2 numbers for 120 MHz CPU, and APB1 at DIV4, not an STM32F4 at 168 MHz

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    muhammet
    muhammetAuthor
    Associate II
    May 13, 2014 5:49 PM UTC
    Posted on May 13, 2014 at 19:49

    I has STM32F4 Discovery Kit , It has a Stm32f407VG6 chip. How to configure clock and baud rate. When I read value from the beaglebone black I write 

    sudo ip link set can0 up type can bitrate 1000000 

    Tesla DeLorean
    Guru
    May 13, 2014 7:21 PM UTC
    Posted on May 13, 2014 at 21:21

    Try this, I'd perhaps have used 125 kbps

    // STM32F4 CAN1 TX Loop, requires RX Node, CPU @168MHz APB1 @42MHz - sourcer32@gmail.com
    #include ''stm32f4xx.h''
    int main(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_ClocksTypeDef RCC_Clocks;
    CAN_InitTypeDef CAN_InitStructure;
    CAN_FilterInitTypeDef CAN_FilterInitStructure;
    CanTxMsg TxMessage;
    RCC_GetClocksFreq(&RCC_Clocks);
    /* CAN GPIOs configuration **************************************************/
    /* Enable GPIO clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    /* Connect CAN pins */
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
    /* Configure CAN RX and TX pins */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    /* CAN configuration ********************************************************/
    /* Enable CAN clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    /* CAN register init */
    CAN_DeInit(CAN1);
    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+6+7 = 14, 14 * 3 = 42, 42000000 / 42 = 1000000 */
    /* CAN Baudrate = 1Mbps (CAN clocked at 42 MHz) Prescale = 3 */
    /* 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_6tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
    CAN_InitStructure.CAN_Prescaler = RCC_Clocks.PCLK1_Frequency / (14 * 1000000); // quanta by baudrate
    CAN_Init(CAN1, &CAN_InitStructure);
    /* CAN filter init */
    CAN_FilterInitStructure.CAN_FilterNumber = 0; // CAN1 [ 0..13]
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // IdMask or IdList
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 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_FilterInit(&CAN_FilterInitStructure);
    // transmit */
    TxMessage.StdId = 0x123;
    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) // Do not want to exit
    {
    volatile uint32_t i;
    static 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(CAN1, &TxMessage);
    i = 0;
    while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFFFFFF)) // Wait on Transmit
    {
    i++;
    }
    }
    }
    #ifdef USE_FULL_ASSERT
    /**
    * @brief Reports the name of the source file and the source line number
    * where the assert_param error has occurred.
    * @param file: pointer to the source file name
    * @param line: assert_param error line source number
    * @retval None
    */
    void assert_failed(uint8_t* file, uint32_t line)
    {
    /* User can add his own implementation to report the file name and line number,
    ex: printf(''Wrong parameters value: file %s on line %d
    
    '', file, line) */
    /* Infinite loop */
    while (1)
    {
    }
    }
    #endif

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    muhammet
    muhammetAuthor
    Associate II
    May 14, 2014 12:14 PM UTC
    Posted on May 14, 2014 at 14:14

    Thank you for help. When I look to oscilloscope I can not see anything. I don't know why I can not see data.

    Tesla DeLorean
    Guru
    May 14, 2014 12:33 PM UTC
    Posted on May 14, 2014 at 14:33

    PD0/1 or PB8/9?

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    muhammet
    muhammetAuthor
    Associate II
    May 14, 2014 12:39 PM UTC
    Posted on May 14, 2014 at 14:39

    PDO and PD1

    Tesla DeLorean
    Guru
    May 14, 2014 7:00 PM UTC
    Posted on May 14, 2014 at 21:00

    PD0/1 look to be clear on the STM32F4-DISCO, perhaps you can diagram your circuit for review. Check you don't have RX/TX switched.I'm using PD0/1 on an

    https://community.st.com/0D50X00009XkhqnSAB

     

    STM32F2 design with code that's materially similar to this, I have GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL, and use a different transceiver with an external enable pin.

    Edit: Fixed DEADLINK, original post from 14-May-2014

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    muhammet
    muhammetAuthor
    Associate II
    May 14, 2014 8:29 PM UTC
    Posted on May 14, 2014 at 22:29

    What do you think about the code. Are sure that code is true. Can you try or look this?

    And I use keil ide. Can I see that the data is send without using the oscilloscope.

    Tesla DeLorean
    Guru
    May 14, 2014 8:58 PM UTC
    Posted on May 14, 2014 at 22:58

    What do you think about the code. Are sure that code is true. Can you try or look this?And I use keil ide. Can I see that the data is send without using the oscilloscope.

    I think the code has a high probability for functionality, but I can't afford the time/resources to work on your project.

    When I tested and validated my CAN interface I used TWO units, one was in receive mode, the other transmit. You need something to sink/acknowledge the data, and the sense of the CANL/H pins is probably important. I used a 125 kbaud rate.

    I have another F4 board using the same transceiver you are, the schematic for that is as follows

    0690X000006057VQAQ.png
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..