Alt-Link マニュアル
動作モード
MODE DIPスイッチ(M0, M1)を切り替えることで同時利用可能なインターフェースを変更することができます。また、ファームウェアアップデートモードに切り替えることができます。
UART1 は常に使用可能ですが UART3 と CAN1、UART2 と CAN2 はリソースを共有しているため切り替えて使用する必要があります。USB の接続中はモード変更できないため変更にはUSBコネクタの挿抜が必要です。
インターフェース | 最大速度 | M0: OFF M1: OFF |
M0: ON M1: OFF |
M0: ON M1: ON |
M0: OFF M1: ON |
---|---|---|---|---|---|
CAN1 | 1Mbps | ○ | ○ | ||
CAN2 | 1Mbps | ○ | |||
UART1 | 4.5Mbps | ○ | ○ | ○ | |
UART2 | 2.25Mbps | ○ | ○ | ||
UART3 | 2.25Mbps | ○ | |||
I2C1 | 400Kbps | ○ | |||
I2C2 | 400Kbps | ○ | ○ | ||
SWD/JTAG | 5Mbps ※ | ○ | ○ | ○ | |
Firmware update | ○ |
※ ホストとの通信は最大64Kbps
各インターフェースの利用方法
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
- 500Kbps (s6) で /dev/ttyACM1 (CAN1) をオープン
- SocketCAN インターフェースを有効化
- 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 slcan0@500000 slcan1@500000 -r -t -b -c -e
-
Windows
python-can で SLCAN を使用することができます。高速通信には向いていないことを確認しています。
終端抵抗
CAN1 terminator, CAN2 terminator の各 DIP スイッチを ON にすると 120Ω terminator が有効になります。
Alt-Link がエンドノードの場合は有効にしないとインピーダンス不整合となり正常に通信できません。既に他のデバイスがエンドノードとして存在しており、Alt-Link が間のノードになる場合は OFF で構いませんが配線によっては終端抵抗が必要になることがあります。120Ω以外の終端抵抗を使用する場合は CANL-CANH の間に抵抗を接続してください。
(Tips) デバイス名を固定する
udev に以下のようなルールを追加することでシンボリックリンクを張ることができます。
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
などで取得できます。
udev rule は設定のロード順に注意が必要です。シンボリックリンクを張るには環境変数が設定された後、つまりファイル名の先頭を 99- にするなどして後回しにする必要があります。
UART
USB CDC-ACM インターフェースを実装しているため Windows 10 以降, Linux ではドライバ不要です
-
Linux
/dev/ttyACM* にデバイスが出現します。dmesg コマンドで割り当てられた番号が確認できます。 最初の番号が UART1, 次が UART2 or CAN2, 最後が UART3 or CAN1 です。
例: 他に USB-UART デバイスを接続しておらず /dev/ttyACM0, /dev/ttyACM1, /dev/ttyACM2 が割り当てられた場合は以下が対応表になります。
device interface /dev/ttyACM0 UART1 /dev/ttyACM1 CAN2 or UART2 /dev/ttyACM2 CAN1 or UART3 minicom などのコマンドを使用してデータの送受信が可能です。
例:115200bps で UART1 の入出力を行う
1
sudo minicom -D /dev/ttyACM0 -b 115200
-
Windows
COMポートが出現します。COMポートの番号はデバイスマネージャで確認してください。PuTTY などのソフトウェアでデータの送受信が可能です。
I2C
i2c-tiny-usb を実装しています
-
Linux
一度だけ行う作業
udev に新しいルールを追加して Alt-Link を i2c-tiny-usb デバイスとして認識させるため、/etc/udev/rules.d/ 以下に alt-link.rules というファイルを作成しドライバをロードしてください
/etc/udev/rules.d/alt-link.rulesSUBSYSTEM=="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 ff >/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 で接続
|
|
JTAG で接続
|
|
制限
- 高いデータレートで CAN フレームを受信中に SWD/JTAG 通信を行うと CAN のデータをドロップします。
- 大量のデータを受信している時にアプリケーション側でデータの受信に遅れが生じるとバッファがフルになり OS の USB スケジューリングが変更され数ms程度 USB パケットの送受信が止まることがあります。デバイス側の受信バッファは 2KB 程度であるため、USB パケットの送受信が止まりバッファがあふれるとデータがロストします。
- 複数のインターフェースに同時に大きな負荷をかけて USB の帯域 (12 Mbps) が足りなくなると受信バッファがあふれてデータがロストします。
- 動作の検証はしておりますがハードウェアまたはファームウェアに不具合がある可能性があります。不具合の報告は歓迎いたします。新たな不具合を発見して報告いただいた場合は謝礼をいたします。
- このデバイスを使用して発生した損害については補償できません。あらかじめご了承ください。