デジカーの回路図を描きました。
7月まとめ
メモ: M5Stack ATOM Matrix を Arduino で使う
クイックスタートにしたがって環境を設定する。
以下、ポイントをメモする。
- ライブラリマネージャで M5Atom と FastLED を追加
- ボードは ESP32 Pico Kit を選択
- Upload Speed を 115200 に落とす
メモ: TeraTermでバリナリデータの送受信
受信: デバッグモードを使う
; Display all characters (debug mode) Debug=on
- TeraTermを再起動するか、[設定] > [設定の読み込み]でTERATERM.INIを読み込む。
- [設定] > [端末] > [漢字-受信] を SJIS に設定する。
- Shift+ESPを押すごとに、通常表示→デバッグモード(※)→16進出力モード→非表示→通常表示…の順に切り替わるので、2回押して16進出力モードにする。
- 切り替わらない場合は、TeraTermを管理者権限で実行してみる。
(※) ちなみにデバッグモードでは下記のような表示になる。
- 00~1F : ^@ ~ ^_を表示
- 20~7E : 通常の文字表示
- 7F : <DEL>を表示
- 80~FF : 最上位 bit を0にして、00~7Fと同じ規則で反転文字で表示
【2020/12/01追記】CoolTermを使う
バイナリの送受信なら、TeraTermのかわりにCoolTermというシリアルターミナルソフトを使ってもよい。こちらのターミナルソフトはHEXモードを備えている。Windows版以外にLinux版やMac版もあり、Macではよく使われているらしい。
【2020/12/01追記】Serial Debug Tool 2を使う
少し古いソフトだが、Serial Debug Tool 2も組込み系界隈ではよく使われている。対話形式の通信がわかりやすく表示されて便利。Windows10では管理者での実行が必要なのが要注意。
PSoC6でFatFs
やりたいこと
PSoC6でSPI接続でSDカードにアクセスしたい。
経緯
PSoC3 や PSoC5 には emFile というコンポーネントが用意されています。emFile は、SDカードのSPIモードI/FとFATファイルシステムをカプセル化した便利なコンポーネントです。しかし、PSoC6 ではまだ emFile がサポートされていません。
そこで、おなじみの ChaNさんのFatFs を使うことにしました。
移植
FatFs の PSoC への移植として、下記のものがあります。少し古いバージョン(R0.11a, 2015年)の FatFs をベースにしていますがが、とりあえずこれを使うことにします。
ただし、これは PSoC4 と 5 には対応していますが PSoC6 には対応していません。そこで、低レベルの移植部分のソースである sdcard.c を PSoC6 用に次のように修正します。
条件コンパイルのためのマクロの定義
#include <project.h> //#include <cytypes.h> #define CY_PSOC6 1
SS(スレーブセレクト)を操作するマクロの定義
#if (CY_PSOC6) #define mmSPI_SS_Write(value) Cy_GPIO_Write(SPI_SS_PORT, SPI_SS_NUM, value) #else #define mmSPI_SS_Write(value) SPI_SS_Write(value) #endif
SPIマスターを操作するマクロの定義
#if (CY_PSOC4) (中略) #endif #if (CY_PSOC5LP) (中略) #endif #if (CY_PSOC6) #define mmSPI_SpiUartClearTxBuffer CONCATENATE(SPI_NAME, _ClearTxFifo) #define mmSPI_SpiUartClearRxBuffer CONCATENATE(SPI_NAME, _ClearRxFifo) #define mmSPI_SpiUartPutArray(a, b) CONCATENATE(SPI_NAME, _WriteArrayBlocking(a, b)) #define mmSPI_SpiUartWriteTxData(value) CONCATENATE(SPI_NAME, _Write(value)) #define mmSPI_SpiUartReadRxData CONCATENATE(SPI_NAME, _Read) #define mmSPI_IsTxComplete CONCATENATE(SPI_NAME, _IsTxComplete) #endif
バイトデータ送信関数の定義
static void xmit_mmc(const BYTE* buff, UINT bc) { #if (CY_PSOC4) (中略) #endif #if (CY_PSOC5LP) (中略) #endif #if (CY_PSOC6) mmSPI_SpiUartClearTxBuffer(); mmSPI_SpiUartClearRxBuffer(); mmSPI_SpiUartPutArray((void *)buff, bc); while(!mmSPI_IsTxComplete()); #endif }
バイトデータ受信関数の定義
static void rcvr_mmc(BYTE *buff, UINT bc) { #if (CY_PSOC4) (中略) #endif #if (CY_PSOC5LP) (中略) #endif #if (CY_PSOC6) mmSPI_SpiUartClearTxBuffer(); mmSPI_SpiUartClearRxBuffer(); do{ mmSPI_SpiUartWriteTxData(0xFF); while(!mmSPI_IsTxComplete()); CyDelayUs(M_DELAY_US); // <*> adjust, why? *buff++ = (BYTE)mmSPI_SpiUartReadRxData(); } while (--bc); #endif }