AtmelマイコンのSPI通信で送信ができない

このQ&Aのポイント
  • ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。
  • ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]のcmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、
  • SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。
回答を見る
  • ベストアンサー

アトメルのマイコンで、SPI通信で送信ができない

現在ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。 (簡易的な通信の仕様) ・簡易的なパケットデータをラズパイ3側からSPI1の通信ポートからデータを送信。 ・ATxmega128A1側のSPIFポートでデータを受信して、受信内容に応じて1バイトデータをラズパイ3に返送します。 ・ラズパイ3側はパケットデータ3バイトで順番に0x02 -> 0x16 -> 0x00 と送信します。 ・ATxmega128A1側はこのパケットでATxmega128A1のPK1(76番ピン)の入力のH or Lの値をラズパイ3側に返送します。 ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]の cmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c こちらの140行目付近の case INPUT_CH18: testtest = get_ch18_Input(); if(testtest==0) { txdata=0x55; } else { txdata=0xaa; } get_ch18_Input()で入力ピンのPK1(76番ピン)のH or Lの値をとって、それによって、txdataに0x55 or 0xaaを入れているのですが、 そのデータを実際に送信しようと SPIF.DATA = txdata; while(!(SPIF.STATUS & 0x80)); dummy = SPIF.DATA; このようにコーディングしたのですが、データ送信されません。 SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。

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

  • ベストアンサー
  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.1

SPIスレーブはマスターからクロックをもらわないと送出できないのですが、ラズパイはちゃんと出してくれているのですか?

techhouse
質問者

お礼

回答頂きありがとうございます。一応SPI通信が出来るようになりました。原因が、コード内でのパケット数のカウントをクリアする箇所があるのですが、どうやら、このカウントのクリアのタイミングを間違ってしまって、プログラムの解釈で圧縮されてパケットが送信されないという現象のようでした。プログラムの書き方が汚かったかもしれません。 助かります。

