221 lines
No EOL
4.6 KiB
C++
221 lines
No EOL
4.6 KiB
C++
#include <SPI.h>
|
|
|
|
/* Cosmic Pi SPI test routines - Master version, slave is commented out below. Runs on an Arduino DUE,
|
|
* Pinouts:
|
|
* MOSI - MOSI
|
|
* MISO - MISO
|
|
* SCK - SCK
|
|
* Pin 10 - Pin 10 (SS)
|
|
* GND - GND
|
|
* 5V - 5V
|
|
*
|
|
* The slave echoes the master byte in the next (16 bit) transmission.
|
|
|
|
|
|
|
|
|
|
SPI COMMUNICATION TRANSACTION LIST OF COMMANDS
|
|
|
|
WRITE OPERATIONS (FOR EACH WRITE, SLAVE MUST SEND BACK THE VALUE IT RECEIVES)
|
|
|
|
01 WRITE MSB(16 high bits) HV1_DUTY_CYCLE
|
|
02 WRITE LSB(16 low bits) HV1_DUTY_CYCLE
|
|
03 WRITE MSB(16 high bits) HV2_DUTY_CYCLE
|
|
04 WRITE LSB(16 low bits) HV2_DUTY_CYCLE
|
|
05 WRITE 16 bits LED_DUTY_CYCLE
|
|
|
|
READ OPERATIONS (FOR EACH READ, SLAVE MUST SEND BACK THE VALUE OF THE RELATED REGISTER)
|
|
|
|
06 READ MSB(16 high bits) HV1_DUTY_CYCLE
|
|
07 READ LSB(16 low bits) HV1_DUTY_CYCLE
|
|
08 READ MSB(16 high bits) HV2_DUTY_CYCLE
|
|
09 READ LSB(16 low bits) HV2_DUTY_CYCLE
|
|
10 READ 16 bits LED_DUTY_CYCLE
|
|
|
|
11 WRITE STATUS
|
|
11 READ STATUS
|
|
|
|
|
|
*/
|
|
|
|
byte CMD=1;
|
|
|
|
unsigned int duty_cycle_LED = 81;
|
|
unsigned int duty_cycle_channel_A = 100000;
|
|
unsigned int duty_cycle_channel_B = 200000;
|
|
unsigned int MSB;
|
|
unsigned int LSB;
|
|
|
|
//unsigned int response = 0;
|
|
unsigned int answer = 0;
|
|
byte PSU_parametrized = 0;
|
|
|
|
void setup() {
|
|
|
|
pinMode(SS, OUTPUT);
|
|
|
|
SPI.begin();
|
|
SPI.setBitOrder(MSBFIRST);
|
|
//SPI.setClockDivider(SPI_CLOCK_DIV128 );
|
|
Serial.begin(9600);
|
|
|
|
//delay(500);
|
|
|
|
}
|
|
|
|
|
|
void loop() {
|
|
|
|
|
|
|
|
|
|
// WRITE OPERATIONS
|
|
Serial.println("******************* WRTTE OPERATIONS *************************");
|
|
|
|
/********************* HV1 DUTY CYCLE *********************************/
|
|
|
|
|
|
delay(20);
|
|
|
|
//MSB
|
|
MSB = duty_cycle_channel_A >> 16;
|
|
spi_exchange(1);
|
|
spi_exchange(MSB);
|
|
|
|
//LSB
|
|
LSB = duty_cycle_channel_A & 0x0000FFFF;
|
|
spi_exchange(1);
|
|
spi_exchange(LSB);
|
|
|
|
/********************* HV2 DUTY CYCLE *********************************/
|
|
//MSB
|
|
MSB = duty_cycle_channel_B >> 16;
|
|
spi_exchange(3);
|
|
spi_exchange(MSB);
|
|
|
|
//LSB
|
|
LSB = duty_cycle_channel_B & 0x0000FFFF;
|
|
spi_exchange(4);
|
|
spi_exchange(LSB);
|
|
|
|
|
|
/********************* LED DUTY CYCLE *********************************/
|
|
spi_exchange(5);
|
|
spi_exchange(duty_cycle_LED);
|
|
|
|
// READ OPERATIONS
|
|
Serial.println("******************* READ OPERATIONS *************************");
|
|
|
|
/********************* HV1 DUTY CYCLE *********************************/
|
|
//MSB
|
|
spi_exchange(6);
|
|
spi_exchange(255);
|
|
|
|
//LSB
|
|
CMD=7;
|
|
spi_exchange(CMD);
|
|
spi_exchange(255);
|
|
|
|
|
|
/********************* HV2 DUTY CYCLE *********************************/
|
|
//MSB
|
|
CMD=8;
|
|
spi_exchange(CMD);
|
|
spi_exchange(255);
|
|
|
|
//LSB
|
|
CMD=9;
|
|
spi_exchange(CMD);
|
|
spi_exchange(255);
|
|
|
|
/********************* LED DUTY CYCLE *********************************/
|
|
CMD=10;
|
|
spi_exchange(CMD);
|
|
spi_exchange(255);
|
|
|
|
/********* STATUS *******/
|
|
// WRITE
|
|
CMD=11;
|
|
spi_exchange(CMD);
|
|
spi_exchange(11);
|
|
|
|
// READ
|
|
CMD=12;
|
|
spi_exchange(CMD);
|
|
spi_exchange(255);
|
|
|
|
|
|
delay(4000);
|
|
|
|
|
|
}
|
|
|
|
int spi_exchange(int data){
|
|
digitalWrite(SS, LOW);
|
|
int response = SPI.transfer16(data);
|
|
Serial.println("Master send command:" + String(data) + " Slave reply:" + String(response));
|
|
digitalWrite(SS, HIGH);
|
|
delay(20);
|
|
return response;
|
|
}
|
|
|
|
/*Arduino SPI slave test code that I found on https://github.com/manitou48/DUEZoo/blob/master/spislave.ino
|
|
* Nice one Manitou, it worked first time
|
|
|
|
#include <SPI.h>
|
|
|
|
// assumes MSB
|
|
static BitOrder bitOrder = MSBFIRST;
|
|
|
|
void slaveBegin(uint8_t _pin) {
|
|
SPI.begin(_pin);
|
|
REG_SPI0_CR = SPI_CR_SWRST; // reset SPI
|
|
REG_SPI0_CR = SPI_CR_SPIEN; // enable SPI
|
|
REG_SPI0_MR = SPI_MR_MODFDIS; // slave and no modefault
|
|
REG_SPI0_CSR = SPI_MODE0; // DLYBCT=0, DLYBS=0, SCBR=0, 8 bit transfer
|
|
}
|
|
|
|
|
|
byte transfer(uint8_t _pin, uint8_t _data) {
|
|
// Reverse bit order
|
|
if (bitOrder == LSBFIRST)
|
|
_data = __REV(__RBIT(_data));
|
|
uint32_t d = _data;
|
|
|
|
while ((REG_SPI0_SR & SPI_SR_TDRE) == 0) ;
|
|
REG_SPI0_TDR = d;
|
|
|
|
while ((REG_SPI0_SR & SPI_SR_RDRF) == 0) ;
|
|
d = REG_SPI0_RDR;
|
|
// Reverse bit order
|
|
if (bitOrder == LSBFIRST)
|
|
d = __REV(__RBIT(d));
|
|
return d & 0xFF;
|
|
}
|
|
|
|
#define PRREG(x) Serial.print(#x" 0x"); Serial.println(x,HEX)
|
|
|
|
void prregs() {
|
|
Serial.begin(9600);
|
|
while(!Serial);
|
|
PRREG(REG_SPI0_MR);
|
|
PRREG(REG_SPI0_CSR);
|
|
PRREG(REG_SPI0_SR);
|
|
}
|
|
|
|
|
|
#define SS 10
|
|
void setup() {
|
|
slaveBegin(SS);
|
|
prregs(); // debug
|
|
}
|
|
|
|
void loop() {
|
|
byte in;
|
|
static byte out=0x83;
|
|
|
|
in = transfer(SS, out);
|
|
out = in;
|
|
}
|
|
|
|
*/ |