地址偏移量: 0x1C
复位值: 0x0123 0000
注: 当CAN处于初始化模式时,该寄存器只能由软件访问。
位31SILM: 静默模式(用于调试)
0: 正常状态;
1: 静默模式。
位30LBKM: 环回模式(用于调试)
0: 禁止环回模式;
1: 允许环回模式。
位29:26保留位,硬件强制为0。
位25:24SJW[1:0]: 重新同步跳跃宽度
为了重新同步,该位域定义了CAN硬件在每位中可以延长或缩短多少个时间单元的上限。
tRJW = tCAN x (SJW[1:0] + 1)。
位23保留位,硬件强制为0。
位22:20TS2[2:0]: 时间段2
该位域定义了时间段2占用了多少个时间单元
tBS2 = tCAN x (TS2[2:0] + 1)。
位19:16TS1[3:0]: 时间段1
该位域定义了时间段1占用了多少个时间单元
tBS1 = tCAN x (TS1[3:0] + 1)
位15:10保留位,硬件强制其值为0。
位9:0BRP[9:0]: 波特率分频器
该位域定义了时间单元(tq)的时间长度
tq = (BRP[9:0]+1) x tPCLK
3 如何在代码中配置波特率
配置波特率是在CAN模块初始化时配置,代码示例如下:
//CAN1 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 = ENABLE
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq//tBS1=6个tCAN时钟周期
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq//tBS2=8个tCAN时钟周期
CAN_InitStructure.CAN_Prescaler = 4//ABP总线时钟时钟4分频
//CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)
//所以这里CANbps=30000000/4/(8+6+1))=500k bps
//总体配置方向: Tseg1>=Tseg2 Tseg2>=tqTseg2>=2TSJW
if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)
{
return _ERROR
}
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE)//打开FMP0中断
总体配置保持tBS1>=tBS2 tBS2>=1个CAN时钟周期 tBS2>=2tSJW
测试can需要ip,can-utils和libsocketcan库.通过ip工具配置can,如速率,启用和禁用can等.不能用buildroot编译出来的ip,需要重新编译.
首先内核得配置上can的功能。这一点可以看一下在/dev下有没有can的节点 mpu,如果没有证明内核不支持 ; 如果内核支持的话,得先输入ifconfig can0 up,然后输入ifconfig才会有can的信息欢迎分享,转载请注明来源:内存溢出
评论列表(0条)