無線マイコンで TWELITE がありますよね。
簡単に使えるアプリ(バイナリのこと)が用意されていて、本当に簡単に無線通信が実現できます。
また、公式で配布されている SDK を使えば自分でマイコンプログラムを書くことができます。
なんか最近 Arduino 風にかけるライブラリがリリースされたみたいですねえ。逆にこれまでの TWELITE SDK は非推奨とされてしまいました。
こちらは比較的複雑ですが、予め Tick タイマーやその他コールバック関数が登録されていて多少楽に書けます。
...ですが、果たしてこれらの簡単に使えるようにラップされたライブラリに甘えてていいのでしょうか。いいはずがありません(断言)
また、こちらのサイトで既に TWELITE SDK を用いたプログラミングについて公開されていますので、今更僕がやっても新規性ありませんし。
方針
なるべく低レイヤのプログラミングをするために、メーカー供給の SDK を使います。どうやらレジスタマップ、生身のレジスタが公開されていないようなのでこれは仕方ないですね。不服ですけど。
また、macOS の クソクソ大胆な仕様変更により、FTDI チップが事実上使用不可能になっています。
ご注意:
この記事は最新 Mac 用 FTDI ドライバがリリースされる前(気付く前)に執筆した書き溜め記事です。
実際は後日公開するように、再び Mac で開発していますので今のところご了承ください。
実際、使えはするのですが起動時に刺さっているデバイスしか認識しなく、また一度抜き差しすると再認識してくれないという重大な欠点があります。
さらにさらに、D2XX ライブラリが使用不可能ということで、TWELITE マイコンの書き込みには使い物にならないので、今回ばかりは Linux での開発とさせていただきます。
参考資料
- TWELITE マイコンのデータシート
- ピン配置等のハード的な確認用。
- JN516x Integrated Peripherals API User Guide
- メーカー独自ライブラリのリファレンスです。主にこれを参考にします。
ライブラリの準備
NXP からAPI ライブラリをダウンロードできるページが見つからないので、TWELITE STAGE という SDK とツールチェインが入ったパッケージを使用します。こちらのモノワイヤレスのページから「TWELITE STAGE SDK」をダウンロード・展開してください。
中には書き込みソフト、コンパイラ、ライブラリ、サンプルプロジェクトがあります。 VScode で開発できるらしいのですが、GUI テキストエディタは宗教上の理由で使えないため、CLI で Vim を使って開発することにします。
以下はそのための準備です。
プロジェクトの準備
では早速空のプロジェクトを整備していきましょう。これがまあまあ大変。
まずはディレクトリを作成します。MWSTAGE/MWSDK/Wks_TweApps
に作成することにしましょう。名前は一からやるぞ!という意志を込めて FromScrach という名前にしました。
そのディレクトリの中に入って、以下の Makefile を作成します。
export PATH = $(shell echo $$PATH):../../../Tools/ba-elf-ba2-r36379/bin
TARGET = FromScrach.elf
ARCH = ba-elf
CC = $(ARCH)-gcc
LD = $(ARCH)-gcc
OBJCOPY = $(ARCH)-objcopy
SIZE = $(ARCH)-size
FLAGS = -march=ba2 -mcpu=jn51xx -std=gnu99
CFLAGS = $(FLAGS) -Os -Wall -fdata-sections -ffunction-sections
LDFLAGS = $(FLAGS) -Wl,--gc-sections,-u_AppColdStart,-u_AppWarmStart -TApp_Stack_Size.ld -TAppBuildMac.ld -nostartfiles
LIBDIRS = -L../../../MWSDK/ChipLib/SW4063V1416/Stack/MAC/Build -L../../../MWSDK/ChipLib/SW4063V1416/Chip/JN5164/Build -L../../../MWSDK/ChipLib/SW4063V1416/Components/Library
LIBS = -Wl,--start-group -lAppApi_JN516x -lMAC_JN516x -lTimerServer_JN516x -lTOF_JN516x -lXcv_JN516x -lAes_JN516x -lHardwareApi_JN516x -lMicroSpecific_JN516x -lBoot_JN516x -lPDM_EEPROM_JN516x_NO_RTOS -Wl,--end-group
INCLUDES = -I../../../MWSDK/ChipLib/SW4063V1416/Components/HardwareApi/Include -I../../../MWSDK/ChipLib/SW4063V1416/Components/Common/Include
DEFINES = -DJENNIC_CHIP_NAME=_JN5164
OBJS = $(subst .c,.o,$(wildcard *.c))
$(TARGET): $(OBJS)
$(LD) $(LDFLAGS) $(LIBDIRS) -o $@ $^ $(LIBS)
$(OBJCOPY) -O binary $(TARGET) $(TARGET:.elf=.bin)
$(SIZE) $(TARGET)
%.o: %.c
$(CC) $(INCLUDES) $(DEFINES) $(CFLAGS) -c -o $@ $^
clean:
$(RM) $(TARGET) $(TARGET:.elf=.bin) $(OBJS)
flash:
../../../Tools/tweprog_py/tweterm.py -p ftdi:///1 --no-term -F FromScrach.bin
はい、やたら長いですがこれで OK です。書き込みには FTDI チップを使用しました。
続いて main.c の準備をしましよう。簡単です。
#include "AppHardwareApi.h"
void AppColdStart(void) {
u32AHI_Init();
vAHI_WatchdogStop();
while(1) {
}
}
void AppWarmStart(void) {
AppColdStart();
}
AppHardwareApi.h
はインクルード必須です。
AppColdStart と AppWarmStart という関数がありますが、それぞれコールドスタート、ウォームスタート時に呼ばれる関数です。いわゆる main 関数ですね。
最初に u32AHI_Init
をしているのは、この SDK (AHI) を使うために必要、と API リファレンスに書かれています。
次にウォッチドッグタイマーを止めていますが、単に邪魔なだけです。起動時に自動的にオンになる仕様らしいので止めました。
以上で出来上がりです。make
をすれば所望のバイナリが出来上がっているはずです。
とりあえずLチカしてみる
せっかくなので動かしましょう!コードは一部抜粋ですが示しておきます。
#define LED_HIGH vAHI_DioSetOutput(1 << 18, 0)
#define LED_LOW vAHI_DioSetOutput(0, 1 << 18)
void AppColdStart(void) {
u32AHI_Init();
vAHI_WatchdogStop();
vAHI_DioSetDirection(0, 1 << 18);
while(1) {
for(volatile uint32 i = 0; i < 100000; i++);
LED_HIGH;
for(volatile uint32 i = 0; i < 100000; i++);
LED_LOW;
}
}
書き込み
書き込み方法はモノワイヤレスでアナウンスされている通りですが、念の為説明しておきます。
まずは TXD/RXD ですが、シルクで7と書かれているところがマイコン側の RXD、6と書かれているところがマイコン側の TXD になります。
あっそうそう、シルク番号の下が該当ピンなのでご注意を。
続いてブートモードのエントリーですが、シルクの I (アイ) と書かれたピンを Low にしつつ、R と書かれたリセットピンを Low に、次いでリセットを解放した上で I も解放することでエントリーします。
書き込みは上の Makefile を使う限りでは単に make flash
とすればいいだけです。書き込みが終わったらリセットを掛けます。18 番ピンに LED を接続してチカチカしていれば完了です。
〆
ということでとりあえずの環境構築でした。もともとレイヤが高すぎて敬遠していたんですがね。なんとかできるだけレイヤを下げることができました。
ということでこのマイコンもいじくるターゲットになりましたので、遊びまくろうと思います。無線は多分難しいだろうけどね。