#include <WProgram.h>
#include <SPI.h>
#include <DmaSpi.h>
#define DMASIZE 255
#define cs_pin 10 //Chip select pin
uint8_t src[DMASIZE];
volatile uint8_t dest[DMASIZE];
volatile uint8_t dest0[DMASIZE];
volatile uint8_t dest1[DMASIZE];
SPISettings spiSettings;
byte read_cmd0[DMASIZE]={
0x03,0,0,0};
byte read_cmd1[DMASIZE]={
0x03,0,0,0x40};
byte sent[8]={
};
byte req[8]={
1,1,1,1,1,1,1,1};
uint32_t us1,us2,us3,us4,us0;
long prev1,prev2;
byte busy0;
byte printq[8]={
};
byte received_sample[8]={
};
///////////////////////////////////////////////////////////////////////////
void setSrc()
{
for (size_t i = 0; i < DMASIZE; i++)
{
// int r = random(0,255);
src[i] = i;
Serial.print(src[i],HEX);
Serial.print(" ");
}
Serial.println();
Serial.println("src'd");
}
void clrDest(uint8_t* dest_)
{
memset((void*)dest_, 0x00, DMASIZE);
}
//////////////////////////////s25fl commands
byte stat(){
SPI.beginTransaction(spiSettings);
digitalWrite (cs_pin, LOW);
SPI.transfer(0x05);
byte stat = SPI.transfer(0);
digitalWrite (cs_pin, HIGH);
SPI.endTransaction();
return stat;
}
void waitforit (){
while ((stat() & B0000001)==B00000001)
{
}
Serial.println("flash ready");
}
void write_enable(){
SPI.beginTransaction(spiSettings);
digitalWriteFast(cs_pin,LOW);
SPI.transfer(0x06);
digitalWriteFast(cs_pin,HIGH);
SPI.endTransaction();
waitforit();
}
///////////////////////////////////////////////////////////////////////////////
void setup()
{
randomSeed(A0);
while (!Serial) {
}
delay(100);
// Serial.println("jhey");
pinMode(cs_pin, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
delay(1000);
randomSeed(A1);
/** Prepare source and destination **/
setSrc();
clrDest((uint8_t*)dest);
Serial.flush();
/** set up SPI **/
SPI.begin();
write_enable();
SPI.beginTransaction(spiSettings); //errase first 64k
digitalWrite (cs_pin, LOW);
SPI.transfer(0xD8);
SPI.transfer(0);
SPI.transfer(0);
SPI.transfer(0);
digitalWrite (cs_pin, HIGH);
SPI.endTransaction();
waitforit ();
// Serial.println("errased");
write_enable();
SPI.beginTransaction(spiSettings); //write
digitalWrite (cs_pin, LOW);
SPI.transfer(0x02);
SPI.transfer(0);
SPI.transfer(0);
SPI.transfer(0);
SPI.transfer(src, DMASIZE);
digitalWrite (cs_pin, HIGH);
SPI.endTransaction();
waitforit ();
// Serial.println("written");
SPI.beginTransaction(spiSettings); //read
digitalWrite (cs_pin, LOW);
SPI.transfer(0x03);
SPI.transfer(0);
SPI.transfer(0);
SPI.transfer(0);
for (int i = 0; i < DMASIZE; ++i)
{
dest[i]=SPI.transfer(0);
}
digitalWrite (cs_pin, HIGH);
SPI.endTransaction();
waitforit ();
// Serial.println("read");
Serial.flush();
DMASPI0.begin();
DMASPI0.start();
ActiveLowChipSelect cs(10, SPISettings()); //cs seems to work
DmaSpi0::Transfer trans0(src, 1, dest);
trans0 = DmaSpi0::Transfer(read_cmd0, DMASIZE, dest, 0, &cs);
DMASPI0.registerTransfer(trans0);
while (trans0.done()==0){
};
for (int i = 4; i < 127+4; ++i)
{
Serial.print(dest[i]);
Serial.print(" ");
}
}
//////////////////////////////////////////////////////////////////////////
ActiveLowChipSelect cs(10, SPISettings());
DmaSpi0::Transfer trans0(read_cmd0, DMASIZE, dest0, 0, &cs);
DmaSpi0::Transfer trans1(read_cmd1, DMASIZE, dest1, 0, &cs);
void loop()
{
///Serial.println("start");
//Serial.print(trans0.busy()); Serial.println(" 0busy");
// Serial.print(trans1.busy()); Serial.println(" 1busy");
ActiveLowChipSelect cs(10, SPISettings());
if (trans0.busy()==0 && req[0]==1){
// Serial.println("Q 0 ");
us0=micros();
trans0 = DmaSpi0::Transfer(read_cmd0, DMASIZE-4, dest0, 0, &cs);
DMASPI0.registerTransfer(trans0);
sent[0]=1;
req[0]=0;
//Serial.print(micros()-us1);Serial.println(" 0 us");
}
if (trans1.busy()==0 && req[1]==1){
//Serial.println("Q 1 ");
us1=micros();
//ActiveLowChipSelect cs(10, SPISettings());
trans1 = DmaSpi0::Transfer(read_cmd1, DMASIZE, dest1, 0, &cs);
DMASPI0.registerTransfer(trans1);
sent[1]=1;
req[1]=0;
// Serial.print(micros()-us1);Serial.println(" 1 us");
}
if (trans0.busy()==0 && sent[0]==1){
uint32_t t2 = micros()-us0;
if ((millis()-prev2)>1000){
prev2=millis();
Serial.println("dest0: ");
for (int i = 4; i < 127+4; ++i)
{
Serial.print(dest0[i]);
Serial.print(" ");
}
Serial.println();
}
//Serial.print(t2);Serial.println(" us0");
sent[0]=0;
req[0]=1;
clrDest((uint8_t*)dest0);
//delay(1000);
}
if (trans1.busy()==0 && sent[1]==1){
uint32_t t3 = micros()-us1;
if ((millis()-prev1)>1000){
prev1=millis();
Serial.println("dest1: ");
for (int i = 4; i < 127+4; ++i)
{
Serial.print(dest1[i]);
Serial.print(" ");
}
Serial.println();
}
//Serial.print(t3);Serial.println(" us1");
sent[1]=0;
req[1]=1;
clrDest((uint8_t*)dest1);
//delay(1000);
}
// waste time
for (int i = 0; i < 100; ++i)
{
byte r,b,g;
r=(micros()>>24) & 127;
g=(micros()>>16) & 127;
b=(micros()>>8) & 127;
analogWrite(3,g);
analogWrite(4,b);
analogWrite(5,r);
}
}