LPC810のI2C-bus ROM APIで苦労した

スレーブから受信したいとき、i2c_master_tx_rx_pollで、送信バッファにアドレスを入れ送信してから、受信するかと思いきや違うらしい。i2c_master_receive_pollの受信バッファの1番目の要素にアドレスを入れて、受信を行うと良いらしい。
d.hatena.ne.jp
ここに答えが書かれていた。
アドレスのR/Wビットが違うからだろうと思い、いろいろ試行錯誤していたが、まさか受信バッファにアドレスを入れるとは思わなかった。
ユーザーマニュアルには確かに送信バッファにアドレスを入れろと書かれていたと思うのだが…。何故、受信バッファにアドレスを入れるのか謎である。しかし、良く気がついたな。
LPC800 User manualには明らかに誤った事が書かれていた。"The slave address with the R/W bit =0 is expected in the first byte of the send buffer. After the task is finished, the slave address with the R/W bit =1 is in the first byte of the receive buffer."とあった。この通りにやっても全くうまく行かなかった。
安いし、大きさの割にはメモリが多く、高性能そうだったから選んだが、資料の間違いの多さは非常に困る。

ESP8266が不安定だったけど解決した

CH_ENを使って外部からESP8266を起動させていて、動作が不安定な場合はハードウェアユーザーガイドを参照し、RC遅延回路を追加すること

ESP-WROOM-02を使って、インターネットから加工された画像を取得して、メモリ液晶
みんなのラボのブレークアウト基板を使ってテスト中)に表示させたい。インターネットから取得するときだけ、ESP8266を起動して、それ以外の時の液晶のリフレッシュや極性反転はLPC810で行う予定。LPC810ひとつだと、ESP8266の画像取得終了を検知出来ないので、2個のLPC810を使って、ひとつは液晶の駆動、もうひとつは液晶駆動LPC810から信号を受け取って、ESP8266の起動を行い、ESP8266の終了の検知をして、液晶駆動しているLPC810を再開させることにしている。
最初は、終了の検知を出来なくてもいいやと思って、LPC810ひとつでやっていたが、いまいち不安定だった。多分、リセットを行っていないからだろうと思っていたが、違った。電源が使いかけの乾電池だったから、電圧が足りないと思い、昇圧コンバーターを通してみた。そうしたら、多少安定した気がするが、やはり数回に一回はESP8266が起動しない。オシロスコープで観察したところ、電圧降下や発振が見られた。友人にこのことを聞いてみたら、昇圧コンバーターは発振することがあるらしいことが判明した。少し高い電圧に昇圧して、シリーズレギュレーターを通したらどうだろうとアドバイスをもらい、似たようなことをやってみた。9Vの電源を元に三端子レギュレーターでESP8266とLPC810の3.3Vを得て、液晶駆動用の5Vも別の三端子レギュレーターで得てみた。しかし、ダメだった。角形な9Vの電池を使ったから、これでは電流が足りないのかなと思って、単三電池6本の電池ケースを発注したり、9Vからシリーズレギュレーターで3.3Vを得るのは効率が悪すぎるので、DC/DCコンバータも発注してみた。いろいろ合わせて1万円弱を秋月に発注してしまった。発注したものは、ほとんど使わないで放置することになりそうだ。OSコンとかインダクタとかDC/DC制御ICとか。使わない気がするが、スキルをつけるために動かしてみるか…。データシート通り組んで終了だけど、放置よりは良いだろう。
なお、秋月から届いた部品は今のところ、ほぼ放置している。
ESP8266のフラッシュ書き込みのために使っているブレッドボード上でも3.3Vと5Vが得られるので、それでも試してみた。なんとなく、一番安定しているような気がするが、やはり何回かに1度は起動に失敗する。オシロスコープで観察する限りでは、一番安定していた気がする。が、ダメだった。
長くなってしまったが、疑った原因は次の二つだけだ。

  • リセット信号のタイミング
  • 電源

結局、両方とも原因では無かった。

[Document list 0A-0D] ESP8266 Hardware Guide - ESP8266 Developer Zone
原因は、ESP8266のHardware User Guideに次のように書かれていた

Note: If the power management IC is connected with the power-on enable pin CHIP_EN, it can control the power on-and-off of ESP8266EX by output high and low voltage through its GPIOs. However, pulsed current might be produced at the same time. In order to delay the transmission of pulsed signal and avoid unstable current of CHIP_EN, a RC time-delay circuit (R=1kΩ, C=100nF) is needed. There is an internal pull-up in the CHIP_EN pin, so no external pull-up is needed.

そう。
RC遅延回路を組めば良かった。

