Skip to content

Instantly share code, notes, and snippets.

@dj1711572002
Last active December 31, 2023 08:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dj1711572002/b7281b2cfdaf23dce42741a24b619788 to your computer and use it in GitHub Desktop.
Save dj1711572002/b7281b2cfdaf23dce42741a24b619788 to your computer and use it in GitHub Desktop.
SPI Test Pgm MASTER Teensy4.1 Arduino2.2
#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