背景:飞思卡尔Freescale的ARM9处理器i.MX25系列。
socketCAN对于在Linux下操作CAN总线非常的快捷方便,其配置方法和在Linux下对网卡的配置相似,方法如下:
(1) ifconfig can0 down
(2) echo 1000>> /sys/class/net/can0/tx_queue_len
(3) echo NUM1 >>/sys/device/platform/FlexCAN.1/br_presdiv
(4) echo NUM2 >>/sys/device/platform/FlexCAN.1/br_propseg
(5) echo NUM3 >>/sys/device/platform/FlexCAN.1/br_pseg1
(6) ifconfig can0 up
NUM1,2,3是三个数值,其范围如下:
0 < NUM1 <=256
0 <= NUM2<=8
0<= NUM3 <=8
公式如下:
CAN速率 = 66500000 / (br_presdiv(br_propseg +br_pseg1 + 8 + 1))
但是想将can速率降至10K,或者5K就无法完成。
降低速率的方法如下:
(1)处理器内的CAN控制器的时钟来源有两条线:
当接通PLL时,CAN的时钟为66.5MHz
当接通Xtal时,CAN的时钟为24MHz
(2)所以找到那个控制CAN时钟源的寄存器:
CTRL寄存器的第13位:
(3)去修改Linux内核去can驱动:
修改这个文件 “kernel/drivers/net/can/flexcan/dev.c”中的两个函数:
static void flex_device_default() //大概在448行
{
修改为:dev->br_clksrc = 0;
}
static void flex_update_bitrate() //大概在140行{
修改为:clk = clk_get(NULL, "osc24m");
}
截图如下:
(4)至此已经可以了,然后make uImage,make一下内核,写到板子上。
在更改了can时钟源后,can速率计算公式变为:
CAN速率 = 24000000 / (br_presdiv(br_propseg +br_pseg1 + 8 + 1))
比如像则是为5k的速率,那么分别将上面三个变量配置为240、6、5就ok了!