MAX10 & Arduino SPI通信 (3)通信テスト【Arduino プログラム】

元記事はこちら

以下、プログラムとなります。

/**********************************************
Arduino nano SPI(Master)
SCK D13
MISO D12
MOSI D11
**********************************************/

#include <SPI.h>

#define SS_PIN 4

String inByte;
String buf;
int AD = 0;
int ADD = 0;
int RW = 0;
int RWD = 0;
int DA = 0;
int DAD = 0;

byte MOSI_Byte = 0;
byte MISO_Byte = 0;

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

  digitalWrite(SS_PIN, HIGH);

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

  Serial.println("/***************************/");
  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");

  Serial.println("/******** test CMD *********/");
  Serial.println("0001:LED test1");
  Serial.println("0002:LED test2");
  Serial.println("0003:DOT test1");
  Serial.println("0004:DOT test2");

  delay(100);
}

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

/**********************************************
FPGAテストコマンド
0001:LEDがR=>G=>Bの順に点灯
0002:DOTを5秒間、網目状に点灯
0003:DOTの網目状点灯を1秒ごとに反転
**********************************************/
  if(inByte.indexOf(',')==-1){
    if(inByte.startsWith("0001")){
      LED_test1();
    }else if(inByte.startsWith("0002")){
      LED_test2();
    }else if(inByte.startsWith("0003")){
      DOT_test1();
    }else if(inByte.startsWith("0004")){
      DOT_test2();
    }

    goto SPIend;
  }

/**********************************************
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(1) & ~0x30;
  }else if((buf.charAt(1) >= 'A') && (buf.charAt(1) <= 'F')){
    AD = (buf.charAt(1) & ~0x40)+9;
  }else if((buf.charAt(1) >= 'a') && (buf.charAt(1) <= 'f')){
    AD = (buf.charAt(1) & ~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(SS_PIN, LOW);    //SS 有効
  
  ADD = SPI.transfer(AD);//送受信処理
  
  RWD = SPI.transfer(RW);//送受信処理

  DAD = SPI.transfer(DA);//送受信処理
  
  digitalWrite(SS_PIN, HIGH);   //SS 終了

  Serial.print("write:");
  Serial.print(AD);
  Serial.print("read:");
  Serial.println(ADD);

  Serial.print("write:");
  Serial.print(RW);
  Serial.print("read:");
  Serial.println(RWD);

  Serial.print("write:");
  Serial.print(DA);
  Serial.print("read:");
  Serial.println(DAD);

  goto SPIend;

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

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

  SPIend:

  MOSI_Byte = 0;
  MISO_Byte = 0;

  inByte = '0';
}


void SPIset(int ad, int rw ,int da){
  digitalWrite(SS_PIN, LOW);
  SPI.transfer(ad);
  SPI.transfer(rw);
  MISO_Byte = SPI.transfer(da);
  digitalWrite(SS_PIN, HIGH);

  return MISO_Byte;
}

void LED_test1(){
  Serial.println("LED test1");
  for(int i=0;i<=5;i++){
    SPIset(0,1,255);
    delay(100);
    SPIset(0,1,0);
    SPIset(1,1,255);
    delay(100);
    SPIset(1,1,0);
    SPIset(2,1,255);
    delay(100);
    SPIset(2,1,0);
  }
}

void LED_test2(){

  for(int a=0;a<=2;a++){
    for(int d=0;d<=255;d++){
      SPIset(a,1,d);
      delay(5);
    }
    for(int d=255;d>=0;d--){
      SPIset(a,1,d);
      delay(5);
    }
  }

  delay(100);
  SPIset(0,1,0);
  SPIset(1,1,0);
  SPIset(2,1,0);
}

void DOT_test1(){
  Serial.println("DOT test1");
  SPIset(16,1,85);
  SPIset(17,1,170);
  SPIset(18,1,85);
  SPIset(19,1,170);
  SPIset(20,1,85);
  SPIset(21,1,170);
  SPIset(22,1,85);
  SPIset(23,1,170);
  SPIset(8,1,1);
  delay(5000);
  SPIset(8,1,0);
}

void DOT_test2(){
  Serial.println("DOT test2");
  SPIset(16,1,0);
  SPIset(17,1,0);
  SPIset(18,1,0);
  SPIset(19,1,0);
  SPIset(20,1,0);
  SPIset(21,1,0);
  SPIset(22,1,0);
  SPIset(23,1,0);
  
  SPIset(8,1,1);
  
  SPIset(16,1,85);
  SPIset(17,1,170);
  SPIset(18,1,85);
  SPIset(19,1,170);
  SPIset(20,1,85);
  SPIset(21,1,170);
  SPIset(22,1,85);
  SPIset(23,1,170);
  
  delay(1000);

  SPIset(16,1,170);
  SPIset(17,1,85);
  SPIset(18,1,170);
  SPIset(19,1,85);
  SPIset(20,1,170);
  SPIset(21,1,85);
  SPIset(22,1,170);
  SPIset(23,1,85);

  delay(1000);

  SPIset(16,1,85);
  SPIset(17,1,170);
  SPIset(18,1,85);
  SPIset(19,1,170);
  SPIset(20,1,85);
  SPIset(21,1,170);
  SPIset(22,1,85);
  SPIset(23,1,170);
  
  delay(1000);

  SPIset(16,1,170);
  SPIset(17,1,85);
  SPIset(18,1,170);
  SPIset(19,1,85);
  SPIset(20,1,170);
  SPIset(21,1,85);
  SPIset(22,1,170);
  SPIset(23,1,85);

  delay(1000);

  SPIset(8,1,0);
}

 

広告

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中