発注していなかったが、幸い、1kΩの抵抗と、0.1μFのコンデンサが家に転がっていたので利用した。
そしたら、かなり安定して動作するようになった。20回近く電源を入れ直してみたが、動作しないことは全く無かった。
そういえば、RSTピンは浮かせてはならない的な事が書かれてあった気がするが、接続忘れていても確か普通に動作した。あとでプルアップするか3.3Vに接続するかしておかねば。
RC遅延回路をユニバーサル基板に組んだ際、CH_ENに接続するところを間違えてRSTに接続してしまったり、RSTから抵抗を切り離そうとしたら、銅のパターンごと取れてしまったので最初から作り直したりして、結構時間がかかった。作り直したときも裏面だと左右か上下が反転するが、そのことで混乱して左右逆に抵抗を実装して抵抗を取るのも面倒なので1から作り直したりした。
没作が2枚出来てしまった…。

ともかく、今のところ、安定して動くので、いろいろ試してみよう。
昇圧コンバーターによる動作も行えるか試してみなければ。
あるいは、9Vからシリーズレギュレーターで電源を得た場合とかも。
乾電池で何日持つんだろう。

LPC810の省電力モードでいろいろハマった

d.hatena.ne.jp
こちらの記事を参考にしながら、Deep-sleep modeに入ったり、Deep power-down modeに入ったりしてみた。
gist.github.com
とりあえず、main以外は、こんな感じ。
gist.github.com
最初はこんな感じだったと思う。
これだと、割り込みでWAKEUPした後、Deep-sleepに入ると、タイマーで復帰しなくなる。

	    	// Needed?
	    	NVIC_ClearPendingIRQ(WKT_IRQn);
	    	NVIC_DisableIRQ(WKT_IRQn);
	    	LPC_PMU->DPDCTRL = 0;
	    	SCB->SCR = 0;
	    	LPC_WKT->CTRL |= (1 << 1) | (1 << 2);

Needed?のところがまずかったらしい。
あと、LPC810メモ:deep power-downモード(Self wake-up timerで復帰) - みっかぼログにある、次のサンプルコードも原因の一つだった。

        // DPDFLAG(11)が立ってるので、deep power-downからの復帰である。
        //	同フラグをクリア
        LPC_PMU->PCON &= ~(1 << 11);

正しくは次の通りだ。

LPC_PMU->PCON |= (0x1<<11);

この修正を加えることで、ピン入力でWAKEUPしたあと、Deep-sleepに入ってもタイマーでちゃんと復帰するようになる。
しかし、これではDeep power-downに入った後、復帰後Deep-sleepに入ろうとすると一瞬で処理が終わる。
スリープしていない。
Needed?の部分は、LPC812, WKT, deep power down mode: working only once... | www.LPCware.comにあったのを持ってきたり、Deep power-downで消し忘れたレジスタがあるのでは無いか疑惑を払拭するために追加したのだが、これはまずかったみたい。
正しくは次の通りみたいだ。

	    	LPC_WKT->CTRL |= WKT_CLR;
	    	NVIC_ClearPendingIRQ(WKT_IRQn);
	    	NVIC_DisableIRQ(WKT_IRQn);

この修正を加えることで、ちゃんとスリープから復帰する。

しかし、フラグをクリアするのに、0を代入するんじゃ無くて、1を代入するとか罠だよな。
今年も残りわずかだが、なんとか年内に記事を公開できそうだ。

00:07追加
あけましておめでとうございました。
修正後のmainを貼り忘れた。
gist.github.com
直すと、こんな感じになるかと思う。

MADOSMAをWindows 10 Mobileにした

救済措置で送料分返金されたので、その分、何らかのお返しをすべく、マウスコンピューター秋葉原ダイレクトショップでアップグレードを依頼した。
Windows 10 Mobileにしたのはいいが、早速、不便な点が2点ほど
まず、ロック画面が天気予報にならない。
そして、メールアカウントごとに異なる着信音が設定できない。
というか、そもそも音が鳴らない模様…
これは不便だ。
既存のコードを捨ててスクラッチから書き直している部分が多いのかな。Edgeなんかはそうだよな。完全に作り直している。今まであった機能がなくなるというのは少し不便ですな。

さくらのVPSのインスタンスを追加

とりあえず、Net Radio Archiveを入れた。


これを見て若干不安になった。それと、ディスク容量が50GBで頻繁にローカルに落として消さないとすぐ一杯になりそうになるのが理由だ。
さくらのVPSなら同じ値段でHDDプランなら容量が2倍なので、それほど頻繁に消して落とす必要が無さそう。ただ、消し忘れてしまいそうなのが怖い…。