Alt-Link

USB-UART, USB-CAN, USB-I2C, SWD/JTAG デバッガを同時に使用できる基板です

仕様

  • UART x 3, CAN 2.0B x 2, I2C, SWD/JTAD デバッガを搭載
  • UART
    • 実効 4.4Mbps 以上で通信可能
    • 2pin ピンヘッダ
  • CAN 2.0B
    • 99% 以上のバス使用率に対応
      • 一般的な USB-CAN アダプタと比べて高いパフォーマンスが得られます
    • ペイロード 0 バイトの時:最大10000フレーム以上/秒 @ 500Kbps
    • ペイロード 8 バイトの時:最大4350フレーム以上/秒 @ 500Kbps
    • 2pin ピンヘッダ, DB9 コネクタ (オス) に対応
    • 120Ω 終端抵抗の有無を設定可能
  • SWD/JTAD
    • OpenOCD, Keil MDK-ARM, IAR など CMSIS-DAP をサポートしている一般的なツールに対応
    • ARM 20pin JTAG コネクタまたはピンヘッダに対応
  • UART, CAN, SWD/JTAG デバッガはドライバ不要で利用可能
  • ホストインターフェース
    • USB Type-C
    • Full Speed USB (12Mbps)

モード

MODE x0, MODE 01, MODE 11 の3つのモードで同時に使用するデバイスを切り替えます。

UART1 は常に使用可能ですが UART3 と CAN1、UART2 と CAN2 はリソースを共有しているため切り替えて使用する必要があります。USB の接続中はモード変更できないため変更には挿抜が必要です。

インターフェース 最大速度 MODE x0 MODE 01 MODE 11
UART1 4.5Mbps
UART2 2.25Mbps
UART3 2.25Mbps
CAN1 1Mbps
CAN2 1Mbps
I2C1 400Kbps
I2C2 400Kbps
SWD/JTAG 5Mbps ※

※ ホストとの通信は最大64Kbps

購入

準備中です。少数試作段階のため最初は原価に近い形となる予定です。

各インターフェースの利用方法

UART

USB-CDC インターフェースを実装しているため Windows 10, Linux ではドライバ不要です

  • Linux

    /dev/ttyACM にデバイスが出現します。dmesg コマンドで割り当てられた番号が確認できます。

    最初の番号が UART1, 次が UART2 or CAN2, 最後が UART3 or CAN1 です。

    他に USB-UART デバイスなどを接続していなければ /dev/ttyACM0, /dev/ttyACM1, /dev/ttyACM2 が出現します。デバイスは minicom などのコマンドで利用可能です。

  • Windows

    COMポートが出現します。COMポートの番号はデバイスマネージャで確認してください。putty などのアプリで利用可能です。

CAN

SLCAN を実装しているため Windows 10, Linux ではドライバ不要で使用できます

  • Linux

    can-utils パッケージの slcand の利用を推奨します。

    インストール例

    1
    
    sudo apt install can-utils
    

    CAN デバイスの初期化例

    1
    2
    3
    4
    
    sudo slcand -o -c -s6 -S1000000 -F /dev/ttyACM1 & # 1
    sleep 1
    sudo ifconfig slcan0 up                           # 2
    sudo tc qdisc replace dev slcan0 root pfifo_fast  # 3
    
    1. 500Kbps (s6) で /dev/ttyACM1 (CAN1) をオープン
    2. SocketCAN インターフェースを有効化
    3. Traffic control を pfifo_fast に設定することで大量のデータ送信時のパケットロスを抑制

    CAN2 を同時に利用する際は /dev/ttyACM2, slcan1 に置き換えます

    CAN メッセージを受信してダンプ

    1
    
    candump slcan0
    

    CAN メッセージの送信

    1
    
    cansend slcan1 123#456789ABCDEF
    

    負荷テスト例 (ランダムデータの送信)

    1
    
    cangen slcan1 -g 0.1 -L 8 -D r -I i -p 100
    

    バス使用率の表示

    1
    
    canbusload [email protected] [email protected] -r -t -b -c -e
    
  • Windows

    python-can で SLCAN を使用することができます。高速通信には向いていないことを確認しています。

(Tips) デバイス名を固定する

udev に以下のようなルールを追加することでシンボリックリンクを張ることができます。

