This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C123 CAN模块波特率设置问题

Other Parts Discussed in Thread: TM4C123GH6PZ

请问哪位大侠用过TM4C123 的CAN接口,它的波特率设置我看有两个函数:

CANBitTimingSet
CANBitRateSet
这两个函数都可以设置吗?

我的SysCtlClockGet()得到的时钟为20M,芯片为TM4C123GH6PZ. 期望设置的CAN波特率为800K。

如果是CANBitTimingSet,那4个数都怎么配啊,实在没找到详细的说明。

如果是CANBitRateSet ,SourceClock是写SysCtlClockGet()得到的20M还是写固定的8M?

热切期待大侠的解答,很捉急!!!

  • CANBitTimingSet寄存器计算参考Excel工具 http://www.ti.com/lit/zip/sprac35.

    http://www.ti.com/lit/an/sprac35/sprac35.pdf

  • 真是太感谢了,那这两个函数有什么区别呢?

    是不是

    CANBitRateSet (CAN0_BASE, SysCtlClockGet(), 800000);

    也能得到800k的波特率呢?

  • Bit rates最高可以设到1 Mbps,速率越高,距离越近

  • 那我这样写程序可以吗?是控制一个电机,为CAN2.0B,我对照着它的要求把MsgID填好了,不知道这个是不是这样填写。它的格式见图。

    void CanInit(void)
    {
    uint32_t RATE;

    CANInit(CAN0_BASE);
    RATE = CANBitRateSet(CAN0_BASE,SysCtlClockGet(),800000);   //RATE可以返回800000;
    //CANBitTimingSet(CAN0_BASE, &CANBitClk);
    CANEnable(CAN0_BASE);
    }


    void speed_ctrl(void)
    {
    //SPD100
    unsigned char spd100[4]={0x64,0x00,0x00,0x00};
    sMsgObjectTx.ui32MsgID = 0x05080007;
    sMsgObjectTx.ui32Flags = MSG_OBJ_NO_FLAGS; //????
    sMsgObjectTx.ui32MsgLen = 4;
    sMsgObjectTx.pui8MsgData = spd100; //100
    CANMessageSet(CAN0_BASE,1,&sMsgObjectTx,MSG_OBJ_TYPE_TX);

    SysCtlDelay(10* (TheSysClock/3000));

    sMsgObjectTx.ui32MsgID = 0x05080001;
    sMsgObjectTx.ui32Flags = MSG_OBJ_NO_FLAGS; //????
    sMsgObjectTx.ui32MsgLen = 0;
    CANMessageSet(CAN0_BASE,1,&sMsgObjectTx,MSG_OBJ_TYPE_TX);
    }

    它的格式见图:我按照要求算好了SID和EID,填入MsgID 后分别为0x05080007和0x05080001;数据长度分别为4和0,数据内容无误,

    它要求扩展桢 IDE=1; 远程发送请求 RTR = 0;替代远程请求 SRTR = 0;我把sMsgObjectTx.ui32Flags = MSG_OBJ_NO_FLAGS; 

    只是想先发两条指令下去,没有设置中断什么的。

    上面程序有什么问题吗?

  • 还有一个问题,CAN模块的时钟频率是怎么得到的,和SysCtlClockGet()是一样吗?

  • 看芯片的时钟树,没有对CAN的时钟进行单独的说明,那么CAN是挂在系统的APB总线上的,CAN的时候就是系统APB总线的时钟。