CAN比特率问题?



使用原装TI 8962开发板,在8962原例程下,《CAN device FIFO mode example 》例程里修改CAN比特率,

//
// The CAN bit rate.
//
#define CAN_BITRATE             10000

问题:如果CAN_BITRATE为 80000时正常通讯没有问题,当CAN_BITRATE为 10000时无法通讯,CAN中断也没有??

  • CAN的波特率与系统时钟有一定的对应关系,改变CAN_BITRATE后应该是超出了某一范围,

    具体可以打开软件包中的源代码查看,C:\StellarisWare\driverlib\can.c

  • 楼主你好,例程里面是通过调用库函数CANBitRateSet来实现bit时间的设置的,而对一个bit时间内部prop 、phase1、phase2、swj的设置该函数里面有自己的规则,这个规则适合于绝大多数应用,有些特殊场合下还是需要客户自己设置bit内部的时间分配。楼主设置bitrate为10K的情况下调用该函数得出的bit时间内部的分配需要修改,所以建议楼主将demo程序中的调用CANBitRateSet语句注释掉,换成直接操纵寄存器来分配,给楼主一个参考:在10kbitrate下,可以设置seg2=10;seg1=6;swj=5;BRP=0x32

    这个配置应该可以,我试过了,能够在bitrate为10k的时候跑起来

  • 最近测试,我感觉CAN比特率已经配置到10K了,但是CAN收发器好像不支持10K的比特率。能否有低速率的CAN收发器

  • 观察寄存器 值:seg2=6  seg1=7 sjw=3 BRP=0X31  配置标准 CAN CLK 8000000    CAN_BITRATE             10000

  • 你是在8962的板子上跑的吗?建议先在8962的板子上跑起来。你是怎么设置bit时间的,是使用库函数,还是直接写寄存器来设置的?建议直接写寄存器,按照seg2=10;seg1=6;swj=5;BRP=0x32来试一下。

  • 使用库函数 配置的CAN比特率

  • 建议你直接操纵寄存器来设置,有些特殊场合下还是需要客户自己设置bit内部的时间分配,库函数满足不了。

    给你一段代码参考一下:

    temp = HWREG(0x40040000);

    delay();

    HWREG(0x40040000) |= (0x41|temp);

    delay();

    //HWREG(0x4004000C) = (0x04<<12)|(0x09<<8)|(0x03<<6)|(0x18);

    HWREG(0x4004000C) = (0x09<<12)|(0x05<<8)|(0x04<<6)|(0x31); //seg2=10,seg1=6,swj=5,BRP=0x32

    //HWREG(0x4004000C) = (0x07<<12)|(0x06<<8)|(0x05<<6)|(0x31);//seg2=8,seg1=7,BRP=0x32

    delay();

    HWREG(0x40040018) = 0x0;

    delay();

    HWREG(0x40040000) =  temp;

    delay();

    can_device_fifo 和can_fifo工程的都要改

  • //

       // Configure the bit rate for the CAN device, the clock rate to the CAN

       // controller is fixed at 8MHz for this class of device and the bit rate is

       // set to CAN_BITRATE.

       //

       //CANBitRateSet(CAN0_BASE, 8000000, CAN_BITRATE);

       CANBitTimingSet(CAN0_BASE,(tCANBitClkParms*) &g_sCanFactory) ;

    //*****************************************************************************

    //

    //! This structure instance contains the factory-default set of configuration

    //! parameters for S2E module.

    //

    //*****************************************************************************

    static const tCANBitClkParms g_sCanFactory =

    {

       //

       // SEG1 8-(1)=7

       //

       8,

       //

       // SEG2 7-(1)=6

       //

       7,

       //

       // SJW  8-(5)=3

       //

       8,

       //

       // BPR 03-(01)=02

       //

       0x02,

    };

    //00-3F X 01-00 500K 02-01 10K=250K 03-02 X 04-03 5K=125K 05-04 100K

    //(3F,3,7,6)-(00,8,7,8)

    //01-00 1000K

    //(00,2,3,2)

    //01-00 800K 02-01 400K 04-03 200K 0A-09 80K

    //(00,3,4,3)

    使用CANBitTimingSet(unsigned long ulBase, tCANBitClkParms *pClkParms);函数设置CAN波特率也可以跑10K

    但是有问题 10K  250K 都可以使用接收

  • 楼主的问题是不是10k可以运行,但是接收数据出问题?如果是这样,楼主可以多试试几种bit timing 的组合,并且BPR可以设置大点,使得bit timing的配置更灵活,我原来建议的bit timing的分配不知道楼主试过没有,在10k下收发都是正常的

  • 你好!谢谢你的帮助.你提供的程序可以运行在10K波特率,我自己修改为上面的配置也可以跑10K,但是同时还可以跑250K波特率,通讯都正常。不知道为什么?

  • 按照你的程序,我观察寄存器的值和我上面的程序是一样的。也可以同时跑10K与250K波特率

  • 如何判断总线忙还是空闲呢?

    如何判断can总线忙碌或者空闲?
    或者说既然是点对多点,那么假设只有点对点,两者具体通讯如何呢?
    表现在M3系列程序应注意哪些?
  • 谢谢您的帮助!还有关于如何配置CAN帧的数量问题? TI的例程给的是8*8(一次可以接收8帧,每一帧数据有8位)如何修改为 32*8 (32帧数据0