-
-
Save dj1711572002/b7281b2cfdaf23dce42741a24b619788 to your computer and use it in GitHub Desktop.
SPI Test Pgm MASTER Teensy4.1 Arduino2.2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> // SPIライブラリを導入 | |
//変数の設定 | |
static const int MSG_SIZE = 512;//データのサイズ(何バイト分か) | |
uint8_t s_message_buf[MSG_SIZE];//送信データバッファ用の配列 | |
uint8_t r_message_buf[MSG_SIZE];//受信データバッファ用の配列 | |
int checksum;//チェックサム計算用 | |
int dly=50; | |
int t0,t1,t1_1,t2,t3,n,errn; | |
int kaisu=10000; | |
//SPI通信設定のインスタンスを立てる | |
SPISettings mySPISettings = SPISettings(6000000, MSBFIRST, SPI_MODE3); | |
void setup() { | |
//SPI通信とシリアル通信の初期設定 | |
Serial.begin(115200); | |
pinMode (SS, OUTPUT); // スレーブ機器を起こす | |
SPI.begin(); // SPIの初期化 | |
delay(100); //シリアルの起動を安定させる(要調整) | |
Serial.println("SPI Master Start."); //シリアル始動のご挨拶 | |
//送受信バッファのリセット | |
memset(s_message_buf, 0, MSG_SIZE); | |
memset(r_message_buf, 0, MSG_SIZE); | |
} | |
void loop() { | |
Serial.println();//シリアルモニタ改行 | |
//送信データの作成 | |
checksum = 0; | |
for (int i = 0; i < MSG_SIZE-1; i++) { | |
s_message_buf[i] = uint8_t (i & 0xFF); | |
checksum += int(s_message_buf[i]); | |
} | |
checksum = (checksum ^ 0xFF) & 0xFF; //合計値を反転し、下位2ビットを取得 | |
s_message_buf[MSG_SIZE-1] = uint8_t (checksum);//末尾にチェックサムを追加 | |
//送信データの表示 | |
//Serial.print(" [Send] "); | |
//for (int i = 0; i < MSG_SIZE; i++) { | |
// Serial.print(uint8_t (s_message_buf[i])); | |
// Serial.print(","); | |
//} | |
//Serial.println(); | |
t0=millis(); | |
//SPI通信の開始 | |
SPI.beginTransaction(mySPISettings);//通信開始 | |
digitalWrite(SS, LOW); //スレーブ機器を起こす | |
//----------------kaisu --------------------------------------- | |
Serial.printf("START Kaisu=%d\n\r",kaisu); | |
while(n<kaisu){ | |
//送信の実施と同時に受信データを受信データ用配列に書き写す | |
t1_1=t1; | |
t1=micros(); | |
for ( int i = 0; i < MSG_SIZE; i++) { | |
r_message_buf[i] = SPI.transfer(s_message_buf[i]); //※送信と同時に受信データが返り値になる | |
//delayMicroseconds(50);//送受信時間調整用のディレイ | |
} | |
t2=micros(); | |
//受信データの表示 | |
//Serial.print(" [Rsvd] "); | |
// for (int i = 0; i < MSG_SIZE; i++) { | |
// Serial.print(uint8_t (r_message_buf[i])); | |
// Serial.print(","); | |
// } Serial.println(); | |
//受信データのチェックサム確認 | |
checksum = 0; | |
for (int i = 0; i < MSG_SIZE - 1; i++) {//受信データの末尾-1番までの値を合計 | |
checksum += int(r_message_buf[i]); | |
} | |
checksum = (checksum ^ 0xFF) & 0xFF; //合計値を反転し、下位2ビットを取得 | |
//Serial.print(" CKSUM: "); // チェックサムの正解を表示 | |
//Serial.println(uint8_t (r_message_buf[MSG_SIZE - 1])); | |
if (uint8_t (checksum) == uint8_t (r_message_buf[MSG_SIZE - 1])) {//チェックサムの正誤を表示 | |
//Serial.print(" OK!: "); Serial.println(uint8_t (checksum)); | |
} else { | |
errn++; | |
//Serial.print("****NG*: "); Serial.println(uint8_t (checksum)); | |
} | |
n++; | |
if(n%500==0){ | |
Serial.printf("n=,%d,errn=,%d,t1=,%d,t2=,%d,t2-t1=%d,t1-t1_1=,%d\n\r",n,errn,t1,t2,t2-t1,t1-t1_1); | |
} | |
//delay(dly); | |
delayMicroseconds(dly); | |
}//n<kiaisu | |
t3=millis(); | |
digitalWrite(SS, HIGH);//スレーブ機器を終了 | |
SPI.endTransaction();//SPIを解放 | |
int ts=t3-t0; | |
float speed=(float)(MSG_SIZE*10000)/(ts/1000); | |
Serial.printf("MASTER,errn=%d, size=%d,dly=,%d,ts=%d,Speed=%4.1f byte/sec\n\r",errn,MSG_SIZE,dly,ts,speed); | |
exit(0); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment