259 lines
4.5 KiB
C++
259 lines
4.5 KiB
C++
#include <SPI.h>
|
|
|
|
#define MODE 8
|
|
#define CONTROL 9
|
|
#define READ 0x08
|
|
#define RESET 7
|
|
|
|
#define DATASIZE 20
|
|
|
|
char data[DATASIZE] = {0x0,};
|
|
void iebus_init();
|
|
byte inline bitchange(byte b)
|
|
{
|
|
return b << 4;
|
|
}
|
|
|
|
|
|
#define REG_WRITE_CTR bitchange(0x0)
|
|
#define REG_WRITE_CMR bitchange(0x1)
|
|
#define REG_WRITE_UAR1 bitchange(0x2)
|
|
#define REG_WRITE_UAR2 bitchange(0x3)
|
|
#define REG_WRITE_SAR1 bitchange(0x4)
|
|
#define REG_WRITE_SAR2 bitchange(0x5)
|
|
#define REG_WRITE_MCR bitchange(0x6)
|
|
#define REG_WRITE_TBF bitchange(0xe)
|
|
|
|
|
|
#define REG_READ_STR (bitchange(0x0)|READ)
|
|
#define REG_READ_FLG (bitchange(0x1)|READ)
|
|
#define REG_READ_RDR1 (bitchange(0x2)|READ)
|
|
#define REG_READ_RDR2 (bitchange(0x3)|READ)
|
|
#define REG_READ_LDR1 (bitchange(0x4)|READ)
|
|
#define REG_READ_LDR2 (bitchange(0x5)|READ)
|
|
#define REG_READ_DAR1 (bitchange(0x6)|READ)
|
|
#define REG_READ_DAR2 (bitchange(0x7)|READ)
|
|
#define REG_READ_RCR (bitchange(0x8)|READ)
|
|
#define REG_READ_RBF (bitchange(0xe)|READ)
|
|
|
|
|
|
void setup (void) {
|
|
Serial.begin(9600); //set baud rate to 115200 for usart
|
|
|
|
SPI.begin ();
|
|
SPI.setClockDivider(SPI_CLOCK_DIV128);//divide the clock by 8
|
|
|
|
pinMode(MODE, OUTPUT);
|
|
pinMode(CONTROL, OUTPUT);
|
|
|
|
pinMode(RESET, OUTPUT);
|
|
|
|
digitalWrite(MODE, HIGH);
|
|
digitalWrite(CONTROL, HIGH);
|
|
|
|
|
|
digitalWrite(RESET, HIGH);
|
|
digitalWrite(SS, LOW);
|
|
|
|
iebus_init();
|
|
}
|
|
|
|
// avclan.deviceAddress = 0x360;
|
|
// avclan.broadcast = AVC_MSG_NORMAL;
|
|
// avclan.masterAddress = 0x0360;
|
|
// avclan.slaveAddress = 0x0140;
|
|
|
|
|
|
|
|
#define LOW_ADDR 0x0
|
|
#define HIGH_ADDR 0x36
|
|
|
|
|
|
|
|
struct _communicationFlag
|
|
{
|
|
bool RAWF;
|
|
bool TRRQ;
|
|
bool TRCF;
|
|
byte I;
|
|
bool RERQ;
|
|
byte RECF;
|
|
byte SIZE;
|
|
byte PW;
|
|
byte PR;
|
|
byte J;
|
|
bool MCRQ;
|
|
bool SDRQ;
|
|
bool CORQ;
|
|
bool MTRQF;
|
|
bool MRRQF;
|
|
bool STRQF;
|
|
bool SLREF;
|
|
}commFlag;
|
|
|
|
|
|
|
|
|
|
void iebus_init()
|
|
{
|
|
digitalWrite(RESET, LOW);
|
|
delay(10);
|
|
digitalWrite(RESET, HIGH);
|
|
delay(10);
|
|
|
|
dataWrite1byte(REG_WRITE_UAR1, LOW_ADDR << 4);
|
|
dataWrite1byte(REG_WRITE_UAR2, HIGH_ADDR);
|
|
dataWrite1byte(REG_WRITE_CMR, B10000000); //CMR 100000 b1 b0
|
|
|
|
flaginit();
|
|
}
|
|
void flaginit()
|
|
{
|
|
commFlag.RAWF = 0;
|
|
commFlag.TRRQ = 0;
|
|
commFlag.RERQ = 0;
|
|
commFlag.SIZE = 0;
|
|
commFlag.J = 1;
|
|
commFlag.PW = 0;
|
|
commFlag.PR = 0;
|
|
commFlag.MCRQ = 0;
|
|
commFlag.SDRQ = 0;
|
|
commFlag.CORQ = 0;
|
|
commFlag.MTRQF = 0;
|
|
commFlag.MRRQF = 0;
|
|
commFlag.STRQF = 0;
|
|
commFlag.SLREF = 0;
|
|
|
|
|
|
}
|
|
|
|
void iebus_transmission()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void iebus_reception()
|
|
{
|
|
|
|
}
|
|
void iebus_mastercomm()
|
|
{
|
|
|
|
}
|
|
void iebus_slavetransmission()
|
|
{
|
|
|
|
}
|
|
void iebus_command()
|
|
{
|
|
|
|
}
|
|
void iebus_loop()
|
|
{
|
|
if (commFlag.RAWF == 1)
|
|
{
|
|
iebus_init();
|
|
return;
|
|
}
|
|
|
|
if (commFlag.TRRQ == 1)
|
|
{
|
|
iebus_transmission();
|
|
commFlag.TRRQ = 0;
|
|
}
|
|
if (commFlag.RERQ == 1)
|
|
{
|
|
iebus_reception();
|
|
commFlag.RERQ = 0;
|
|
}
|
|
|
|
if (commFlag.MCRQ == 1)
|
|
{
|
|
iebus_mastercomm();
|
|
commFlag.MCRQ = 0;
|
|
}
|
|
|
|
if (commFlag.SDRQ == 1)
|
|
{
|
|
iebus_slavetransmission();
|
|
commFlag.SDRQ = 0;
|
|
}
|
|
|
|
if (commFlag.CORQ == 1)
|
|
{
|
|
iebus_command();
|
|
commFlag.CORQ = 0;
|
|
}
|
|
|
|
}
|
|
void dataWrite(char reg_addr, char *data, int datasize)
|
|
{
|
|
//data
|
|
for (int i = 0; i < datasize; i++)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
int dataRead(char reg_addr, char *data)
|
|
{
|
|
int size = 0;
|
|
|
|
return size;
|
|
}
|
|
|
|
byte dataRead1byte(char addr)
|
|
{
|
|
byte data;
|
|
// write the LTC CS pin low to initiate ADC sample and data transmit
|
|
digitalWrite(CONTROL, HIGH);
|
|
delay(5);
|
|
SPI.transfer(REG_READ_FLG); // Register Select
|
|
|
|
digitalWrite(CONTROL, LOW);
|
|
delay(5);
|
|
data = SPI.transfer(0x0); // read second 8 bits
|
|
// Serial.println(data); //0x2
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
void dataWrite1byte(char addr , char data)
|
|
{
|
|
digitalWrite(CONTROL, HIGH);
|
|
delay(5);
|
|
SPI.transfer(addr); // Register Select
|
|
|
|
digitalWrite(CONTROL, LOW);
|
|
delay(5);
|
|
SPI.transfer(data); // read second 8 bits
|
|
delay(5);
|
|
|
|
}
|
|
|
|
|
|
void loop (void) {
|
|
iebus_loop();
|
|
|
|
|
|
|
|
|
|
byte addr = 0x0;
|
|
byte data;
|
|
|
|
// SPI.beginTransaction(SPISettings(1000, MSBFIRST, SPI_MODE0));
|
|
// set speed bit format and clock/data polarity while starting SPI transaction
|
|
|
|
Serial.println(dataRead1byte(REG_READ_FLG));
|
|
|
|
// wite LTC CS pin high to stop LTC from transmitting zeros.
|
|
// SPI.endTransaction();
|
|
// close SPI transaction
|
|
delay(250);
|
|
// Delay that is fast but easy to read.
|
|
// delayMicroseconds(83);
|
|
// Delay that matches 12 khz delay time.
|
|
}
|