各位大侠:
大家好!感谢大家看我的帖子.
我有一块自己做的板子.AM3354. SDK版本为 SDK6.0.kernel版本为3.2(SDK中自带的).现在CAN是怎么弄也调不通.我的详细配置如下.
uboot(SDK自带的U-Boot 2013.01.01)中:
div_m4 = div_m4 & ~CLK_DIV_MASK;
div_m4 = div_m4 | COREPLL_M4;
writel(div_m4, &cmwkup->divm4dpllcore);
#define COREPLL_M4 10 /* CORE_CLKOUTM4 = 200 MHZ */
kernel中:
1引脚配置:
static struct pinmux_config d_can_gp_pin_mux[] = {
{"uart0_ctsn.d_can1_tx", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL},
{"uart0_rtsn.d_can1_rx", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
{NULL, 0},
};
static struct pinmux_config d_can_ia_pin_mux[] = {
{"uart0_rxd.d_can0_tx", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL},
{"uart0_txd.d_can0_rx", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
{NULL, 0},
};
这个配置和我的电路图上是一样的如下.
2.设置pinmux,并添加平台设备:
static void d_can_init(int evm_id, int profile)
{
setup_pin_mux(d_can_ia_pin_mux);
/* Instance Zero */
am33xx_d_can_init(0);
setup_pin_mux(d_can_gp_pin_mux);
/* Instance One */
am33xx_d_can_init(1);
}
3.放入初始化代码中.
static struct evm_dev_cfg gen_purp_evm_dev_cfg[] ={
…
{d_can_init, DEV_ON_BASEBOARD, PROFILE_ALL},
…
}
4.配置kernel
完全按照 进行配置.
5移植canutils工具到文件系统.. 得到 cansend candump canconfig等命令.
6.系统起机后.执行以下命令.
a. ip link set can0 type can bitrate 125000 triple-sampling on
同时,板子的can0口插上一个USBCAN-E-U.另一边USB插上电脑.并且打开测试软件.调好速度为125k.(此种方式在老的平台上(相对于AM335X平台)测试是正常的)
b.ip link set can0 up
c. ifconfig 可以看到如下信息
root@am335x-evm:~# ifconfig
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:52d.执行 ip -d -s link show can0 得到如下信息
root@am335x-evm:~# ip -d -s link show can0
root@am335x-evm:~# ip -d -s link show can0
2: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT qlen 10
link/can can <TRIPLE-SAMPLING> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
d_can: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1
clock 24000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0 0 0 0 0 0
RX: bytes packets errors dropped overrun mcast
0 0 0 0 0 0
TX: bytes packets errors dropped carrier collsns 0 0 0 2 0 0
root@am335x-evm:~#
e.执行 cansend can0 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88.
得到如下信息:
root@am335x-evm:~# cansend can0 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
interface = can0, family = 29, type = 3, proto = 1
实际上包根本没发出去.我用示波器.对地量CPU的 TXD引脚.时钟是高电平.同样,用CAN测试软件给板子发.也是发送失败.
f.再打开回环测试功能.再进行发包.有发有收.正常
麻烦大家给点意见.在下感激不尽.谢谢
昨夜无眠:
对于pin的mux.在linux内核中使用 devmem2 命令一 一查看过,没有发现什么问题.
dengwenwu:
回复 昨夜无眠:
您好,我现在遇到的问题和您相似;请问您是如何解决的?
yongqing wang:
回复 dengwenwu:
你使用的是啥板子
昨夜无眠:
回复 dengwenwu:
我的是因为光耦那里有个3.3V的电压没有给进来,所以不通,其实你可以先测试一下回环,如果回环没问题,应该就是外部电路 如光耦,差分信号电路那边有问题。如果回环有问题,我估计是kernel配置有问题。
yongqing wang:
回复 昨夜无眠:
感谢分享
dengwenwu:
回复 yongqing wang:
dra756,自己做的板子,pin脚稍有不同;目前dcan1和dcan2的loopback模式都是可以的(internal loopback)
dengwenwu:
回复 昨夜无眠:
ip link … loopback on的时候是能收发的,Tx、Tx以及通过Transceiver后的收发引脚上都有信号;但正常模式下就跟您的情况一样,Rx、Tx没有信号且统计的收发包数均为0.
昨夜无眠:
回复 dengwenwu:
最终信号从CPU引脚出来后需要通过 光耦隔离和 差分电路,最终到达CAN总线..你现在一个一个量,到底 在哪里没得信号? 如果出来了.那你拿个USB转can和它通信.应该能收到才是.注意 can的配置要正确.