请问哪位大侠用过TM4C123 的CAN接口,它的波特率设置我看有两个函数:
CANBitTimingSet
CANBitRateSet这两个函数都可以设置吗?
我的SysCtlClockGet()得到的时钟为20M,芯片为TM4C123GH6PZ. 期望设置的CAN波特率为800K。
如果是CANBitTimingSet,那4个数都怎么配啊,实在没找到详细的说明。
如果是CANBitRateSet ,SourceClock是写SysCtlClockGet()得到的20M还是写固定的8M?
热切期待大侠的解答,很捉急!!!
Butterfly:
CANBitTimingSet寄存器计算参考Excel工具 http://www.ti.com/lit/zip/sprac35.
http://www.ti.com/lit/an/sprac35/sprac35.pdf
user3763629:
回复 Butterfly:
真是太感谢了,那这两个函数有什么区别呢?
是不是
CANBitRateSet (CAN0_BASE, SysCtlClockGet(), 800000);
也能得到800k的波特率呢?
Butterfly:
回复 user3763629:
Bit rates最高可以设到1 Mbps,速率越高,距离越近
user3763629:
回复 Butterfly:
那我这样写程序可以吗?是控制一个电机,为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;
只是想先发两条指令下去,没有设置中断什么的。
上面程序有什么问题吗?
user3763629:
回复 Butterfly:
还有一个问题,CAN模块的时钟频率是怎么得到的,和SysCtlClockGet()是一样吗?
xyz549040622:
回复 user3763629:
看芯片的时钟树,没有对CAN的时钟进行单独的说明,那么CAN是挂在系统的APB总线上的,CAN的时候就是系统APB总线的时钟。
TI中文支持网

