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を実行しています。