※ ChatGPTを利用し、要約された質問です(原文:アトメルのマイコンで、SPI通信で送信ができない)
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通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。
現在ラズパイ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通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。
お礼
回答頂きありがとうございます。一応SPI通信が出来るようになりました。原因が、コード内でのパケット数のカウントをクリアする箇所があるのですが、どうやら、このカウントのクリアのタイミングを間違ってしまって、プログラムの解釈で圧縮されてパケットが送信されないという現象のようでした。プログラムの書き方が汚かったかもしれません。 助かります。