skip to Main Content

Thank you for watching this.

I’m having difficulties with my BBB on CAN communication like for months…
I’d be really pleased if you could give me just a little help!

I’m working on CAN protocol between BBB and another CAN device.
The another device is confirmed to be working alright with CAN.
I’m using my BBB with Cloud9 platform on windows laptop,
and on the another device, it’s using CAN0.

I have set the ‘config-pin’ on BBB like below using CAN1, and I tried ‘cansend’ utility.
The bitratre value on the another device is also set to be equal.

config-pin p9.24 can
config-pin p9.26 can
ip link set can1 up type can bitrate 
cansend can1 300#AC.AB.AD.AE.75.49.AD.D1

Yet it still seems like there is no CAN packets being sent or received.
(That receiving code is written in additional info. )
Plus, I tried to catch some signal with oscilloscope machine, but I couldn’t get a thing at all.

Then, I modified some lines of uEnv.txt like below, located inside the boot folder of BBB.

###Additional custom capes
uboot_overlay_addr4=/lib/firmware/BB-CAN0-00A0.dtbo
uboot_overlay_addr5=/lib/firmware/BB-CAN1-00A0.dtbo
#uboot_overlay_addr6=/lib/firmware/<file6>.dtbo
#uboot_overlay_addr7=/lib/firmware/<file7>.dtbo
###

But CAN still does not work, and config-pin command after this uEnv.txt setting shows error like below

debian@beaglebone:/lib/firmware$ config-pin -q p9.24
ERROR: open() for /sys/devices/platform/ocp/ocp:P9_24_pinmux/state failed, No such file or directory

I truly suspect there might be something wrong with the driver or pinmux setting,
because the code did work well in other situations.

The same messages for the other overlayed pins. Actually any config-pin commands don’t work on these pins. (And of course the CAN bus is still not working)

I’m currently using the latest AM3358 Debian 10.3 (2020-04-06) SD IoT image, and packages seems to be all updated well. The image is flashed and no SD card is in.

I really appreciate you read this. Thank you!

Additional Info:

CAN receive part code


#include <linux/can.h>
#include <linux/can/raw.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>

int InitCanInterface(const char *ifname){
    int sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    fcntl(sock, F_SETFL, O_NONBLOCK);
    if (sock == -1){
        printf("Fail to create CAN socket for %s - %m n", ifname);
        return -1;
    }

    printf("Success to create CAN socket for %sn", ifname);
    struct ifreq ifr;
    strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
    int ret = ioctl(sock, SIOCGIFINDEX, &ifr);
    if (ret == -1){
        perror("Fail to get CAN interface index");
        return -1;
        }

    printf("Success to get CAN interface index: %dn", ifr.ifr_ifindex);
    struct sockaddr_can addr;
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    ret = bind(sock, (struct sockaddr*)&addr, sizeof(addr));
    if (ret == -1){
        perror("Fail to bind CAN socket -");
        return -1;
    }
    printf("Success to bind CAN socketn");
    return sock;}
    int TransmitCanFrame(const int sock, const uint32_t id, const uint8_t *data, const size_t data_len){
        struct  can_frame frame;
        frame.can_id = id & 0x1ffffff;
        frame.can_id |= (1<<31);
        memcpy(frame.data, data, data_len);
        frame.can_dlc = data_len;
        int tx_bytes = write(sock, &frame, sizeof(frame));
        if (tx_bytes == -1){
            perror("Fail to transmit CAN frame -");
            return -1;
        }
        printf("Success to transmit CAN frame - %d bytes is transmittedn", tx_bytes);
        return 0;
    }

#define CAN_FRAME_MAX_LEN 8
int ReceiveCanFrame(const int sock){
    struct can_frame frame;
    int rx_bytes = read(sock, &frame, sizeof(frame));
    if (rx_bytes < 0){
        //perror("Fail to receive CAN frame -");
        return -1;
    }

    else if (rx_bytes < (int)sizeof(struct can_frame)){
        printf("Incomplete CAN frame is received - rx_bytes: %d/n", rx_bytes);
        return -1;
    }

    else if (frame.can_dlc > CAN_FRAME_MAX_LEN){
        printf("Invalid dlc: %un", frame.can_dlc);
        return -1;
    }

    if (((frame.can_id >> 29) & 1) ==1) {
        printf("Error frame is receivedn");
    }

    else if (((frame.can_id >> 30) & 1) ==1) {
        printf("RTR frame is receivedn");
    }

    else {
        if (((frame.can_id >> 31) & 1) == 0){
            printf("11bit long std CAN frame is receivedn");
            printf("%#xn",frame.can_id);
        }

        else {
            printf("29bit long ext CAN frame is receivedn");
            printf("%#xn",frame.can_id & 0x0001fffffff );
        }
    }

    for (int ii=0; ii<8; ii++) {
        printf("0x%X ", frame.data[ii]);
    }

    printf("n");
    printf("n");
    return 0;

}

int main(){
    int sock = InitCanInterface("can0");
    if (sock < 0 ){
        return -1;
    }

    // uint8_t can_data[CAN_FRAME_MAX_LEN] = {};
    while(1) {
    //printf("hellon");
    //printf("%d",ReceiveCanFrame(sock));
    //if(ReceiveCanFrame(sock) == 0)
        //printf("No responsen");
    ReceiveCanFrame(sock);
    sleep(1);    
    }    
    return 0;
}

uname -a outputs

debian@beaglebone:/lib/firmware$ uname -a
Linux beaglebone 4.19.94-ti-r64 #1buster SMP PREEMPT Fri May 21 23:57:28 UTC 2021 armv7l GNU/Linux
debian@beaglebone:/lib/firmware$ sudo /opt/scripts/tools/version.sh
git:/opt/scripts/:[e8ae28ccc34a177e9435a0d24cdf8421e081c19a]
eeprom:[A335BNLT00C00620BBBK11BC]
model:[TI_AM335x_BeagleBone_Black]
dogtag:[BeagleBoard.org Debian Buster IoT Image 2020-04-06]
bootloader:[eMMC-(default)]:[/dev/mmcblk1]:[U-Boot SPL 2019.04-00002-g07d5700e21 (Mar 06 2020 - 11:24:55 -0600)]:[location: dd MBR]
bootloader:[eMMC-(default)]:[/dev/mmcblk1]:[U-Boot 2019.04-00002-g07d5700e21]:[location: dd MBR]
UBOOT: Booted Device-Tree:[am335x-boneblack-uboot-univ.dts]
UBOOT: Loaded Overlay:[AM335X-PRU-RPROC-4-19-TI-00A0]
UBOOT: Loaded Overlay:[BB-ADC-00A0]
UBOOT: Loaded Overlay:[BB-BONE-eMMC1-01-00A0]
UBOOT: Loaded Overlay:[BB-CAN0-00A0]
UBOOT: Loaded Overlay:[BB-CAN1-00A0]
UBOOT: Loaded Overlay:[BB-HDMI-TDA998x-00A0]
kernel:[4.19.94-ti-r64]
nodejs:[v10.24.0]
/boot/uEnv.txt Settings:
uboot_overlay_options:[enable_uboot_overlays=1]
uboot_overlay_options:[uboot_overlay_addr4=/lib/firmware/BB-CAN0-00A0.dtbo]
uboot_overlay_options:[uboot_overlay_addr5=/lib/firmware/BB-CAN1-00A0.dtbo]
uboot_overlay_options:[uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-19-TI-00A0.dtbo]
uboot_overlay_options:[enable_uboot_cape_universal=1]
pkg check: to individually upgrade run: [sudo apt install --only-upgrade <pkg>]
pkg:[bb-cape-overlays]:[4.14.20210416.0-0~buster+20210416]
pkg:[bb-customizations]:[1.20210708.0-0~buster+20210708]
pkg:[bb-usb-gadgets]:[1.20200504.0-0~buster+20200504]
pkg:[bb-wl18xx-firmware]:[1.20210520.0-0~buster+20210520]
pkg:[kmod]:[26-1]
pkg:[librobotcontrol]:[1.0.5-git20200715.0-0~buster+20200716]
pkg:[firmware-ti-connectivity]:[20190717-2rcnee1~buster+20200305]
groups:[debian : debian adm kmem dialout cdrom floppy audio dip video plugdev users systemd-journal bluetooth netdev i2c gpio pwm eqep remoteproc admin spi iio docker tisdk weston-launch xenomai cloud9ide]
cmdline:[console=ttyO0,115200n8 bone_capemgr.uboot_capemgr_enabled=1 root=/dev/mmcblk1p1 ro rootfstype=ext4 rootwait coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet]
dmesg | grep remote
[   65.289088] remoteproc remoteproc0: wkup_m3 is available
[   65.320630] remoteproc remoteproc0: powering up wkup_m3
[   65.320664] remoteproc remoteproc0: Booting fw image am335x-pm-firmware.elf, size 217148
[   65.320951] remoteproc remoteproc0: remote processor wkup_m3 is now up
[   68.227786] remoteproc remoteproc1: 4a334000.pru is available
[   68.241566] remoteproc remoteproc2: 4a338000.pru is available
dmesg | grep pru
[   68.227786] remoteproc remoteproc1: 4a334000.pru is available
[   68.227985] pru-rproc 4a334000.pru: PRU rproc node pru@4a334000 probed successfully
[   68.241566] remoteproc remoteproc2: 4a338000.pru is available
[   68.241750] pru-rproc 4a338000.pru: PRU rproc node pru@4a338000 probed successfully
dmesg | grep pinctrl-single
[    0.943044] pinctrl-single 44e10800.pinmux: 142 pins, size 568
dmesg | grep gpio-of-helper
[    0.956633] gpio-of-helper ocp:cape-universal: ready
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
END

dmesg for CAN

debian@beaglebone:/lib/firmware$ dmesg | grep can
[    1.205500] c_can_platform 481cc000.can: c_can_platform device registered (regs=3377e4b7, irq=42)
[    1.206878] c_can_platform 481d0000.can: c_can_platform device registered (regs=292aef38, irq=43)
[    1.422353] can: controller area network core (rev 20170425 abi 9)
[  992.007971] c_can_platform 481d0000.can can1: setting BTR=2701 BRPE=0000
[  992.016624] IPv6: ADDRCONF(NETDEV_UP): can1: link is not ready
[  992.017512] IPv6: ADDRCONF(NETDEV_CHANGE): can1: link becomes ready

