Created
February 21, 2016 19:56
-
-
Save avtolstoy/1bbd34a7e69f563d5d37 to your computer and use it in GitHub Desktop.
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 "application.h" | |
SYSTEM_MODE(MANUAL); | |
/* Define either MASTER or SLAVE operating mode */ | |
//#define MASTER | |
#define SLAVE | |
static uint8_t rx_buffer[64]; | |
static uint8_t tx_buffer[64]; | |
static volatile uint32_t select_state = 0x00; | |
static volatile uint32_t transfer_state = 0x00; | |
void onTransferFinished() { | |
digitalWriteFast(A0, HIGH); | |
transfer_state = 1; | |
} | |
/* *********************************************************************************************************** */ | |
#ifdef SLAVE | |
void onSelect(uint8_t state) { | |
if (state) | |
select_state = state; | |
} | |
/* executes once at startup */ | |
void setup() { | |
Serial.begin(9600); | |
SPI.onSelect(onSelect); | |
SPI.begin(SPI_MODE_SLAVE, A2); | |
memset(rx_buffer, 0, sizeof(rx_buffer)); | |
for (int i = 0; i < sizeof(tx_buffer); i++) | |
tx_buffer[i] = (uint8_t)i; | |
} | |
/* executes continuously after setup() runs */ | |
void loop() { | |
while (1) { | |
while(select_state == 0); | |
select_state = 0; | |
transfer_state = 0; | |
SPI.transfer(tx_buffer, rx_buffer, sizeof(rx_buffer), onTransferFinished); | |
while(transfer_state == 0); | |
if (SPI.available() > 0) { | |
Serial.printf("Received %d (0x%02x) bytes", SPI.available(), SPI.available()); | |
Serial.println(); | |
for (int i = 0; i < SPI.available(); i++) { | |
Serial.printf("%02x ", rx_buffer[i]); | |
} | |
Serial.println(); | |
// if (rx_buffer[transferLength - 1] != 0x00) { | |
// Serial.println("Error"); | |
// while(true); | |
// } | |
} | |
} | |
} | |
/* *********************************************************************************************************** */ | |
#else | |
/* *********************************************************************************************************** */ | |
static int random_range(int minVal, int maxVal) | |
{ | |
return rand() % (maxVal-minVal+1) + minVal; | |
} | |
/* executes once at startup */ | |
void setup() { | |
Serial.begin(9600); | |
SPI.begin(SPI_MODE_MASTER, A2); | |
memset(rx_buffer, 0, sizeof(rx_buffer)); | |
memset(tx_buffer, 0, sizeof(tx_buffer)); | |
uint32_t seed = millis(); | |
srand(seed); | |
} | |
/* executes continuously after setup() runs */ | |
void loop() { | |
while (1) { | |
int transferLength = random_range(1, sizeof(tx_buffer)); | |
for (int i = 0; i < transferLength; i++) | |
tx_buffer[i] = (uint8_t)(transferLength - i - 1); | |
memset(rx_buffer, 0, sizeof(rx_buffer)); | |
digitalWrite(A2, LOW); | |
delay(1); | |
transfer_state = 0; | |
SPI.transfer(tx_buffer, rx_buffer, transferLength, onTransferFinished); | |
while(transfer_state == 0); | |
digitalWrite(A2, HIGH); | |
Serial.printf("Sent %d (0x%02x) bytes, got back:", transferLength, transferLength); | |
Serial.println(); | |
for (int i = 0; i < transferLength; i++) { | |
Serial.printf("%02x ", rx_buffer[i]); | |
} | |
Serial.println(); | |
if (rx_buffer[transferLength - 1] != (uint8_t)(transferLength - 1)) { | |
Serial.println("Error"); | |
delay(1000); | |
} | |
delay(100); | |
} | |
} | |
/* *********************************************************************************************************** */ | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment