PIC16F1823 SPI通信でのデータ受信に問題あり

このQ&Aのポイント
  • PIC16F1823をマスターとして、スレーブデバイスからSPI通信にてデータを読み込もうとしていますが、受信しているのは0x00のデータのみです。
  • PIC側のマスター受信では、SSP1BUFをダミーで読み込んだ後、SPIでコマンドを送信し、再度SSP1BUFを読み込んでいます。
  • データ受信用にはダミーデータと受信を行い、読み込む前にSSP1BUF.BFを確認していますが、期待したデータが受信できません。
回答を見る
  • ベストアンサー

PIC16F1823 SPI通信

PIC16F1823をマスターとして、スレーブデバイスから、SPI通信にてデータを読み込もうとしています。オシロスコープで波形を見ると、期待したデータをスレーブ側は出力しています。しかし、PICでは、0x00のデータしか受信されません。 PIC側のマスター受信では、SSP1BUFをダミーで読み込み、SPIでコマンドを送信、SSP1BUF.BFをみて、さらにSSP1BUFをダミーで読み込み、次にデータ受信用にダミーデータと受信を行い、SSP1BUF.BFをみて、SSP1BUFを読んでいます。気を付けて確認しなけらばならないレジスタ等あったら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.3

SPI モード ( CKP , CKE ) 設定は合ってますか? スレーブデバイス がマイコンの場合 WAIT が必要になる時もあります 参考 MCC SPI ライブラリ #define SPI_RX_IN_PROGRESS 0x0 uint8_t SPI_Exchange8bit(uint8_t data) { // Clear the Write Collision flag, to allow writing SSP1CON1bits.WCOL = 0; SSP1BUF = data; while(SSP1STATbits.BF == SPI_RX_IN_PROGRESS) { } return (SSP1BUF); }

reset_sw
質問者

お礼

その後、PIC16F1823は、アナログ入力も同一ピンで行われていて、デフォルトがアナログ入力なので、ANSELレジスタでデジタルIOに切替る事で、リードできるようになりました。 ありがとうございました。

その他の回答 (2)

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.2

今後のことも考えると Microchipのフォーラムで質問することを覚えるべきでしょうね。 https://www.microchip.com/forums/m1036310.aspx https://www.microchip.com/forums/f524.aspx

reset_sw
質問者

お礼

ありがとうございます。確認します。

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.1

開発環境は? ライブラリは? ここらあたりの問題だったっりして https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12163939517

reset_sw
質問者

お礼

ありがとうございます。

reset_sw
質問者

補足

XC8コンパイラーを使用しています。PIC16F877では、受信できます。 PIC16F1823では、SSP1BUFがNULLのままです。

