ラベル LPC1114FN28 の投稿を表示しています。 すべての投稿を表示
ラベル LPC1114FN28 の投稿を表示しています。 すべての投稿を表示

2014年6月19日木曜日

LPC1114FN28でUSBパケットキャプチャ



USBロースピード(LS)1.5Mbpsだけですが、LPC1114FN28でUSBパケットキャプチャをしてみました。
一年ほど前に作ったLPC1768のロースピードUSBをパケットキャプチャ(USBLowsCap)に比較してまだまだ安定していなくてCRCエラーが頻発していますが、ホストとデバイスとのパケットのやりとりはだいたいわかります。



LPC1114の16ビットカウンタタイマ(CT16B1)のキャプチャ機能(CAP0)を使ってUSBのDATA+ラインの変化をみています。
割込みを使うとぜんぜん間に合わない。最小のビット0値の時の32サイクル以内に処理が終わらない。ポーリングでキャプチャ値(CR0)を読みだしてパルス幅からビット変換します。
SYNC、PIDまではキャプチャ値から直接デコードする。ビット1値が6個連続する事はないのでビット挿入を削除する必要はありません。
それ以降のデータはキャプチャ値を保存しておいてパケットを受信完了してからデコードしています。PIDからパケットの長さがわかる時はEOPの検出には問題ないが、DATA0/DATA1の可変長の時はDATA+ライン、DATA-ラインの状態をGPIOで読み取ってEOPを判断しています。GPIOの読み取りに時間がかかって検出出来ない時があるようです。

ソースコード:
LPC1114_USBProtocolAnalyzer

(2014/6/18)
---

2014年2月8日土曜日

LPC1114FN28専用のISP書込みPythonスクリプト

LPC1114FN28専用のもPythonで作ってみました。
ターゲットのMCUのチェックとか、フラッシュROM容量のチェックは全然してないので、
他のMCUでもそのまま、或いは僅かな修正で動かすことができるでしょう。

LPC800シリーズとの違いはUUエンコードでバイナリーデータを送るところだけです。
・Write to RAMコマンドの後にUUエンコートしたテキストを送る。
・20行毎にバイナリーデータのチェックサムを送る。
・チェックサムがあっていれば OK が返ってきます。

USBシリアル変換はFRDM-KL25Zをmbedインターフェースにしてシリアル通信を使っています。
半二重通信らしくエコーの改行コードを受け取れない時があります。
LPC810の時は特に障害にならなかったので微妙な送受信のタイミングの違いがあるのかもしれません。
たぶん、USBシリアル変換の専用機なら問題ないのでしょう。

実行例:


参考:
LPC111x/LPC11C1x ユーザーマニュアル

ソースコード:

(2014/2/8)
---

2013年11月28日木曜日

LPC1114FN28とLPC812とLPC810のフラッシュアルゴリズム

例えば、mbedmicro/CMSIS-DAP/interface/target/hal/DBG_NXP/ DBG_LPC1768/target_flash.h の代わりにインクルードしてビルドする。

LPC812/LPC810の場合はセクターサイズは1Kバイト。LPC1114FN28は4Kバイト。
LPC1768/LPC1769の為にプログラムの64Kバイト以上の領域はセクターサイズ32Kバイトで書き込む。(未確認)
書き込む時にセクターを消去。target_flash_erase_chip()ではセクター番号0だけを消去。

注意:mac,safariは書き込んだプログラムを読みだして再書き込みしているようなので動かないかもしれない。(未確認)
target_flash_erase_sector()を使う書き込みは未確認。

(2013/11/28)
---

2013年9月10日火曜日

mbedのセミホスティングを使用する方法

セミホスティングを使用する方法の補足メモ。

mbedとLPC1114FN28をSWD接続する。
mbedLPC1114FN28
p21 dp12(SWDIO)
p22 dp3(SWCLK)
mbed側はDigitalInOutが設定できるピンならどれでも変更可能です。
接続例:


mbedのオンラインコンパイラでLPC1114FN28のプログラムを作成する。
SWDで文字を表示したい場合はSWDSerialクラスを使って文字を表示します。
LocalFileSystemはmbedでマウントしたディレクトリにアクセスにいきます。mbed側でディレクトリは変更可能です。
プログラム例:

#include "mbed.h"
#include "SWDSerial.h"
SWDSerial pc;
LocalFileSystem local("local");

int main()
{
    FILE* fp = fopen("/local/MBED.HTM", "r"); // SYS_OPEN
    if (fp) {
        for(int i = 0; i < 176; i++) {
            pc.putc(fgetc(fp)); // SYS_READ,SYS_WRITEC
        }
        fclose(fp); // SYS_CLOSE
    }
    exit(0); // SYS_EXIT
}

LPC1114FN28にコンパイルしたバイナリーをダウンロードします。
 不安定ですが、mbedに 1114FN28.LPC で保存すれば起動時に書き込みます。

mbedをリセットします。フラッシュ書き込み、ソフトウェアリセット、LPC1114FN28のプログラムの実行、セミホスティングの実行。
実行例:

mbedのMBED.HTMファイルを読み取って表示しています。

注意:
表示速度はUARTより非常に遅いです。
ファイルアクセスも遅いです。1バイト単位でmbedへの問い合わせが発生しています。

関連記事:
mbedでセミホスティング

(2013/9/10)
---

2013年9月5日木曜日

pyOCDのflash_lpc11u24.pyをLPC1114FN28で使う

以前、pyOCDのflash_lpc11u24.pyを使ってLPC1114FN28にフラッシュ書き込みをしようとしていたが、
eraseAllでハングアップしていた。HALTに戻らない。

RAM容量の都合でSPスタックポインタの設定が間違っていたようでした。

修正箇所:
'begin_stack' : 0x10001000,
           ↓
 'begin_stack' : 0x10001000-32,
RAMの上位32バイトをIAPが使うので避ける。


上の動作例ではpyOCDでも使えるようにCMSIS-DAPを修正して、
vid=0x0d28, pid=0x0204、DAPベンダーコマンドID_DAP_Vendor0(0x80)にboard id 1040~を返して、
LPC11U24に接続したように見せかけて、flash_lpc11u24.pyを呼び出してフラッシュ書き込みをしています。

(2013/9/5)
---

2013年8月27日火曜日

mbed LPC1114FN28とWIZ820ioでxivelyへ送信する




mbed対応でSPIが簡単に扱えるようになったのでLPC1114FN28にWIZ820ioを接続してxively(cosm,pachube)にデータを送るようにしてみました。

以前、FRDM-KL25Zのために作ったEthenetInterface互換のWIZ820ioInterfaceクラスを修正しました。
・dnsnameでstringクラスを使っていてコードサイズが大きくなり32Kバイトに収まらなかったので、必要なメンバー関数だけを実装したstringクラス互換を作りました。
・MACアドレスの取得にmbed_mac_address()を使っていたが、セミホストを呼んで止まってしまうので適当なMACアドレスを与えるようにしました。

Communicating with Xively
cosmの時にベータ版であったドメイン名ではなく直接IPアドレスに
tcpソケット接続してJSON形式のデータを送り込む方法はまだ使えるようでした。

以前の記事:
KL25ZとWIZ820ioでcosmへ送信する
FRDM-KL25ZとWIZ820ioでインターネット接続

(2013/8/27)
---