hira1件のコメントI2Cの前にSPI接続を試しておく予定だったのですが、前後してしまった。SPI接続の簡単なテストから始めてみました~とりあえず、書き込みだけで、動作を確認できそうなので、LCDで実験してみます。[M-G0812P7567]このLCDモジュールは、128×32ピクセルで、LEDバックライト内臓のタイプです。※3.3Vで動作させる為、バックライトLED用の電源は、HT7750Aで昇圧しています。※先日作ったシリアルモジュールを繋なげるようにして、フラッシュ書き込みのモードスイッチ、リセットスイッチも設けました。近そうなST7565の初期化パターンを参考にしました。※ST7567のデータシートはネットを探すとあるのですが、いくつかの流動的パラメーターがあり、とりあえず、どのようにするのか目安が必要です。※Aitendoさんの商品は、安くて、魅力的なのが多いのですが、参考資料が少ないのが難点です。カットアンドトライで、コードを変えながら、1時間くらいかかって、ようやく画面がまともに出るとこまで来ました。※まだ多少不安定な事があり、原因を究明中・・・SPIでは、SCL、SDA_OUT、SDA_INPの3本が、ベースで、デバイスセレクトや、アドレスセレクトは、別に考える必要があります、複数のSPIデバイスを繋ぐ場合、ベースの制御信号は、シェアする為です。UARTの同期モードがあり、これを使うと良さそうですが、そうすると、UARTが使えなくなってしまう為、ソフト制御としました。lcd_io(ST7567の制御)では、LCD制御を含めて、SPIを制御します。今回のLCDでは4本の制御線が必要です。チップセレクト※RES信号は、R8Cのリセットに接続しています。M120AN/M110AN」には、I2C専用ハードは無いので、ポートを制御する事で同等の機能を実現するしかない。個人的には、I2Cは嫌いだ、ポートの制御が面倒で複雑だし、速度もあまり速くなく、デバイスによっては、特別なケアが必要な場合もある。SPIはもっと簡単で高速だ、デバイスを沢山繋げるとポートを消費するけど、少なくとも、DI、DOは共通化できるので、デバイスセレクトのみで、I2Cのように、ポートの入出力がこまめに変化したりしない。界標準的な位置づけになると、規格がはびこってしまい、どれもがI2C通信となる困った状況だ・・・ここまで、I2Cが流通してしまうと、規格が悪いとか言ってられなくなるのも事実で、とりあえず、ソフト制御のI2Cクラスを実装する事とした。手持ちのI2Cデバイスでテストしてみた、今回はDS1371を選んだDS1371は32ビットのバイナリーカウンターを内臓したRTCで、以前に、マキシム社にサンプルをもらって評価したデバイスの余りで、RTCの中でも構成としては使いやすいデバイスである。構成されたタイプの方が安い。結局、まっとうな時間管理が必要な場合は、秒単位にシリアライズしなければならない。※ハードを設計する人が、ソフトの都合をまるで判っていない例の一つだと思う。I2C専用ハードの場合と違って、プロトコルを細部まで理解する必要がある。重要な部分を理解しないまま、「多分こうだろう」的な感じで、実装してしまい、それが悪くて、中々通信が出来なかった事。最終的には、DS1371の英文マニュアルの一部を読んでいて気がついた・・・スレーブからのリード時のACKの振る舞いが判ってなかった・・・I2C関係の構成としては、以下のようになっている。入力};このクラス定義は、少し冗長だけど、I2CのSCL、SDAをどのポートに対応させるかを実装する。※詳細なテストはしていないが、オープンドレインポートじゃなくても動作すると思う。「ds1371_io.hpp」はテンプレートクラスで上のポート定義を渡す。クラスにそのまま渡している。制御レジスターを設定する。全てのカウンタ値が確定する前に不正な値を読み出してしまう場合があり、複数回読み出して比較する事でこれを回避している。受け渡しをする)※他のデバイスを制御するなら、このソースを参考にすれば、少しの手間で、色々なI2Cデバイスに対応できると思う。基本的に、初期化と、読み出し、書き込みなどの関数しか無い。7ビットのデバイスアドレスしか対応していないが、10ビットのアドレスを使っているデバイスは少ないようなので問題無いだろう。切り替えられるようにしてあるが、ソフトウェアーループによるクロック生成なので、あまり正確ではなく、実際より10%以上遅いと思われる。I2Cの仕様として、スレーブデバイスが、内部動作の影響で、応答出来ない場合に、SCLを強制的に「0」にする事で、動作を遅延させる事が出来る。}関数で、大きな待ち時間を設定できるようにしてある。この待ち時間を越えてSCLが引き伸ばされると、各関数はストールして、falseを返す。時間関数はかなり巨大な為、必要最小限な実装をした関数群を用意した。・うるう年の補正、曜日の計算など含まれている。・タイムゾーンは+9時間(東京)にしてあり、ハードコーディングしてある。グリニッチ標準時間で管理している。hiraコメントするR8Cの書き込みプログラム完成を受けて、とりあえず、まともなライターを製作してみた。今回はライターモジュール側の製作です。売られている比較的安価なR8C用ライターは、USBシリアルモジュールが乗っている。シリアルモジュールは単独で動作させる事も多いので、別にしたいと思う。これは、前回のブログの通りです。6Pのスイッチを設けて、「WRITER」モードと、「RUN」モードを切り替えている。代わるので、その切り替えも兼ねている。「RUN」モード時、シリアルの入出力だけが、具体的に繋がる機能だけなので、LEDや、A/D用のボリューム、スイッチなど取り付けるつもりだが、今回は、ケースの加工が面倒なので今後の課題とする。ICソケットを使って、ライターらしく仕上げてみた。端子名をそのまま使っているので、方向に十分注意してほしい。接続している、これは、R8Cの書き込みモードではそのようになっているもので、何故そうなのかは不明。社のデバイスは、中国製のコピーデバイスが安価で出回っており、それを掴むと、純正ドライバーでは、コピーチップと認識して、弾くらしいので注意が必要。手直しをしたいのだがーとりあえず、書き込み、読み出し、消去など、一通りの機能は揃っているので、この辺で、ライタープログラムは、止めて、R8C本体のプログラムなどを充実したい感じです〜※ヒドイ実装とは、設定ファイルのパースとか、機能が分離出来ていないモトローラーファイルフォーマットの入出力など。※その為、バージョンは「0.72b」としている。シリアル接続して、R8Cの書き込みや、消去、を色々試したけど、とりあえず、何の問題も無い、十分に使えると思う。夢が膨らむ〜R8C本体に行く前に、先週、買ってきたもので、ちゃんとしたライターを作っておこうと思う。考えた末、USBシリアル部分と、R8Cのライター部分を分離した構造にした。USBシリアルは、色々な場合に使う事が多いので、分離しておけば、便利に利用できるだろう。FT231XS、単品だと安くて210円だった。ピンのハンダ付けが、少しだけ厳しい・・それと、マイクロUSBコネクター、調べると、ミニUSBコネクターより、マイクロUSBコネクターの方が、抜き差しの耐用が高いらしい。スマホがマイクロUSBコネクターを採用している事が多く、ケーブルも調達がしやすい。制御線を出しておきたいので10ピンのコネクターを出す。それと、5V、3.3Vを切り替え出来るようにしておく。三端子レギュレーターを載せる。ケースは、「タカチ」の「TW4-2-6」を使った。以前から、採用している構造で、非常に具合が良いのだが、L型の10ピンコネクターを横に出す構造にして、反対側は、マイクロUSBコネクターの先端で受けるようにする事で、基板を抑える事が出来、シンプルに収まる。一応KiCADで回路を引いた、この関係ファイルもGitHubにプッシュしてある。