|
|
> No.170[元記事へ]
nekosanさんへのお返事です。
> Tako21さんへのお返事です。
>
> > PIC16F877AとdsPIC30F4013を用いてI2C通信をしたいと考えております。
> > PIC16F877A(マスター)、dsPIC30F4013(スレーブ)
> > SDAとSCLラインにはデジタルオシロをつないで波形を見ることは出来ます。
> > 877Aから4013Fにアドレス及びデータを送ったのですが、F4013側では入力バッファに
> > データは入らないし、当然割り込みも働きません。
> > 877Aからはクロックとシリアルデータは出ています。ACKは帰りません(当然ですが・・・)
> > F4013側ではI2CSTATレジスタのビット3(START),4(STOP)は動いているのが確認できます。
> > スレーブの割り込み許可は入れてあります。
> > 877AとEEP-ROMの通信はうまくいきます。その回路にI2Cバスを接続して
> > アドレスを振ったのですがデータを受け付けず困っています。
> > どなたか良い知恵を持った方がいらっしゃいましたら、お助けください。
> > よろしくお願い致します。
>
> EEPROMが上手くアクセスできているということは、
> 物理配線は上手く行っていると思われるので、
> これだけだとなんとも判断つきかねますね。ひとまず
> 思いついたところから3つほど挙げさせていただきます。
>
> 1点目はこの間私が失敗したばかりの件で、アドレス設定
> の際の1ビットずれがないかどうかのこと。
>
> スレーブアドレス7ビットのさらに下位1ビットに
> 読み/書きビットが付きますが、この7ビットの位置を
> 間違えて指定してないでしょうか?
> アセンブラならあまり間違えることもないと思うのですが、
> 何らかの高級言語コンパイラだと、ちゃんと言語仕様確認
> しないと私みたいに原因不明で頭抱えることになるので…
>
> つまりアドレスの7ビットを右詰で指定するのか、左詰で
> 指定するのか。言語仕様に合っているかご確認ください。
>
> 2点目は、CPUのクロック回路のディバイダ設定。
> シリアル通信はクロック速度が影響しているので、
> クロック設定が間違えていると通信速度が送受信側で
> 一致せず、データ到着を認識できない…とか。
>
> I2Cはクロック信号があるとはいえ、各マイコンに
> よって正常に送受信できる速度範囲には限度があり、
> そこからはみ出ていればクロック信号自体が
> 上手く認識できていないかもしれません。
>
> 特に今回は16F877の送り出しが速くて、dsPIC側のクロック
> が分周されていたら取りこぼしが起る可能性があるかと
> 思います。
> I2Cクロックのディバイダも同様です。
>
> 3点目はアドレッシング幅のこと。dsPICは使ったこと
> ないので詳しくわかりませんが、比較的新しいチップ
> ですから10ビットアドレスモードにも対応している
> ことでしょう。(未調査)
>
> で、送り出しが7ビット、受信側が10ビットなら
> 正しいデータとして認識できないかと思われます。
> dsPIC側の初期設定を再度ご確認ください。
>
>
>
> あとは、start/stopビットが動いているとのこと
> ですので、調査の一環としてインタラプトドリブン
> ではなくバッファステータスビットをポーリングに
> 変えて見たら動かないでしょうか?
>
> dsPICは使ったことがないのでそのくらいしか
> 思いつかないのですが…
|
|