3セントマイコンのPMS150Cも書き込めるように、機能を追加しようと思います。
機能を追加
IDを読み取る
setVppVoltage(5.0); //Power ON delay(5); setVddVoltage(3.0); delay(5); sendData(0xA5A5A5A7,32); //send write command receiveData( &data , 26+12 ); //receive id setVppVoltage(0.0); //Power OFF setVddVoltage(0.0);
まずは、デバイスのIDを読み取ってみます。PMS150Cは、ライトコマンドを送信し、26クロックした後に、12bitのIDが返ってきます。
実行してみると、マイコンから0xA16の返信がありました。無事にIDを読み取ることができました。
ROMのデータをリードする
setVppVoltage(5); //Power ON delay(5); setVddVoltage(2.5); delay(5); sendData(0xA5A5A5A6,32); //send read command sendData(address, 12); //send address receiveData( &data , 13 ); //receive data setVppVoltage(0.0); //Power OFF setVddVoltage(0.0);
ROMのリードのプログラムを作ります。リードは、リードコマンドを送信後、12ビットのアドレスを送信して、13ビットのデータを受信します。
何も書き込んでいなので、0x1FFFが返ってきました。
ROMの終わりのところ、0x3F6と0x3FFC,3FFFに何か書いてあります。これもキャリブレーションの値なのでしょうか?しかし、これによって、ROMからデータがリードできていることがわかりました。
ワンタイムROMに書き込む
setVppVoltage(8.0); //Power ON delay(5); setVddVoltage(4.3); delay(5); sendData(0xA5A5A5A7,32); //write read command setVppVoltage(10.5); delay(5); setVddVoltage(5.8); delay(5); uint16_t data[] = {0x000, 0x001}; sendData(data[0], 13); //send data sendData(data[1], 13); sendData(address, 12); //send address PCK_CLOCK(); PCK_UP(); //8 pulses PDA2_HIGH(); delayMicroseconds(30); PDA2_LOW(); delayMicroseconds(30); PCK_DOWN(); delayMicroseconds(4); PCK_CLOCK(); setVppVoltage(0.0); //Power OFF setVddVoltage(0.0);
書き込みは、少し複雑です。電圧もリードの時よりも高くなっています。
0xA5A5A5A7のライトコマンドを送信後、VDDとVPPを5.8V、10.5Vに上げます。
データは2ワードまとめて書き込みます。2ワード送信後、書き込む先頭アドレスを送信します。その後1クロック送出します。
その後、PDAピンを30us周期にON、OFFを8回行います。最後にクロックを1回送出して完了です。
実行してみましょう。ROMをダンプすると0番地と1番地に0と1が書き込まれています。
2ワード書けたので、全てのアドレスにアドレスと同じ値を書き込んでみました。全て正常に書き込めました。
これで、PMS150Cにもプログラムを書き込めるようになりました。
Lチカプログラムを書き込む
プログラムを作る
それではLEDが点滅するプログラムを作りたいと思います。先日作ったPFS154用のプログラムを修正します。
[env:development] platform = https://github.com/1500WK1500/platform-padauk.git ; ボードのリポジトリ board = PMS150C ; 使うマイコンの選択 framework = easypdk ; ヘッダーとかを追加 extra_scripts = post:extra_script.py
platformio.iniのボード名を、PMS150Cに書き換えます。
#include <pdk/device.h> #include#define LED_BIT 4 //PA4 6pin #define turnLedOn() PA |= (1 << LED_BIT) #define turnLedOff() PA &= ~(1 << LED_BIT) void main() { //PDK_USE_FACTORY_IHRCR_16MHZ(); PDK_SET_SYSCLOCK(SYSCLOCK_IHRC_16MHZ); CLKMD &= ~CLKMD_ENABLE_WATCHDOG; // Disenable WDT PAC |= (1 << LED_BIT); // Set LED pin as output while (1) { turnLedOn(); for( uint32_t i=0 ; i<400000 ; i++) __nop(); turnLedOff(); for( uint32_t i=0 ; i<400000 ; i++) __nop(); } }
続いてmain.cファイルの8行目、PDK_USE_FACTORY_IHRCR_16MHZ();をコメントアウトします。
PMS150Cには内部高速オシレータのキャリブレーション値が存在しないためです。
その他はそのまま、1カ所だけ修正して保存し、コンパイルします。
プログラムを書き込む
マイコンにプログラムを書き込みます。
書き込み機のドライブに、コンパイルでできたHEXファイルをドラッグ&ドロップします。
一瞬で書き込みが完了します。
電池をつなぐ
電池をつなぐと、LEDが点滅しました!
3セントマイコンPMS150Cにもプログラムが書き込めるようになりました!!
これで、10セントのフラッシュROMのPFS154と、3セントのワンタイムROM版のPMS150Cのどちらも開発が可能になりました。
さて次回は
ブレッドボードで動作しているこの回路を、基板化したいと思います。
コメント