This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335x的DCAN配置与调试

Other Parts Discussed in Thread: AM3352, DRA756

目前我在公司基于am3352的硬件板上调试can功能,但是在加载DCAN驱动到内核、配置CAN管脚以及CAN初始化之后,在ifconfig中能够看到配置出来的can0和can1,但是使用移植过来的canutils无法发送和接收数据,并且发送数据的时候用示波器无法检测到波形,请各位大神赐教。

我的调试步骤如下:

1.DCAN的加载

首先在内核中选择DCAN驱动,将驱动编译进内核;

2.CAN的初始化

在board文件中添加CAN的管教初始化:

/* Module pin mux for can0 */
static struct pinmux_config d_can0_pin_mux[] = {
{"uart1_ctsn.d_can0_tx", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL},
{"uart1_rtsn.d_can0_rx", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
{NULL, 0},
};

/* Module pin mux for can1 */
static struct pinmux_config d_can1_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},
};

同时在mux33xx.c中添加uart1_ctsn和uart1_rtsn中缺少的d_can0_tx和d_can0_rx定义。

之后编写can初始化函数:

static void can_init(int evm_id, int profile)
{
setup_pin_mux(d_can0_pin_mux);
am33xx_d_can_init(0);

setup_pin_mux(d_can1_pin_mux);
am33xx_d_can_init(1);
}

然后调用该初始化函数

static struct evm_dev_cfg mkq161_dev_cfg[] = {
...
{can_init , DEV_ON_BASEBOARD, PROFILE_ALL},

...
{NULL, 0, 0},
};

3.编译内核,并烧写到硬件板上,内核启动出现了can0 和can1的配置相关信息:

Starting kernel ...