/etc/udev/rules.d/alt-link-can.rules
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="ttyCAN2"

KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", ENV{ID_USB_INTERFACE_NUM}=="04", SYMLINK+="ttyCAN1"

複数の Alt-Link デバイスを接続する場合は ATTRS{serial}=="51FF00000000000000000000" のようにシリアルを追加することで区別できます。ATTRS{serial} の値は実際のデバイスの値に変更してください。sudo lsusb -vvv などで取得できます。

I2C

i2c-tiny-usb を実装しています

  • Linux

    一度だけ行う作業

    udev に新しいルールを追加して Alt-Link を i2c-tiny-usb デバイスとして認識させるため、/etc/udev/rules.d/ 以下に alt-link.rules というファイルを作成しドライバをロードしてください

    /etc/udev/rules.d/alt-link.rules
    SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", ATTRS{product}=="Alt-Link Board CMSIS-DAP", ATTR{bInterfaceNumber}=="07", RUN+="/sbin/modprobe i2c_tiny_usb", RUN+="/bin/sh -c 'echo 16c0 05dc >/sys/bus/usb/drivers/i2c-tiny-usb/new_id'"
    

    udev ルールをリロード

    1
    
    sudo udevadm control --reload-rules && sudo udevadm trigger 
    

    dmesg を見ると /dev/i2c-4 のように新たに認識された I2C バスを見つけることができます。

    $ dmesg | tail
    [37082.812030] i2c-tiny-usb 3-2.2:1.7: version 1.00 found at bus 003 address 036
    [37082.817091] i2c i2c-4: connected i2c-tiny-usb device
    

    i2c-tools を利用するとデバイスの検索やコマンドによるデータ送受信ができます。

    i2c-tools のインストール例

    1
    
    sudo apt install i2c-tools
    

    I2C デバイスの検索

    i2cdetect を使用すると接続されている I2C デバイスが検索できます。I2C バスの番号は環境によって異なるため以下はご自身の環境の番号を使用してください。

    /dev/i2c-4 をスキャンする例

    $ sudo i2cdetect 4
    WARNING! This program can confuse your I2C bus, cause data loss and worse!
    I will probe file /dev/i2c-4.
    I will probe address range 0x03-0x77.
    Continue? [Y/n]
        0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
    70: -- -- -- -- -- -- 76 --
    

    I2C デバイスの認識

    例として BMP280 (気圧センサー) を認識させるには以下のようにします。I2C バスが i2c-4、BMP280 のI2C アドレスが 0x76 の場合の例。

    1
    2
    
    sudo modprobe bmp280-i2c
    sudo bash -c 'echo "bmp280 0x76" > /sys/bus/i2c/devices/i2c-4/new_device'
    
    $ dmesg | tail
    [288533.484307] bmp280 4-0076: 4-0076 supply vddd not found, using dummy regulator
    [288533.484315] bmp280 4-0076: 4-0076 supply vdda not found, using dummy regulator
    [288533.501631] i2c i2c-4: new_device: Instantiated device bmp280 at 0x76
    
    $ cat /sys/bus/iio/devices/iio\:device0/in_temp_input
    33220
    $ cat /sys/bus/iio/devices/iio\:device0/in_pressure_input
    99.779167968
    

    33.22°, 997hPa という値が取れました

  • Windows

    i2c-tiny-usb を利用するためのドライバインストールを行えば利用可能だと思われますがあまり簡単に使用できないためサポートいたしません

CMSIS-DAP

USB-HID で実装しているため Windows 10, Linux ではドライバ不要で使用できます

OpenOCD での接続例 (STM32F1x がターゲットの場合)

SWD で接続

1
sudo openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg

JTAG で接続

1
sudo openocd -f interface/cmsis-dap.cfg -c "transport select jtag" -f target/stm32f1x.cfg

ベンチマーク

CAN

車載で一般的なビットレート (500Kbps) で最大限負荷をかけたときの canbusload (exact bitstuffing※) で計測した値を公開します

※ ビットスタッフィングを考慮して使用されたビット数(実際にバスを占有したビット数)を計算しています