The full uEnv.txt

debian@beaglebone:/lib/firmware$ cat /boot/uEnv.txt
#Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0

uname_r=4.19.94-ti-r64
#uuid=
#dtb=

###U-Boot Overlays###
###Documentation: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian#U-Boot_Overlays
###Master Enable
enable_uboot_overlays=1
###
###Overide capes with eeprom
#uboot_overlay_addr0=/lib/firmware/<file0>.dtbo
#uboot_overlay_addr1=/lib/firmware/<file1>.dtbo
#uboot_overlay_addr2=/lib/firmware/<file2>.dtbo
#uboot_overlay_addr3=/lib/firmware/<file3>.dtbo
###
###Additional custom capes
uboot_overlay_addr4=/lib/firmware/BB-CAN0-00A0.dtbo
uboot_overlay_addr5=/lib/firmware/BB-CAN1-00A0.dtbo
#uboot_overlay_addr6=/lib/firmware/<file6>.dtbo
#uboot_overlay_addr7=/lib/firmware/<file7>.dtbo
###
###Custom Cape
#dtb_overlay=/lib/firmware/<file8>.dtbo
###
###Disable auto loading of virtual capes (emmc/video/wireless/adc)
#disable_uboot_overlay_emmc=1
#disable_uboot_overlay_video=1
#disable_uboot_overlay_audio=1
#disable_uboot_overlay_wireless=1
#disable_uboot_overlay_adc=1
###
###PRUSS OPTIONS
###pru_rproc (4.14.x-ti kernel)
#uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-14-TI-00A0.dtbo
###pru_rproc (4.19.x-ti kernel)
uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-19-TI-00A0.dtbo
###pru_uio (4.14.x-ti, 4.19.x-ti & mainline/bone kernel)
#uboot_overlay_pru=/lib/firmware/AM335X-PRU-UIO-00A0.dtbo
###
###Cape Universal Enable
enable_uboot_cape_universal=1
###
###Debug: disable uboot autoload of Cape
#disable_uboot_overlay_addr0=1
#disable_uboot_overlay_addr1=1
#disable_uboot_overlay_addr2=1
#disable_uboot_overlay_addr3=1
###
###U-Boot fdt tweaks... (60000 = 384KB)
#uboot_fdt_buffer=0x60000
###U-Boot Overlays###

cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet

#In the event of edid real failures, uncomment this next line:
#cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet video=HDMI-A-1:1024x768@60e

##enable Generic eMMC Flasher:
##make sure, these tools are installed: dosfstools rsync
#cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh

3

Answers


  1. Chosen as BEST ANSWER

    I solved BBB CAN problem just by changing transceiver board into another one.

    Don't use cjmcu-230 CAN transceiver board. I use the one from Waveshare. https://www.waveshare.com/sn65hvd230-can-board.htm

    Both CAN transceiver board use same SN65HVD230 chip, but it seems that there is some ground pin circuit issue inside the cjmcu-230 board.

    Hope you don't waste your time if you have this issue.


  2. Some help on can or socketCAN will be found here for the BBB or other family board:

    https://www.beyondlogic.org/adding-can-to-the-beaglebone-black/
    

    Also:

    https://github.com/craigpeacock/CAN-Examples
    

    These examples are a bit older and I have noticed that the Linux Distro on the BBB, if getting it from bbb.io/latest-images , is going through an overhaul.

    For instance, I have noticed that the config-pin utility still works but that some of their overlays and DeviceTrees for the BBB peripherals are being sent into mainline, esp. for the BBAI.

    When those examples do not help you configure the, and those examples are not mine but I figured they would help, socketCAN on Linux, please reply. I am working on a simple CAN interface from those examples and while using Linux is helpful, some things like the Device Trees are in a mode of change and I think this goes along w/ config-pin too.

    For instance…

    If you go to their forum at forum.beagleboard.org, you will see some people from GSOC working on examples from config-pin utilities to PRU cores which will be helpful for people getting into the shared memory, microcontroller game.

    Here is the config-pin idea I found on their forum page:

    https://forum.beagleboard.org/t/beagle-config-logs/30174
    
    Login or Signup to reply.
  3. I have set up CAN on debian 10.3 (Buster) on beaglebone black.

    I left uEnv.txt as default and issued these commands (as root) to enable CAN:
    config-pin p9.24 can
    config-pin p9.26 can
    ip link set can1 up type can bitrate 1000000
    candump can1

    Once this is working, you can automate this setup using uEnv.txt and /etc/network/interfaces as descibed here – https://www.beyondlogic.org/adding-can-to-the-beaglebone-black/ and here – https://www.thomas-wedemeyer.de/beaglebone-canbus-python.html

    If this doesnt work, I’d suggest ensuring there is no other software or updates installed that could be messing this up – try a fresh debian install on another SD card, and ensuring the hardware – the bus driver and wiring is ok.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search