[ 0.000000] Linux version 3.2.0 (zhoujb@am335x-compiler) (gcc version 4.7.3 2
0130226 (prerelease) (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro G
CC 2013.03) ) #2 Thu Jul 21 14:39:02 CST 2016
[ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instructio
n cache
[ 0.000000] Machine: kn_mkq161
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] AM335X ES2.1 (neon )
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pag
es: 16256
[ 0.000000] Kernel command line: console=ttyO0,115200n8 root=ubi0:rootfs rw u
bi.mtd=8,2048 rootfstype=ubifs rootwait=1
[ 0.000000] PID hash table entries: 256 (order: -2, 1024 bytes)
[ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
[ 0.000000] Memory: 64MB = 64MB total
[ 0.000000] Memory: 60576k/60576k available, 4960k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xc4800000 - 0xff000000 ( 936 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc03a4000 (3696 kB)
[ 0.000000] .init : 0xc03a4000 - 0xc03d4000 ( 192 kB)
[ 0.000000] .data : 0xc03d4000 - 0xc0421928 ( 311 kB)
[ 0.000000] .bss : 0xc042194c - 0xc0440b28 ( 125 kB)
[ 0.000000] NR_IRQS:396
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrup
ts
[ 0.000000] Total of 128 interrupts on 1 active controller
[ 0.000000] OMAP clockevent source: GPTIMER2 at 24000000 Hz
[ 0.000000] omap_dm_timer_switch_src: Switching to HW default clocksource(sys
_clkin_ck) for timer1, this may impact timekeeping in low power state
[ 0.000000] OMAP clocksource: GPTIMER1 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 17895
6ms
[ 0.000000] Console: colour dummy device 80x30
[ 0.000284] Calibrating delay loop... 498.89 BogoMIPS (lpj=2494464)
[ 0.116354] pid_max: default: 32768 minimum: 301
[ 0.116525] Security Framework initialized
[ 0.116672] Mount-cache hash table entries: 512
[ 0.117244] CPU: Testing write buffer coherency: ok
[ 0.118370] devtmpfs: initialized
[ 0.140115] omap_hwmod: gfx: failed to hardreset
[ 0.156985] omap_hwmod: pruss: failed to hardreset
[ 0.158665] print_constraints: dummy:
[ 0.159212] NET: Registered protocol family 16
[ 0.162303] OMAP GPIO hardware version 0.1
[ 0.165649] omap_mux_init: Add partition: #1: core, flags: 0
[ 0.168755] omap_i2c.1: alias fck already exists
[ 0.170198] d_can.0: alias fck already exists
[ 0.170556] d_can.1: alias fck already exists
[ 0.170857] zhoujb:before sma2= 0
[ 0.170871] zhoujb:after sma2= 1
[ 0.171602] _regulator_get: l3_main.0 supply vdd_core not found, using dummy
regulator
[ 0.171738] am335x_opp_update: physical regulator not present for core(-22)
[ 0.172359] omap2_mcspi.1: alias fck already exists
[ 0.172694] omap2_mcspi.2: alias fck already exists
[ 0.174039] edma.0: alias fck already exists
[ 0.174073] edma.0: alias fck already exists
[ 0.174099] edma.0: alias fck already exists
[ 0.193679] bio: create slab <bio-0> at 0
[ 0.198439] omap_i2c omap_i2c.1: bus 1 rev2.4.0 at 100 kHz
[ 0.200975] Switching to clocksource gp timer
[ 0.227514] NET: Registered protocol family 2
[ 0.227825] IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.228248] TCP established hash table entries: 2048 (order: 2, 16384 bytes)
[ 0.228323] TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.228371] TCP: Hash tables configured (established 2048 bind 2048)
[ 0.228390] TCP reno registered
[ 0.228407] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.228443] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.228736] NET: Registered protocol family 1
[ 0.229088] NetWinder Floating Point Emulator V0.97 (double precision)
[ 0.229435] omap-gpmc omap-gpmc: GPMC revision 6.0
[ 0.229462] Registering NAND on CS0
[ 0.237224] VFS: Disk quotas dquot_6.5.2
[ 0.237314] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[ 0.237628] msgmni has been set to 118
[ 0.242462] alg: No test for stdrng (krng)
[ 0.243574] io scheduler noop registered
[ 0.243598] io scheduler deadline registered
[ 0.243685] io scheduler cfq registered (default)
[ 0.245281] omap_uart.0: ttyO0 at MMIO 0x44e09000 (irq = 72) is a OMAP UART0
[ 0.697055] console [ttyO0] enabled
[ 0.701731] omap_uart.1: ttyO1 at MMIO 0x48022000 (irq = 73) is a OMAP UART1
[ 0.709879] omap_uart.2: ttyO2 at MMIO 0x48024000 (irq = 74) is a OMAP UART2
[ 0.718061] omap_uart.3: ttyO3 at MMIO 0x481a6000 (irq = 44) is a OMAP UART3
[ 0.726166] omap_uart.4: ttyO4 at MMIO 0x481a8000 (irq = 45) is a OMAP UART4
[ 0.734295] omap_uart.5: ttyO5 at MMIO 0x481aa000 (irq = 46) is a OMAP UART5
[ 0.743205] omap4_rng omap4_rng: OMAP4 Random Number Generator ver. 2.00
[ 0.764740] brd: module loaded
[ 0.775525] loop: module loaded
[ 0.780139] mtdoops: mtd device (mtddev=name/number) must be supplied
[ 0.787854] omap2-nand driver initializing
[ 0.792601] ONFI flash detected
[ 0.796039] ONFI param page 0 valid
[ 0.799722] NAND device: Manufacturer ID: 0x2c, Chip ID: 0xda (Micron MT29F2G
08ABAEAH4)
[ 0.808519] Creating 10 MTD partitions on "omap2-nand.0":
[ 0.814254] 0x000000000000-0x000000020000 : "SPL"
[ 0.821532] 0x000000020000-0x000000040000 : "SPL.backup1"
[ 0.829232] 0x000000040000-0x000000060000 : "SPL.backup2"
[ 0.837047] 0x000000060000-0x000000080000 : "SPL.backup3"
[ 0.844828] 0x000000080000-0x000000180000 : "U-Boot"
[ 0.852376] 0x000000180000-0x0000001a0000 : "Hardware-Test Res"
[ 0.860535] 0x0000001a0000-0x0000001c0000 : "U-Boot Env"
[ 0.868167] 0x0000001c0000-0x0000006c0000 : "Kernel"
[ 0.877477] 0x0000006c0000-0x000001ac0000 : "Rootfs"
[ 0.893099] 0x000001ac0000-0x000010000000 : "UserData"
[ 0.997829] UBI: attaching mtd8 to ubi0
[ 1.001948] UBI: physical eraseblock size: 131072 bytes (128 KiB)
[ 1.008550] UBI: logical eraseblock size: 126976 bytes
[ 1.014242] UBI: smallest flash I/O unit: 2048
[ 1.019191] UBI: VID header offset: 2048 (aligned 2048)
[ 1.025525] UBI: data offset: 4096
[ 1.203668] UBI: max. sequence number: 42
[ 1.222568] UBI: attached mtd8 to ubi0
[ 1.226521] UBI: MTD device name: "Rootfs"
[ 1.231888] UBI: MTD device size: 20 MiB
[ 1.237017] UBI: number of good PEBs: 160
[ 1.241887] UBI: number of bad PEBs: 0
[ 1.246561] UBI: number of corrupted PEBs: 0
[ 1.251249] UBI: max. allowed volumes: 128
[ 1.256105] UBI: wear-leveling threshold: 4096
[ 1.261064] UBI: number of internal volumes: 1
[ 1.265742] UBI: number of user volumes: 1
[ 1.270413] UBI: available PEBs: 0
[ 1.275098] UBI: total number of reserved PEBs: 160
[ 1.280230] UBI: number of PEBs reserved for bad PEB handling: 2
[ 1.286559] UBI: max/mean erase counter: 4/1
[ 1.291065] UBI: image sequence number: 0
[ 1.295479] UBI: background thread "ubi_bgt0d" started, PID 416
[ 1.303699] vcan: Virtual CAN interface driver
[ 1.308393] CAN device driver interface
[ 1.312462] CAN bus driver for Bosch D_CAN controller 1.0
[ 1.319384] d_can d_can.0: device registered (irq=52, irq_obj=53)
[ 1.326852] d_can d_can.1: device registered (irq=55, irq_obj=56)
[ 1.381082] davinci_mdio davinci_mdio.0: davinci mdio revision 1.6
[ 1.387599] davinci_mdio davinci_mdio.0: detected phy mask fffffffd
[ 1.395054] davinci_mdio.0: probed
[ 1.398646] davinci_mdio davinci_mdio.0: phy[1]: device 0:01, driver unknown
[ 1.406830] mousedev: PS/2 mouse device common for all mice
[ 1.412740] i2c /dev entries driver
[ 1.419519] OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec
[ 1.426254] _regulator_get: deviceless supply vdd_mpu not found, using dummy
regulator
[ 1.435259] cpuidle: using governor ladder
[ 1.440265] cpuidle: using governor menu
[ 1.444716] omap4_aes_mod_init: loading AM33X AES driver
[ 1.450450] omap4-aes omap4-aes: AM33X AES hw accel rev: 3.02
[ 1.457231] omap4_aes_probe: probe() done
[ 1.461811] omap4_sham_mod_init: loading AM33X SHA/MD5 driver
[ 1.468048] omap4-sham omap4-sham: AM33X SHA/MD5 hw accel rev: 4.03
[ 1.481698] omap4_sham_probe: probe() done
[ 1.486350] oprofile: hardware counters not available
[ 1.491705] oprofile: using timer interrupt.
[ 1.496231] nf_conntrack version 0.5.0 (946 buckets, 3784 max)
[ 1.502997] ip_tables: (C) 2000-2006 Netfilter Core Team
[ 1.508767] TCP cubic registered
[ 1.512215] NET: Registered protocol family 17
[ 1.516910] can: controller area network core (rev 20090105 abi 8)
[ 1.523552] NET: Registered protocol family 29
[ 1.528296] can: raw protocol (rev 20090105)
[ 1.532811] can: broadcast manager protocol (rev 20090105 t)
[ 1.538787] 8021q: 802.1Q VLAN Support v1.8
[ 1.543240] Registering the dns_resolver key type
[ 1.548286] VFP support v0.3: implementor 41 architecture 3 part 30 variant c
rev 3
[ 1.556391] ThumbEE CPU extension supported.
[ 1.560964] mux: Failed to setup hwmod io irq -22
[ 1.566956] Power Management for AM33XX family
[ 1.571962] Trying to load am335x-pm-firmware.bin (60 secs timeout)
[ 1.578682] Copied the M3 firmware to UMEM
[ 1.583121] Cortex M3 Firmware Version = 0x181
[ 1.588601] sr_init: platform driver register failed
[ 1.598939] clock: disabling unused clocks to save power
[ 1.622590] Detected MACID=84:eb:18:bf:1:a7
[ 1.628639] cpsw: Detected MACID = 84:eb:18:bf:01:a9
[ 1.702980] UBIFS: recovery needed
[ 1.850390] UBIFS: recovery completed
[ 1.854322] UBIFS: mounted UBI device 0, volume 0, name "rootfs"
[ 1.860651] UBIFS: file system size: 11427840 bytes (11160 KiB, 10 MiB, 90
LEBs)
[ 1.868637] UBIFS: journal size: 1904640 bytes (1860 KiB, 1 MiB, 15 LEB
s)
[ 1.876344] UBIFS: media format: w4/r0 (latest is w4/r0)
[ 1.882493] UBIFS: default compressor: lzo
[ 1.886804] UBIFS: reserved for root: 0 bytes (0 KiB)
[ 1.894497] VFS: Mounted root (ubifs filesystem) on device 0:13.
[ 1.902560] devtmpfs: mounted
[ 1.906225] Freeing init memory: 192K
Starting logging: OK
Starting mdev...
Initializing random number generator... done.
Starting network...
/etc/init.d/rcS: line 33: /etc/init.d/S60daemon: Permission denied