関連するQ&A

  • atmegaxマイコンのPDI端子

    現在Atmel Studio6.2 + JTAGICE3でプログラミングを行っています。ATxmega64Aマイコンを使用してプログラミングを行っていこうと思っているのですが、ファームウェアの書き込みやデバッグなどを今まで使用していたATmega88マイコンなどではmiso,mosi端子などを使用して行っていましたが、ATxmega64AマイコンにはPDI,PDO端子というのが設けられていますが、 この端子だけでJTAGICE3でのファームウェアの書き込みやデバッグは可能でしょうか? miso,mosiの端子は書き込みやデバッグでは必要なくなり、SPI通信専用端子として使用できるようことでしょうか? どうぞ、ご教示頂きますよう、よろしくお願い致します。

  • PIC16F1823 SPI通信

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

  • ラズパイ3のSPI通信で文字列出力

    現在、ラズパイ3とアトメルのマイコン搭載の基板とをSPI通信で通信するためのコードをpythonで作成しています。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py 前回まで、サンプルのコードを参考に”hello”とい文字列をラズパイ3のSPI1ポートから出力していたのですが、 (中略) print "writing data" #hello spi (ASCII) data = [104, 101, 108, 111, 32] #str(spi.xfer2(data)) spi.xfer2(data) (中略) 文字列をSPIポートから出してみたいと思い、次のようにコードしました。 (中略) print "writing data" #hello spi (ASCII) data = "abcdefg" spi.xfer2(data) (中略) しかしこの場合、 $ sudo python test20161202.py test20161202.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(16, GPIO.OUT) writing data このようなエラーがでてpythonでコードを実行できません。 data = "abcdefg" このような文字配列で文字列を出力するコードを書くことはできないのか、ご教示よろしくお願い致します。

  • アトメルマイコンのSPI通信ISRルーチン書き方

    現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

  • SPI通信制御付きの音声ICをI2Cで制御可能?

    SPI通信のRX端子搭載で、音声の再生や停止などを制御できる音声ICをATMELのAtmega88Pというマイコンで行おうと思っているのですが、Atmega88PにはSPI機能の端子が1つだけで、デバッガの接続のみに専念させたいと考えています。 一応、空いている端子があるので、プログラムで擬似的にSPI通信の作ってそれで制御することを考えているのですが、Atmega88PのI2C端子も空いているのですが、これをSPIの送信のみに特化したような使い方はできますでしょうか? 確か、I2CはACKのビットが入ってきて、単純に1バイトを8ビットで送信するという感じではダメだったような気がするのですが、可能でしょうか? どうぞ、ご教示頂きますよう宜しくお願い致します。

  • PIC SPI通信

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

  • パケット通信

    C言語初心者です。 H8が乗っているコントローラとシリアル(RS232C)で繋がっている機器間で、 パケットを構成し通信したいのですが、そのパケットの快適な構成方法がわかりません。(コントローラ側のプログラムを作っています) イメージとしては構造体を使用すると快適なのかな?と思うのですが、 よくわかりません。 機器側のパケットは仕様があり、 スタートコード(2)-データ長(1)-データ長チェックサム(1)-データ(n)-データチェックサム(1) のような構成になっています。 ( )はバイト数です。 バイナリデータでの通信です。 データの先頭にコマンドコードがあり、機器の制御をするような感じです。 例えばですが、 typedef struct { unsigned char start[2];----->スタートコード(固定) unsigned char len;---------->データ長(変動) unsigned char len_cs;------->データ長チェックサム(計算) unsigned char data[SIZE];--->データの中身(変動) unsigned char data_cs;------>データチェックサム(計算) } packet; というようなやり方で、固定データや変動するデータを構造体として 使用することはできるのでしょうか? unsigned char cmd[] = {0x00,0x00,・・・・0x00} のように強引にスタートコードからデータ、チェックサムを 配列で並べて送信すると機器はちゃんと動作します。 (チェックサムの計算も電卓で計算してから書いてます) ただ、コマンドごとにこんなパケットを構成しないといけない のは手間ですし、何かブサイクに思えます。 快適なパケット作成の方法があればぜひ教えて下さい。 よろしくお願いします。

  • SDカードのSPI接続についての質問です。

    SDカードのSPI接続についての質問です。 初期化のプロセスで、 ”ACMD41”というコマンドがありますが、これはどの様なコードを送信するのでしょうか? 単純にCMD41と解釈して、0x69,0x00,0x00,0x00,0x00,0x01 を送信すればよいのでしょうか? SDカード(SDHCではない)を使用していますが、 たしか、レスポンスで不正コマンドのビットが立っていました。 雑誌”Interface”2010-7の解説には 「ACMD<n>とは、CMD55~CMDnのコマンドシーケンスを意味する」とありますが、 意味がよくわかりません。 よろしくお願いします

  • gmailから携帯メアドで送信時の通信料

    gmailから携帯電話(ドコモ)のアドレスを送信アドレスとして送信することができると思うのですが、 下記のサイトで紹介されている方法です。 http://www.shinojapan.biz/2009/10/skill/1680.html その時の通信料はドコモ側のメールの通信料としてパケットが発生しているのでしょうか? それとも、gmailからなので、通常のネット通信としてのみ(ウェブサイトをPCでみるためのもの)なのでしょうか? ドコモ側でのパケット通信料がかかるのかが知りたいです。 よろしくお願いします。

  • マイコンとVBの通信

    シリアル通信のプロトコルについてです。 うる覚えなのでうまく説明できませんが、ご了承ください。 数年前に、マイコン基板とパソコンを繋いでシリアル通信をしているのを見かけました。 パソコン側のソフトがビジュアルベーシックで作られていました。 「データで 0x7D を受信したら、7Dを 7Dと5D の2つのデータに別ける」 このようなことを聞きました。 7Dを 7Dと5D とは何のことか分かりません。 また、その値は7E 5E だったかも知れません。 この辺の通信について、ご存知の方ご教授ください。 よろしくお願いします。