メモ: TeraTermでバリナリデータの送受信

送信: マクロを使う

  • [設定] > [端末] > [漢字-送信] を SJIS に設定する。
  • 例えば次のようなマクロを作成し、拡張子 ttl で保存する。
send $00$10$FF
  • [コントロール] > [マクロ] でマクロを選んで実行する。

受信: デバッグモードを使う

; 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と同じ規則で反転文字で表示

参考

eng-memo.info

【2020/12/01追記】CoolTermを使う

バイナリの送受信なら、TeraTermのかわりにCoolTermというシリアルターミナルソフトを使ってもよい。こちらのターミナルソフトはHEXモードを備えている。Windows版以外にLinux版やMac版もあり、Macではよく使われているらしい。

freeware.the-meiers.org

【2020/12/01追記】Serial Debug Tool 2を使う

少し古いソフトだが、Serial Debug Tool 2も組込み系界隈ではよく使われている。対話形式の通信がわかりやすく表示されて便利。Windows10では管理者での実行が必要なのが要注意。

www.vector.co.jp

PSoC6でFatFs

やりたいこと

PSoC6でSPI接続でSDカードにアクセスしたい。

経緯

PSoC3 や PSoC5 には emFile というコンポーネントが用意されています。emFile は、SDカードのSPIモードI/FとFATファイルシステムカプセル化した便利なコンポーネントです。しかし、PSoC6 ではまだ emFile がサポートされていません。

f:id:licheng:20200720211750p:plain

そこで、おなじみの ChaNさんのFatFs を使うことにしました。

移植

FatFs の PSoC への移植として、下記のものがあります。少し古いバージョン(R0.11a, 2015年)の FatFs をベースにしていますがが、とりあえずこれを使うことにします。

github.com

ただし、これは 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
}

使い方

  • SPI(SCB)コンポーネントの名前を「SPI」とする。
    • 「Mode」は「Master」
    • 「SCLK Mode」は「CPHA=0, CPOL=0」
    • 「Data Rate (kbps)」は 400
    • 「RX Data Width」「TX Data Width」は 8
    • 「Number of SS」は 0
  • SSはGPIOを用いる。Digital Outputコンポーネントの名前を「SPI_SS」とする。

メモ: PSoC6のUART

PSoC6のUARTは、送受信各128バイトものFIFOを持っています。
つまり、128バイト以下のコマンドの対話型通信であれば割り込みもDMAも要らないということです。

参照

PSoC 6 MCU: CY8C63x6, CY8C63x7 Architecture Technical Reference Manual」より

f:id:licheng:20200720144515p:plain:w500