Skip to content

Instantly share code, notes, and snippets.

@avtolstoy
Created February 21, 2016 19:56
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 avtolstoy/1bbd34a7e69f563d5d37 to your computer and use it in GitHub Desktop.
Save avtolstoy/1bbd34a7e69f563d5d37 to your computer and use it in GitHub Desktop.
#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