ペイロードサイズ
payload bytes
インターフェース
interface
フレーム数
frames
利用したビット数
used bits total
ペイロードのビット数
used bits for payload
バス使用率
bus utilization
0 [email protected] 8874 434471 0 86.9%
[email protected] 8882 434885 0 87.0%
1 [email protected] 7900 450460 63200 90.1%
[email protected] 7900 450452 63200 90.1%
2 [email protected] 7597 495838 121552 99.2%
[email protected] 7599 495987 121584 99.2%
8 [email protected] 4370 499524 279680 99.9%
[email protected] 4368 499349 279552 99.9%

※ ペイロード:ランダム, アドレス:インクリメント, バス使用率は小数点2桁目を四捨五入

ペイロードサイズ
payload bytes
インターフェース
interface
フレーム数
frames
利用したビット数
used bits total
ペイロードのビット数
used bits for payload
バス使用率
bus utilization
0 [email protected] 10186 498799 0 99.8%
[email protected] 10190 498962 0 99.8%
1 [email protected] 8751 498959 70008 99.8%
[email protected] 8749 498836 69992 99.8%
2 [email protected] 7650 498952 122400 99.8%
[email protected] 7612 496499 121792 99.3%
8 [email protected] 4370 499544 279680 99.9%
[email protected] 4372 499439 279808 99.9%

※ ペイロード:ランダム, アドレス:インクリメント, バス使用率は小数点2桁目を四捨五入

インターフェースを 1つしか利用しない場合は負荷が軽いためペイロードのバイト数によらずほぼ 100% の帯域利用が達成できます。

ペイロードサイズ
payload bytes
インターフェース
interface
フレーム数
frames
利用したビット数
used bits total
ペイロードのビット数
used bits for payload
バス使用率
bus utilization
0 [email protected] 7827 383164 0 76.6%
[email protected] 7834 383589 0 76.7%
[email protected] 7102 347701 0 70.0%
[email protected] 7104 347805 0 70.0%
1 [email protected] 7374 420463 58992 84.1%
[email protected] 7380 420807 59040 84.2%
[email protected] 6660 379830 53280 76.0%
[email protected] 6659 379774 53272 76.0%
2 [email protected] 6966 454530 111456 90.9%
[email protected] 6964 454378 111424 90.9%
[email protected] 6289 410331 100624 82.1%
[email protected] 6287 410213 100592 82.0%
8 [email protected] 4359 498120 278976 99.6%
[email protected] 4359 498106 278976 99.6%
[email protected] 4359 498080 278976 99.6%
[email protected] 4360 498155 279040 99.6%

※ ペイロード:ランダム, アドレス:インクリメント, バス使用率は小数点2桁目を四捨五入

送信処理の方が負荷が高いため 2つのインターフェースで送信+送信を行うと送信+受信を行う場合よりも若干性能が落ちます。

UART

通信速度 実測 ペイロードのビット数 バス使用率
4.50 Mbps 4.440 Mbps 3.55 Mbps 98.7%
2.25 Mbps 2.235 Mbps 1.79 Mbps 99.3%
1.00 Mbps 997 Kbps 797 Kbps 99.7%
115200 bps 115130 bps 92104 bps 99.9%
9600 bps 9594 bps 7675 bps 99.9%

※ UART1 TX, RX を接続(ループバック)して全力でデータを送信した時の値。Start bit 1, Stop bit 1 のため 8 bit の情報は 10 bit で構成されます

制限

  • 高いデータレートで CAN フレームを受信中に SWD/JTAG 通信を行うとデータをドロップします。
  • 大量のデータを受信している時にアプリケーション側でデータの受信に遅れが生じるとバッファがあふれ OS の USB スケジューリングが変更され数ms程度 USB パケットの送受信が止まることがあります。デバイス側には 2KB 程度の受信バッファしか無いため、USB パケットの送受信が止まりバッファがあふれるとデータがロストします。
  • 複数のインターフェースに同時に大きな負荷をかけて USB の帯域 (12 Mbps) が足りなくなると受信バッファがあふれてデータがロストすることがあります。
  • 基本的な動作は確認していますが試作段階のためハードウェアまたはファームウェアに不具合がある可能性があります。不具合の報告は歓迎いたします。新たな不具合を発見して報告いただいた場合、希望があればデバイスの価格を無償にいたします。
  • このデバイスを使用して発生した損害については補償できません。あらかじめご了承ください。