有用stm32的can跟其它设备连过的朋友没有?

妖刀村正   2008-9-11 21:29 楼主
我现在使用stm32跟atm91sam7x256的can无法连起来,stm32跟stm32可以连,7x256跟7x256可以连

STM32 时钟配置(8M晶振):
        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

STM32 CAN速率配置(500k):
    CAN_InitStructure.CAN_SJW = CAN_SJW_4tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;
    CAN_InitStructure.CAN_Prescaler = 4;
    
7X256 时钟配置(18.432M晶振)
    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 2.
    // Set PLL to 96MHz (96,109MHz) and UDP Clock to 48MHz
    // PLL Startup time depends on PLL RC filter: worst case is choosen
    // UDP Clock (48,058MHz) is compliant with the Universal Serial Bus
    // Specification (+/- 0.25% for full speed)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1           |
                               (16 << 8)                     |
                               (AT91C_CKGR_MUL & (72 << 16)) |
                               (AT91C_CKGR_DIV & 14);
    // Wait for PLL stabilization
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) );
    // Wait until the master clock is established for the case we already
    // turn on the PLL
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 3.
    // Selection of Master Clock MCK equal to (Processor Clock PCK) PLL/2=48MHz
    // The PMC_MCKR register must not be programmed in a single write operation
    // (see. Product Errata Sheet)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
    // Wait until the master clock is established
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

    AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;

7X256 CAN速率配置(500k):
    //AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053255);
上面这行是照例程中的设置,但与手册中的数据不符
    
    AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053045);
    
    
目前的问题应该是两者之间速率不匹配导致无法通信,由于没有标准的can设备,不知道哪个是正确的配置,请大家帮我看看是哪的问题,谢谢!

回复评论 (8)

自己用示波器测一下,比较一下很容易找到原因的

                                 还可以用示波器同时看两个MCU的波形,然后调整软件参数使得两个波形一致。
点赞  2008-9-11 21:35

补充

7X256 CAN速率:
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN, 0x00053045);
其中: tPHS2 为6, tPHS1为5, tPRS为1, tSJW为4,CAN时钟为主频的6分频

试过其它速率也不行
点赞  2008-9-11 21:37

没有示波器啊

                                  
点赞  2008-9-11 21:37

发现一个很奇怪的现象

7X256速率配置成0x00052233居然能通信了
其中: tPHS2 为4, tPHS1为4, tPRS为3, tSJW为3,CAN时钟为主频的6分频

波特率为:48000000/6/(4+4+3+3)=571.428k

真是奇怪,难度两边的频率发生了很大的差别?晶振不准?没示波器真难调
点赞  2008-9-11 22:51

波特率计算错误

                                 你两块同样的板子用的同一个程序,所以能通信。
点赞  2008-9-12 09:24

re:有用stm32的can跟其它设备连过的朋友没有?

我用STM32的CAN 跟 LEXUS 車上的ECU用500K的速率
通信目前為止都還 OK!
也跟 SJA-1000 CAN 模組測試過都 OK
CAN BUS 終端電阻一定要接才能得到可靠的通信品質。
点赞  2008-9-12 10:16

现在两边可以通信了

zjf0000:
    是哪边计算错了?
xobd:已接120欧终端电阻

发现一个有趣现象,无意中将stm32 can速度配置成了4M(CAN最高1M,不知道是否真的是4M),两个stm32居然能通起来,但跟7x256 can就无法通了,如果都是1M就可以通信

现在发现新的ATMEL提供的库中计算7x256的函数似乎有问题
点赞  2008-9-12 13:43

ding.

                                  
点赞  2008-11-5 16:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复