MAX10 & Arduino SPI通信 (2)Arduino側

前回の続きです。

Arduinoのプログラムは一応形にはなったので経過報告。

SPIは前回の通り3バイトでレジスタの読書きをするよう組みました。

ただ、Stringに慣れていないためint形に変換するのにちょっと苦労しました。

これでいいのか・・・?という感じです。

もっとスマートなやり方がありそうですが。

プログラミングをする


これで一応はMISO、MOSIは認識されています。

また、シリアルから書き込まれた16進データはintに変換できてるようです。

/**********************************************
Arduino nano SPI(Master)
**********************************************/

#include <SPI.h>

#define SS_PIN 4

String inByte;
String buf;
int AD = 0;
int RW = 0;
int DA = 0;

byte MOSI_Byte = 0;
byte MISO_Byte = 0;

void setup() {
  Serial.begin(115200);
  
  pinMode(SS_PIN,OUTPUT);

  SPI.setClockDivider(SPI_CLOCK_DIV2);
  
  SPI.begin();    //SPI有効

  Serial.println("START Arduino");
  Serial.println("SPI Master");
  Serial.println("8MHz");

  Serial.println("/******* SPI format ********/");
  Serial.println("write:[x,y,z]HEX");
  Serial.println("x=AD  : 0-FF");
  Serial.println("y=R/W : 00/01");
  Serial.println("z=DA  : 0-FF");

  delay(100);
}

void loop() {
  while(1){
    if(Serial.available() > 0) {
      inByte = Serial.readString();
      Serial.println(inByte);
      break;
    }
  }

/**********************************************
SPIデータ送信フォーマット
1Byte : bit0~7 AD
2Byte : bit7 HIGH write / LOW read
3Byte : bit0~7 DATA
AA,RW,DD
**********************************************/
  //AA
  buf = inByte.substring(0,inByte.indexOf(','));
  
  if((buf.charAt(1) >= '0') && (buf.charAt(1) <= '9')){
    AD = buf.charAt(0) & ~0x30;
  }else if((buf.charAt(1) >= 'A') && (buf.charAt(1) <= 'F')){
    AD = (buf.charAt(0) & ~0x40)+9;
  }else if((buf.charAt(1) >= 'a') && (buf.charAt(1) <= 'f')){
    AD = (buf.charAt(0) & ~0x60)+9;
  }else{
    goto FormatError;
  }
  if((buf.charAt(0) >= '0') && (buf.charAt(0) <= '9')){
    AD = AD + (buf.charAt(0) & ~0x30)*16;
  }else if((buf.charAt(0) >= 'A') && (buf.charAt(0) <= 'F')){
    AD = AD + ((buf.charAt(0) & ~0x40)+9)*16;
  }else if((buf.charAt(0) >= 'a') && (buf.charAt(0) <= 'f')){
    AD = AD + ((buf.charAt(0) & ~0x60)+9)*16;
  }else{
    goto FormatError;
  }

  Serial.print("AD:");
  Serial.print(buf);
  Serial.print(",");
  Serial.println(AD);

  //RW
  buf = inByte.substring(inByte.indexOf(',')+1,inByte.lastIndexOf(','));
  
  if((buf.charAt(1) >= '0') && (buf.charAt(1) <= '9')){
    RW = buf.charAt(1) & ~0x30;
  }else if((buf.charAt(1) >= 'A') && (buf.charAt(1) <= 'F')){
    RW = (buf.charAt(1) & ~0x40)+9;
  }else if((buf.charAt(1) >= 'a') && (buf.charAt(1) <= 'f')){
    RW = (buf.charAt(1) & ~0x60)+9;
  }else{
    goto FormatError;
  }
  if((buf.charAt(0) >= '0') && (buf.charAt(0) <= '9')){
    RW = RW + (buf.charAt(0) & ~0x30)*16;
  }else if((buf.charAt(0) >= 'A') && (buf.charAt(0) <= 'F')){
    RW = RW + ((buf.charAt(0) & ~0x40)+9)*16;
  }else if((buf.charAt(0) >= 'a') && (buf.charAt(0) <= 'f')){
    RW = RW + ((buf.charAt(0) & ~0x60)+9)*16;
  }else{
    goto FormatError;
  }

  Serial.print("RW:");
  Serial.print(buf);
  Serial.print(",");
  Serial.println(RW);

  //DD
  buf = inByte.substring(inByte.lastIndexOf(',')+1,inByte.lastIndexOf('\n'));
  
  if((buf.charAt(1) >= '0') && (buf.charAt(1) <= '9')){
    DA = buf.charAt(1) & ~0x30;
  }else if((buf.charAt(1) >= 'A') && (buf.charAt(1) <= 'F')){
    DA = (buf.charAt(1) & ~0x40)+9;
  }else if((buf.charAt(1) >= 'a') && (buf.charAt(1) <= 'f')){
    DA = (buf.charAt(1) & ~0x60)+9;
  }else{
    goto FormatError;
  }
  if((buf.charAt(0) >= '0') && (buf.charAt(0) <= '9')){
    DA = DA + (buf.charAt(0) & ~0x30)*16;
  }else if((buf.charAt(0) >= 'A') && (buf.charAt(0) <= 'F')){
    DA = DA + ((buf.charAt(0) & ~0x40)+9)*16;
  }else if((buf.charAt(0) >= 'a') && (buf.charAt(0) <= 'f')){
    DA = DA + ((buf.charAt(0) & ~0x60)+9)*16;
  }else{
    goto FormatError;
  }

  Serial.print("DA:");
  Serial.print(buf);
  Serial.print(",");
  Serial.println(DA);

/********  SPI START ********/

  digitalWrite(10, LOW);    //SS 有効
  
  SPIset(AD);    //送受信処理
  
  SPIset(RW);    //送受信処理

  SPIset(DA);    //送受信処理
  
  digitalWrite(10, HIGH);   //SS 終了

  goto SPIend;

/****************************/

  FormatError:
  Serial.println("Format Error");

  SPIend:

  MOSI_Byte = 0;
  MISO_Byte = 0;

  inByte = '0';
}

void SPIset(int data){
  MISO_Byte = SPI.transfer(data);
  Serial.print("read:");
  Serial.print(MISO_Byte);
  Serial.println();

  return MISO_Byte;
}

こんな感じです。

1回目はMAX10(未完成)に送信。
2回目はMOSI、MISOをループバックして受信確認しています。

2018-01-30

そうそう、SPIについて前に紹介した時抜けていたのがSSを有効にしていれば、連続で送信し続けられるという点です。

今回は3バイトのやりとりがありますので、SSを有効にした後は3回SPIを実行しています。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中