関連するQ&A

  • PIC SPI通信

    PIC16F1823で温度センサーからSPI通信でデータを取得しています。 正常時は問題なくデータを取得できますが、温度センサー側の電源が投入されていない状態か接続されていない状態で通信を行うと、PICの受信完了フラグ(SSP1STAbits.BF)バッファーフルステータスビットがフルになりません。 たとえ、センサー側の電源がOFFだとしても、SPIでデータを取得する場合、信号ラインは、HiかLowの電位であれば、データが00かFF等で間違ったデータを受信して、BFフラグがオンするのではないかと考えますがなりません。 なぜだか、ご存じの方いましたら、教えてください。 Arduinoでは、センサー側が未接続でも、関数は抜けてきます。

  • PICのUSARTについて

    PICのUSARTについて PICのUSART機能を使おうかと思い色々読んでいてPICのUSART(非同期の場合)は (1)基本的に1対1でしか接続できない。 (2)(非同期では)互いは平等でマスター、スレーブ関係はない (3)それぞれ送信側を制御し意図的に受信をする事はできない。 (その場合は相手に取り決めたコードを送ってデータを要求する) という感じでよろしいのでしょうか。 またPICの通信機能としてはSSPのSPIに近いような感じはしますがどちらが簡単でしょうか?

  • PICのSPI通信(ハード)

    PICのSPI通信の回路を本で見るとSDOとSDIをそのまま接続しているのが多いのですが一部にはSDO、SDI、SCKをプルアップするものがあります。I2Cの場合は2線ともプルアップするようですがSPIの場合はクロックの極性によって変える必要があるのではないかと思ったのですがどうなのでしょうか? クロック極性CKP=0(アイドル=Low)の時はプルダウンしておいた方が良いのではと。SDO、SDIも同様の方が良いのでしょうか? どちらかに固定しておかないと不安定になりそうな気がしますが。 またクロックは長いほうが安定してデータが送れるものなのでしょうか?(Fosc/4よりFosc/64の方がノイズ等には強い?) ちなみに現在使用中はマスター18F452でスレーブが16F877と16F88です。よろしく御願いします。

  • PICのSPI機能について

    PIC間で通信を行う場合CKP(アイドルレベル、アクティブレベル)はどちらでもいいのでしょうか?何か使い分けがあるのでしょうか? スレーブ側ではタイミングはあまり関係ないのでしょうか? 又SPI終了時の割り込みでスリープ解除になるのでしょうか?

  • PICのマスターとスレーブの切り替え

    PIC16F877を使っているのですが、I2Cを用いてPIC二台で通信をしようと思っております。 その中でマスターとスレーブをソフト的に切り替えて実行しようと思っています。そういったことは可能でしょうか? (もちろんマスター受信、スレーブ送信ができることは知っていますが、諸事情によりマスターとスレーブをソフト的に切り替えて、あるときはこっちがマスター、あるときはこっちがマスターということができたらと思っております)

  • PICのシリアル通信のWIN_APIプログラムについて

    PICとPCとのシリアル通信の WIN_APIプログラムについてどなたかご存知の方は教えてください. 現状,API関数を用いて,シリアル通信をできるようにプログラムを作成したのですが,送信はできるのですが,受信データが"C0"をPICから送付しているのに,"FFFFFFFC0"と受信されてしまいます. 先の"FFFFFFF"をとるにはどうしたらいいでしょうか? 現状:受信プログラム // シリアルポートに対する書き込み(PICに送信命令) WriteFile(hCom, w_com_Buf,lstrlen(w_com_Buf), &n, 0 ); // シリアルポートに対する読み込み ReadFile(hCom, s_com_Buf,1, &n, 0 ); mikroC上のUSARTターミナルでは送受信は適正で, 上記のプログラマで 送信はPIC側で受信していることは7SEGを使って確認しています. しかし,PC側では, s_com_Buf[0]には,"C0"が入ったり,"FFFFFFC0"が入ったりします. PICは現状,多チャンネルAD変換をしているため, 送信に対する受信データのやり取りができなくて困っています. どなたか先生教えてください.

  • PIC USART 全二重通信

    2つのPIC(A, B)間でUSART機能を使用し、全二重通信を行いたいと考えています。 PIC(A)で送信を開始し、同じタイミングでPIC(B)からのデータを受信したい場合、 PIC(B)は送信レジスタにデータを入れておくだけで自動的に送信されるされるのでしょうか?それとも、受信を開始した直後くらいに何か送信設定を行う必要があるのでしょうか?

  • ポインタで特定のアドレスにアクセスできるのでしょうか

    armadillo9(マスター)とFPGA(スレーブ)で、SPI通信をしようと思っています。 調べたのですが、PICなどのマイコンの通信方法がでてきて、Armadillo9上でC言語で通信する方法は見つかりませんでした。 おそらく、SPI1 Data Register(0x808A+0x08)というアドレスでデータを送受信するのではと考えたのですが、Cのポインタで特定のアドレスにアクセスすることは可能なのでしょうか? 冗長な質問ですがお願いいたします。

  • PIC18F2550でのUSARTの使い方について

    フリーのC18コンパイラで電子工作をしています。 今回18F2550でシリアル通信に挑戦していますが、自分の目的の動作のためのレジスタ設定が理解できません。教えて下さい。 動作内容はPICからシリアル通信でデータを送り12ビットシリアル-パラレル変換の「NJU3714」でシリパラ変換させることです。PICのデータ受信は今のところしないつもりです。

  • PIC16F877内蔵USARTが受信しない

    PIC16F877です。 [環境]  MPLAB IDE 6.6  CCS 3.15  WinXP sp3 送受信ピンは専用ピンに割り当て、内蔵USARTを使ってRS232C通信しています。 PICから相手機器にコマンド発行し、相手から応答データが帰ってきていますが、 kbhit()を確認してもHighになってくれません。 PIC入力ピンをオシロで当たって波形も確認済み、また信号ラインをシリアルモニタで 受信データラインを横取りして確認してもデータは正常に読み取れていますので、データは 正常だと思います。 同じような経験をお待ちの方はおられませんか? よろしくご教授、お願いします。