タグ「RaspberryPi」を含む投稿[60件](3ページ目)
裸族のパイ&裸族のカプセルホテルはUASドライバを外すことで一応の改善が見えました。ベンチマークも本体に内蔵のHDDとほぼ同じ値を出します。
ただ、USBハブをかますとそうはいきません。一見正常に起動してもアクセスが恐ろしく遅かったり、不安定でコンソールすら立ち上がらないことがあります。
構成として裸族のカプセルホテル(外付けHDD)とLANアダプタを取り付けたいのですが、1本のUSB3.0でやりくりするにはUSBハブが必須なのでなんとかしたい。
さて、何が原因か。
まず考えられるのはUSBハブの電力不足。RaspberryPiのUSBポートは電力供給が弱いらしいのでUSBの電源を別取りしたところ、半分以上の確率で起動は失敗しますが、起動が成功した際にはアクセス速度が劇的に改善します。解決の決定打ではありませんが、これはこれで必要な対策です。
正常に起動する時とそうでない時の違いを考えてみると、USBハブに電源が入った状態でRaspberryPiを起動すると(リブートも)ダメで、RaspberryPiが起動し始めてからUSBハブを挿すと正常に動くことが多い。ならばと、RaspberryPiが起動し始めて起動ログの表示が見え始めた直後にUSBハブの電源を入れたところ100%の確率で正常に起動することがわかった。リブートもシャットダウンログの表示が止まったところでUSBハブの電源を落とし、以下同様にすると正常にリブートが完了します。
要するに、RasberryPiがカーネルを読み込んだ直後にUSBハブの電源を入れれば(再投入すれば)良いとなります。
ただ、起動の度に手作業でやるのは現実的ではないし、何よりも遠隔のリブートでは不可能です。
さて、どうする。
方法として考えられるのは上記のタイミングを得る信号をRaspberryPiから取り出すこと。
・・・こんなこと出来るのか?
RaspberryPiには基板上にLEDが付いていて、電源パイロットランプとSDカードのアクセスランプになっていますが、設定を変えることで違う状態情報も表せます。オーバーライドしてGPIOに出力することも出来ます。
このLEDは前者がpwr_led(赤)、後者がact_led(緑)と呼ばれますが、これをGPIOに出力して丁度良いスイッチソースにならないでしょうか。
ちょっと試験しただけなので大丈夫とは言い切れませんが、act_ledの設定をdefault-onにしてGPIOに出力すると期待するモノになりそうです。通電直後と再起動のシャットダウン直後は消灯から始まり、起動ログの表示が始まると点灯、シャットダウンが完全終了すると消灯します。これは欲しいタイミングではないのか?
そもそもはパイロットランプですが、GPIOに出力するなら単なる信号であり、バッファを入れればリレーを動かすことが出来ます。過渡期にチャタリング的なノイズはあると思いますが簡単なパッシブ回路で何とかなるかな?。
カーネルが起動している時を把握したいと思っていたので、この方法はなんとか手にしたいと思います。
腰を据えて試す時間はしばらくありませんケドね。
#RaspberryPi
ただ、USBハブをかますとそうはいきません。一見正常に起動してもアクセスが恐ろしく遅かったり、不安定でコンソールすら立ち上がらないことがあります。
構成として裸族のカプセルホテル(外付けHDD)とLANアダプタを取り付けたいのですが、1本のUSB3.0でやりくりするにはUSBハブが必須なのでなんとかしたい。
さて、何が原因か。
まず考えられるのはUSBハブの電力不足。RaspberryPiのUSBポートは電力供給が弱いらしいのでUSBの電源を別取りしたところ、半分以上の確率で起動は失敗しますが、起動が成功した際にはアクセス速度が劇的に改善します。解決の決定打ではありませんが、これはこれで必要な対策です。
正常に起動する時とそうでない時の違いを考えてみると、USBハブに電源が入った状態でRaspberryPiを起動すると(リブートも)ダメで、RaspberryPiが起動し始めてからUSBハブを挿すと正常に動くことが多い。ならばと、RaspberryPiが起動し始めて起動ログの表示が見え始めた直後にUSBハブの電源を入れたところ100%の確率で正常に起動することがわかった。リブートもシャットダウンログの表示が止まったところでUSBハブの電源を落とし、以下同様にすると正常にリブートが完了します。
要するに、RasberryPiがカーネルを読み込んだ直後にUSBハブの電源を入れれば(再投入すれば)良いとなります。
ただ、起動の度に手作業でやるのは現実的ではないし、何よりも遠隔のリブートでは不可能です。
さて、どうする。
方法として考えられるのは上記のタイミングを得る信号をRaspberryPiから取り出すこと。
・・・こんなこと出来るのか?
RaspberryPiには基板上にLEDが付いていて、電源パイロットランプとSDカードのアクセスランプになっていますが、設定を変えることで違う状態情報も表せます。オーバーライドしてGPIOに出力することも出来ます。
このLEDは前者がpwr_led(赤)、後者がact_led(緑)と呼ばれますが、これをGPIOに出力して丁度良いスイッチソースにならないでしょうか。
ちょっと試験しただけなので大丈夫とは言い切れませんが、act_ledの設定をdefault-onにしてGPIOに出力すると期待するモノになりそうです。通電直後と再起動のシャットダウン直後は消灯から始まり、起動ログの表示が始まると点灯、シャットダウンが完全終了すると消灯します。これは欲しいタイミングではないのか?
そもそもはパイロットランプですが、GPIOに出力するなら単なる信号であり、バッファを入れればリレーを動かすことが出来ます。過渡期にチャタリング的なノイズはあると思いますが簡単なパッシブ回路で何とかなるかな?。
カーネルが起動している時を把握したいと思っていたので、この方法はなんとか手にしたいと思います。
腰を据えて試す時間はしばらくありませんケドね。
#RaspberryPi
RaspberryPiのUSB3.0にストレージに繋ぐと不安定になるらしい。実際不安定だったので調べたところ、故障ではなくそういうものらしい。
アクセスを速くするためのUASと呼ばれる方法が原因らしく、このドライバがデバイスに当たらないようにすると改善するらしい。ドライバが当たらないとオーソドックスなドライバに置き換わり安定するとか。ならば最初からそうして欲しい。速くても不安定ぢゃ意味がない。
設定方法は次のサイトが簡素でわかりやすい。
Raspberry Pi で USB接続のSSDが不安定な場合の対処法
今課題なのは、裸族のパイにノーマルの裸族のカプセルホテルを接続すると不安定になることの対策です。
HDDが4スロットでも良いのですが、RAID1を組むとストレージは2組です。出来れば3組使いたいので、裸族のカプセルホテルを増設して8スロットにしたいワケです。
不安定だったので増設の裸族のカプセルホテルは外してありますが、内蔵の4スロットは上記の設定で安定度が増したので、接続テストをしたいですね。
追記
現場上がりで帰宅して裸族のカプセルホテルの接続テストしました。なんだか圧倒的に普通に動きます。
これまでは何だったのか、費やした数時間に何の意味があったのか、鼻クソほじり乍ら遠い目をしてしまいそうな程です。
UASが機能すればUSB3の真価を引き出した高性能を得られるのかもしれませんが、カーネルが落ちる程の未完成品なら意味はありません。
ちなみに、裸族のカプセルホテルのプロダクトIDは個体が違っても同じでした。ですので、追加の設定作業はありません。
#RaspberryPi
アクセスを速くするためのUASと呼ばれる方法が原因らしく、このドライバがデバイスに当たらないようにすると改善するらしい。ドライバが当たらないとオーソドックスなドライバに置き換わり安定するとか。ならば最初からそうして欲しい。速くても不安定ぢゃ意味がない。
設定方法は次のサイトが簡素でわかりやすい。
Raspberry Pi で USB接続のSSDが不安定な場合の対処法
今課題なのは、裸族のパイにノーマルの裸族のカプセルホテルを接続すると不安定になることの対策です。
HDDが4スロットでも良いのですが、RAID1を組むとストレージは2組です。出来れば3組使いたいので、裸族のカプセルホテルを増設して8スロットにしたいワケです。
不安定だったので増設の裸族のカプセルホテルは外してありますが、内蔵の4スロットは上記の設定で安定度が増したので、接続テストをしたいですね。
追記
現場上がりで帰宅して裸族のカプセルホテルの接続テストしました。なんだか圧倒的に普通に動きます。
これまでは何だったのか、費やした数時間に何の意味があったのか、鼻クソほじり乍ら遠い目をしてしまいそうな程です。
UASが機能すればUSB3の真価を引き出した高性能を得られるのかもしれませんが、カーネルが落ちる程の未完成品なら意味はありません。
ちなみに、裸族のカプセルホテルのプロダクトIDは個体が違っても同じでした。ですので、追加の設定作業はありません。
#RaspberryPi
裸族のパイのUSB-LANアダプタですが、不調の原因が判明。
原因はUSB3.0のA-Aケーブルがクロス結線なことでした。電源は無関係でした。
USBは[RaspberryPi/USB3.0]-[USB3.0/A-A_Cable]-[USB3.0/A-A_KeyStone]-[USB-LAN]と繋いでいますが、ケーブルがクロス結線でキーストーンがストレート結線なのでRaspberryPiに対しUSB-LANアダプタは結線間違いになっていたのです。ケーブルを2本つなぐと正常に動くという摩訶不思議な現象だったので配線を当たったところ判明。
正直、「なんでクロス結線!?」と思いますが、USB3.0のA-Aケーブルはクロス結線が普通でストレートは例外みたいです。
対策は、キーストーンの中身を無理やりクロス結線に変え、クロスからクロスでストレートにしました。
ちなみに、USB3.0/A-Aのクロス結線は・・・
1-1 ※1番ピンから4番ピンはUSB2.0互換
2-2
3-3
4-4
5-8
6-9
7-7
8-5
9-6
です。
USB3.0のメモリを挿して動いたのであまり気にしていませんでしたが、USBメモリは3.0がダメなら2.0に切り替えてしまうみたいです。正確なところはわかりませんけどね。
紆余曲折ありましたが「裸族のパイ」が完成しました。作り方を忘れないウチにもう2台作ってしまいたいけどしばらく無理かなぁ~。
今後、裸族のパイの耐久試験を実施し、大丈夫なら自宅サーバーをコレに切り替えるつもりです。
#サーバー #RaspberryPi
原因はUSB3.0のA-Aケーブルがクロス結線なことでした。電源は無関係でした。
USBは[RaspberryPi/USB3.0]-[USB3.0/A-A_Cable]-[USB3.0/A-A_KeyStone]-[USB-LAN]と繋いでいますが、ケーブルがクロス結線でキーストーンがストレート結線なのでRaspberryPiに対しUSB-LANアダプタは結線間違いになっていたのです。ケーブルを2本つなぐと正常に動くという摩訶不思議な現象だったので配線を当たったところ判明。
正直、「なんでクロス結線!?」と思いますが、USB3.0のA-Aケーブルはクロス結線が普通でストレートは例外みたいです。
対策は、キーストーンの中身を無理やりクロス結線に変え、クロスからクロスでストレートにしました。
ちなみに、USB3.0/A-Aのクロス結線は・・・
1-1 ※1番ピンから4番ピンはUSB2.0互換
2-2
3-3
4-4
5-8
6-9
7-7
8-5
9-6
です。
USB3.0のメモリを挿して動いたのであまり気にしていませんでしたが、USBメモリは3.0がダメなら2.0に切り替えてしまうみたいです。正確なところはわかりませんけどね。
紆余曲折ありましたが「裸族のパイ」が完成しました。作り方を忘れないウチにもう2台作ってしまいたいけどしばらく無理かなぁ~。
今後、裸族のパイの耐久試験を実施し、大丈夫なら自宅サーバーをコレに切り替えるつもりです。
#サーバー #RaspberryPi
私が作るサーバーにはNIC(ネットワーク・インターフェース・カード)を2つ搭載します。
1つでもいいのですが、内向きと外向きを別々にした方がネットサーバーを構成するには都合がいいのです。
裸族のパイの母体はRaspberryPiなのでNICは1つですから、もう1つ増やすにはUSB-LANアダプタを取り付けます。
ところがです、標準ドライバで動いた実績のあるUSB-LANアダプタを取り付けても認識しない。全体的な挙動もおかしくなる。
あれ?
別なモノを挿しても同じ。
USBコネクタがおかしいのかとUSBメモリを刺すと正常に動く。
あれ?
結論から言いますと電力不足でした。
USBに別電源を割り込ませたところ正常に動作。
RaspberryPiのUSBコネクタは電力供給が弱いので当然です。
電源周りとUSBコネクタに追加工が必要になりました。
#サーバー #RaspberryPi
1つでもいいのですが、内向きと外向きを別々にした方がネットサーバーを構成するには都合がいいのです。
裸族のパイの母体はRaspberryPiなのでNICは1つですから、もう1つ増やすにはUSB-LANアダプタを取り付けます。
ところがです、標準ドライバで動いた実績のあるUSB-LANアダプタを取り付けても認識しない。全体的な挙動もおかしくなる。
あれ?
別なモノを挿しても同じ。
USBコネクタがおかしいのかとUSBメモリを刺すと正常に動く。
あれ?
結論から言いますと電力不足でした。
USBに別電源を割り込ませたところ正常に動作。
RaspberryPiのUSBコネクタは電力供給が弱いので当然です。
電源周りとUSBコネクタに追加工が必要になりました。
#サーバー #RaspberryPi
mdadmに問題発生!
マウントして使えるところまで設定出来たと思ったのに、再起動したらmdadmがエラーを吐いてコンソールが起動しない。これでは手直しも出来ません。
仕方ないので最初から組み直し。
ディスクのフォーマットやRAID1の同期には半日くらいかかりますが、その他の操作は数分で終わるのでいいかなと。使い始めてからエラーになるよりマシだし。
ひょっとするとですが、裸族のカプセルホテルはクーリングがイマイチなのでサーマルプロテクトで何かあったかな?
RaspberryPiのCPU温度が70度近くになっていたので高いなぁ~とは思っていたのでが・・・
試しに外枠を外した状態で再構成をしてます。これで通れば横っ腹に大穴を空けますかね。
#サーバー #RaspberryPi
マウントして使えるところまで設定出来たと思ったのに、再起動したらmdadmがエラーを吐いてコンソールが起動しない。これでは手直しも出来ません。
仕方ないので最初から組み直し。
ディスクのフォーマットやRAID1の同期には半日くらいかかりますが、その他の操作は数分で終わるのでいいかなと。使い始めてからエラーになるよりマシだし。
ひょっとするとですが、裸族のカプセルホテルはクーリングがイマイチなのでサーマルプロテクトで何かあったかな?
RaspberryPiのCPU温度が70度近くになっていたので高いなぁ~とは思っていたのでが・・・
試しに外枠を外した状態で再構成をしてます。これで通れば横っ腹に大穴を空けますかね。
#サーバー #RaspberryPi
RaspberryPiを32bitOSにしてチェックし直しました。何をやっても安定してます。
まだしばらくは32bitOSでいきましょう。
今はRAID1の設定と操作を色々試しています。RAID1を構成するには何かと時間がかかりますが、コマンド操作は少なく待ち時間が長いだけなので、本業が忙しい時には丁度良い作業です。
RAID1をHDD2台で構成していますが、交換手順を試しておかないといけません。PCマザーのSATA直刺しで使うことはありましたが、RaspberryPiに接続した裸族のカプセルホテルでRAID1を使うのは初めてだからです。
ディスクの入れ替えが容易に出来ればRAID1の扱いは一人前と言っていいのかな?
#サーバー #RaspberryPi
まだしばらくは32bitOSでいきましょう。
今はRAID1の設定と操作を色々試しています。RAID1を構成するには何かと時間がかかりますが、コマンド操作は少なく待ち時間が長いだけなので、本業が忙しい時には丁度良い作業です。
RAID1をHDD2台で構成していますが、交換手順を試しておかないといけません。PCマザーのSATA直刺しで使うことはありましたが、RaspberryPiに接続した裸族のカプセルホテルでRAID1を使うのは初めてだからです。
ディスクの入れ替えが容易に出来ればRAID1の扱いは一人前と言っていいのかな?
#サーバー #RaspberryPi
現場の準備が忙しい今日この頃です。
合間に息抜きというか気分転換で少々工作。
裸族のPiはフォーマット(mkfs)が通らない。セクタチェックを入れるとSuperblockの書き込み時点でRaspberryPiが止まってしまいます。入れないと通るので全くダメでもなさそう。
さて何ででしょう。
こんな基本的なことが通らないのは後々トラブルになりそうですからキチンとしたい。
mdadmでソフトウェアRAIDに使っていたHDDを普通モードにしたのでそのせいかもしれません。RAIDの設定値が残って不具合が起こるのはよくあることです。
もう一度gdiskで初期化してからセクタチェックをせずにフォーマットした後、セクタチェックを入れたフォーマットをしています。
ひょっとするとですが、64bitのRasbianを使っていることが原因かもしれません。これまではメモリ容量2GBのRaspberryPiを使っていたので32bitで良かったのですが、4GB以上しか手に入らなくなったのと、時代は64bit化ですから32bitが廃番なると面倒なので64bitにしたのです。ですが、64bitのRasbianは比較的最近stableされた物ですからドライバ周りに不具合があるのかもしれません。
64bitに対応するRaspberryPiは3系、4系、zero2です。私が使う中で対応しないのは初代zeroだけですが、私にとって64bit化するメリットは32bit版の廃番に対する対策しでしかありません。まだ早いのかな?
追記
そういやRaspberryPiは電源電圧が5vをわずかでも下回ると動作が鈍ることがあります。
ネットを見ると64bitOSを使うとこの現象が顕著に出るとか出ないとか。5.25vにすると解決するとかしないとか。
ACアダプタ電源で32bitOSを使って十分な速度で安定していますから、64bitOSは時期尚早と考え、まだしばらく32bitOSを使うのがいいのかもしれません。
簡単に言うならNASサーバーを作っているので、瞬間最大性能より絶対安定性能が重要ですしね。
#サーバー #RaspberryPi
合間に息抜きというか気分転換で少々工作。
裸族のPiはフォーマット(mkfs)が通らない。セクタチェックを入れるとSuperblockの書き込み時点でRaspberryPiが止まってしまいます。入れないと通るので全くダメでもなさそう。
さて何ででしょう。
こんな基本的なことが通らないのは後々トラブルになりそうですからキチンとしたい。
mdadmでソフトウェアRAIDに使っていたHDDを普通モードにしたのでそのせいかもしれません。RAIDの設定値が残って不具合が起こるのはよくあることです。
もう一度gdiskで初期化してからセクタチェックをせずにフォーマットした後、セクタチェックを入れたフォーマットをしています。
ひょっとするとですが、64bitのRasbianを使っていることが原因かもしれません。これまではメモリ容量2GBのRaspberryPiを使っていたので32bitで良かったのですが、4GB以上しか手に入らなくなったのと、時代は64bit化ですから32bitが廃番なると面倒なので64bitにしたのです。ですが、64bitのRasbianは比較的最近stableされた物ですからドライバ周りに不具合があるのかもしれません。
64bitに対応するRaspberryPiは3系、4系、zero2です。私が使う中で対応しないのは初代zeroだけですが、私にとって64bit化するメリットは32bit版の廃番に対する対策しでしかありません。まだ早いのかな?
追記
そういやRaspberryPiは電源電圧が5vをわずかでも下回ると動作が鈍ることがあります。
ネットを見ると64bitOSを使うとこの現象が顕著に出るとか出ないとか。5.25vにすると解決するとかしないとか。
ACアダプタ電源で32bitOSを使って十分な速度で安定していますから、64bitOSは時期尚早と考え、まだしばらく32bitOSを使うのがいいのかもしれません。
簡単に言うならNASサーバーを作っているので、瞬間最大性能より絶対安定性能が重要ですしね。
#サーバー #RaspberryPi
作業部屋があまりに酷い。自分以外の人が見たら単なるゴミ部屋状態で作業がし難い。
とりあえず、分解されている品からボチボチ仕上げることにしました。
まずは、センチュリー社製の「裸族のカプセルホテル」にRaspberryPi4Bを内蔵した「裸族のPi」を1台仕上げました。
RaspberryPi4Bを手に入れるのに難儀しましたが組まないと意味がありません。
動作確認を兼ねてHDDのフォーマット大会をしています。
#ガチ工作 #RaspberryPi
とりあえず、分解されている品からボチボチ仕上げることにしました。
まずは、センチュリー社製の「裸族のカプセルホテル」にRaspberryPi4Bを内蔵した「裸族のPi」を1台仕上げました。
RaspberryPi4Bを手に入れるのに難儀しましたが組まないと意味がありません。
動作確認を兼ねてHDDのフォーマット大会をしています。
#ガチ工作 #RaspberryPi
RaspberryPiのハードウェアI2Cをマスタにしてどうにかならないかと考えてみました。
BFで送受信の終了を監視し、SSPIF(ACKの終了)を監視してCKPをセットすれば良いっちゃ良いのだけど、不可能ではないけど面倒くさい処理の典型と化します。
クロックストレッチングを使わなくても(ACKの直後に次の送受信が始まっても)動く様にしておけばよいのはわかっていますが、PICのI2Cはクロックストレッチングが前提の構成(特にスレーブ送信)だし、RaspberryPiに限った問題なのでi2c-gpioを使ってクロックストレッチングを用いた方が素直な気がします。i2c-gpioが凄い足かせになるワケでもないようですし。
追記
どうにもモヤモヤするのでクロックストレッチングを使わない方法を考え続けてみました。帰りの車中は考え事に最適です。
条件を整理します。RaspberryPiのI2CがクロックストレッチングをしてくれないのですからPIC側の条件です。
タイミングチャートを読みますと、ACKのクロック(ワードの9クロック目)の立下りで割り込みフラグSSPIFがアクティブになった後、次のワードの最初のクロックの立ち上がりまでに送受信のコンディションを整えられれば何事もなく次のワードが扱えるようです。これはSSPIFで割り込みが発生してから半クロック分の時間が使えるとも言えます。I2Cのビットレートは一意ではありませんが、標準的なビットレートである100kbpsに限って考えるなら半クロックは5usec。32MHz動作のPICなら40命令ステップに相当する時間です。
PICは割り込みの入りと出にパイプラインロスが発生するのでそれぞれ1命令ステップが消費され、I2CのクロックとPICの動作クロックは同期していないし信号の立ち上がり立下り時間もあるので2命令ステップくらいの誤差は起こりえます。となると実処理のために使える命令ステップ数は最大で36程度です。
ザックリと考えるならSSPIFで割り込みに入ってから30命令ステップ以内に送受信コンディションを整えて割り込みから抜ければよいのでは?となる。
30命令ステップあれば書き込み(RaspberryPi→PIC)は間に合いそうです。
I2Cは1フェーズ内では読み出しか書き込みかどちらかしか出来ませんので、Pythonの読み出しコマンド(PIC→RaspberryPi)はI2Cにおいて2フェーズ(1つ目のフェーズでコマンドや読み出すアドレスを書き込み、2つ目のフェーズでデータを読み出す)で実行されます。すなわち、PICが受け取ったワードをキーに処理して次のワードで即応する必要はありません。受け取るだけ受け取ってから処理をし、次の返信フェーズに備えればいいのです。もし鬼連続でコールされても2つ目の読み出しフェーズでデバイスアドレスを送受信する時間は返信データを作るのに使えます。1ワードは9bit分ですから100kbpsなら720usecです。足りる足りないではなくこの時間で済むように作ればいいのです。つか、PICにとっては5,760命令ステップに相当する時間です。私はPIC16をアセンブラで書きますが、5000ステップ以上の処理など書きたくもない・・・。
割り込みベクタが一つしかないPIC16系で多重割り込みをするとI2Cのタイミングを外す可能性があります。他の処理はポーリングとなりますが、DMX512の送受信や位相制御のトリガー処理もポーリングで十分間に合っているので問題ないっしょ。むしろPIC1個にそんな沢山の仕事させるなってね(笑
あれ?クロックストレッチングを使わないで組めそうな気がしてきた。
なんのことやらオレメモ暴走独り言ですみません。
#RaspberryPi #電子工作
BFで送受信の終了を監視し、SSPIF(ACKの終了)を監視してCKPをセットすれば良いっちゃ良いのだけど、不可能ではないけど面倒くさい処理の典型と化します。
クロックストレッチングを使わなくても(ACKの直後に次の送受信が始まっても)動く様にしておけばよいのはわかっていますが、PICのI2Cはクロックストレッチングが前提の構成(特にスレーブ送信)だし、RaspberryPiに限った問題なのでi2c-gpioを使ってクロックストレッチングを用いた方が素直な気がします。i2c-gpioが凄い足かせになるワケでもないようですし。
追記
どうにもモヤモヤするのでクロックストレッチングを使わない方法を考え続けてみました。帰りの車中は考え事に最適です。
条件を整理します。RaspberryPiのI2CがクロックストレッチングをしてくれないのですからPIC側の条件です。
タイミングチャートを読みますと、ACKのクロック(ワードの9クロック目)の立下りで割り込みフラグSSPIFがアクティブになった後、次のワードの最初のクロックの立ち上がりまでに送受信のコンディションを整えられれば何事もなく次のワードが扱えるようです。これはSSPIFで割り込みが発生してから半クロック分の時間が使えるとも言えます。I2Cのビットレートは一意ではありませんが、標準的なビットレートである100kbpsに限って考えるなら半クロックは5usec。32MHz動作のPICなら40命令ステップに相当する時間です。
PICは割り込みの入りと出にパイプラインロスが発生するのでそれぞれ1命令ステップが消費され、I2CのクロックとPICの動作クロックは同期していないし信号の立ち上がり立下り時間もあるので2命令ステップくらいの誤差は起こりえます。となると実処理のために使える命令ステップ数は最大で36程度です。
ザックリと考えるならSSPIFで割り込みに入ってから30命令ステップ以内に送受信コンディションを整えて割り込みから抜ければよいのでは?となる。
30命令ステップあれば書き込み(RaspberryPi→PIC)は間に合いそうです。
I2Cは1フェーズ内では読み出しか書き込みかどちらかしか出来ませんので、Pythonの読み出しコマンド(PIC→RaspberryPi)はI2Cにおいて2フェーズ(1つ目のフェーズでコマンドや読み出すアドレスを書き込み、2つ目のフェーズでデータを読み出す)で実行されます。すなわち、PICが受け取ったワードをキーに処理して次のワードで即応する必要はありません。受け取るだけ受け取ってから処理をし、次の返信フェーズに備えればいいのです。もし鬼連続でコールされても2つ目の読み出しフェーズでデバイスアドレスを送受信する時間は返信データを作るのに使えます。1ワードは9bit分ですから100kbpsなら720usecです。足りる足りないではなくこの時間で済むように作ればいいのです。つか、PICにとっては5,760命令ステップに相当する時間です。私はPIC16をアセンブラで書きますが、5000ステップ以上の処理など書きたくもない・・・。
割り込みベクタが一つしかないPIC16系で多重割り込みをするとI2Cのタイミングを外す可能性があります。他の処理はポーリングとなりますが、DMX512の送受信や位相制御のトリガー処理もポーリングで十分間に合っているので問題ないっしょ。むしろPIC1個にそんな沢山の仕事させるなってね(笑
あれ?クロックストレッチングを使わないで組めそうな気がしてきた。
なんのことやらオレメモ暴走独り言ですみません。
#RaspberryPi #電子工作
クロックストレッチングについて改めて調べましたが、最新のRaspberryPiで治っている情報はありません。
2022年7月現在、Broadcom社製のBCMシリーズを使ったRaspberryPiは総じてダメなようで、ソフトウェアデバイスであるi2c-gpioを使うのが有効な対策だと思います。
もちろん、ハードウェアデバイスに比べたらCPUに負担がかかるので、CPU負荷が多いシステムやI2Cメモリなどの扱うデータ量が多いデバイスでの使用は避けるべきかもしれません。
あくまで、扱いデータ量が比較的少なく多少の遅延が発生しても支障がない機内通信で使うのがよいと思われます(I2Cはそもそもそういうモノらしいですけど)。
今回はPICをインターフェースとして用い、パラレルバスのLCDキャラクタディスプレイ(SC1602やSC2004を用いた製品)をI2Cで接続しANSIエスケープシーケンスっぽいASCII文字列で制御できるシステムを目指します。
もちろん、UART(シリアル)でも動く様に考えます。8PのDIPスイッチを取り付け、1PでI2C/UARTを選択し、残りの7PでI2CのアドレスやUARTのビットレートを設定できる様にすれば汎用性が高まるでしょう。
#RaspberryPi #電子工作
2022年7月現在、Broadcom社製のBCMシリーズを使ったRaspberryPiは総じてダメなようで、ソフトウェアデバイスであるi2c-gpioを使うのが有効な対策だと思います。
もちろん、ハードウェアデバイスに比べたらCPUに負担がかかるので、CPU負荷が多いシステムやI2Cメモリなどの扱うデータ量が多いデバイスでの使用は避けるべきかもしれません。
あくまで、扱いデータ量が比較的少なく多少の遅延が発生しても支障がない機内通信で使うのがよいと思われます(I2Cはそもそもそういうモノらしいですけど)。
今回はPICをインターフェースとして用い、パラレルバスのLCDキャラクタディスプレイ(SC1602やSC2004を用いた製品)をI2Cで接続しANSIエスケープシーケンスっぽいASCII文字列で制御できるシステムを目指します。
もちろん、UART(シリアル)でも動く様に考えます。8PのDIPスイッチを取り付け、1PでI2C/UARTを選択し、残りの7PでI2CのアドレスやUARTのビットレートを設定できる様にすれば汎用性が高まるでしょう。
#RaspberryPi #電子工作