Welcome to Buildroot
mkq161 login: root

具体可见标红的位置,[ 0.170198] d_can.0: alias fck already exists 我不知道有没有影响;

4.开始调试

使用ifconfig -a可以看到can0和can1的出现

使用命令:canconfig can0 bitrate 50000 ctrlmode triple-sampling on 和canconfig can0 start,出现如下显示:

can0 bitrate: 50000, sample-point: 0.875
can0 ctrlmode: loopback[OFF], listen-only[OFF], tripple-sampling[ON],one-shot[OFF], berr-reporting[OFF]

以及

[  225.421810] d_can d_can.0: can0: setting CAN BT = 0x1c1d 

can0 state: ERROR-ACTIVE 

此时查看can0的状态ip -d -s link show can0  

出现:

can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEF
AULT qlen 10
link/can
can <TRIPLE-SAMPLING> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms
0
bitrate 50000 sample-point 0.875
tq 1250 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 0 0 0

之后通过cansend can0 -i 0x01 0x02 0x03 0x04发送can消息,使用can盒子无法检测到can数据帧,使用示波器也看不到任何变化,通过candump can0,也是无法接收到can盒子发过来的can数据帧,但是使用loopback模式是可以收发数据的。

使用示波器发现,在canconfig can0 start之后,canL和canH的电平都保持高。

请问该如何解决,已经卡了好几天了,请各位大神帮忙