TI中文支持网
TI专业的中文技术问题搜集分享网站

AM335X can通信不能收发数据

各位大侠:

大家好!感谢大家看我的帖子.

我有一块自己做的板子.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的配置要正确.

赞(0)
未经允许不得转载:TI中文支持网 » AM335X can通信不能收发数据
分享到: 更多 (0)