Hello~ Rive
here is my sketch, but it is very…very stupid.
Sclk, Sload ,Sdo signals, you can refer to note : 1st 011 , 2nd 011 , 3rd 011, 4th 011
thank.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
// external interrupt------------
const int interruptNumber = 0;
const int button = 2;
volatile int buttonState;
//-----------------------
#define CLK 5 // <<<< define Sclk
#define SLOAD 3 // <<<< define SLOAD
#define SDO 4 /// <<<< define SDO
// #define button 0
// -------- Backplane LED frequency detect
#define FAIL_PIN1 8
#define FAIL_PIN2 10
#define FAIL_PIN3 11
#define FAIL_PIN4 13
#define READ_DELAY 10
// ------------------------------
static double duty;
static double freq1;
//static double FANspeed;
static long highTime = 0;
static long lowTime = 0;
static long tempPulse;
static long lastSeen;
// ---------------------------------------
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(" SGPIO LED TEST ");
delay (2000);
pinMode(button,INPUT);
attachInterrupt(interruptNumber, buttonStateChanged, CHANGE); // seting interrupt mode to change
// read backplane LED singal
pinMode(FAIL_PIN1,INPUT);
pinMode(FAIL_PIN2,INPUT);
pinMode(FAIL_PIN3,INPUT);
pinMode(FAIL_PIN4,INPUT);
// IPBI signal output
pinMode(CLK, OUTPUT);
pinMode(SLOAD, OUTPUT);
pinMode(SDO, OUTPUT);
// initialize IPBI signal to low when power on
digitalWrite(CLK,LOW);
digitalWrite(SLOAD,LOW);
digitalWrite(SDO,LOW);
pinMode(button, INPUT); // set pin to input
digitalWrite(button, HIGH); // turn on pullup resistors
}
void loop() {
lcd.clear();
// start read backplane LED signal , there have four signal from backplane
readPWM(FAIL_PIN1);
lcd.setCursor(0,0);
lcd.print("FQ1=");
lcd.print(freq1);
//lcd.print(" Hz");
lcd.setCursor(10,0);
lcd.print(" DT=");
lcd.print(duty);
//lcd.print(" %");
readPWM(FAIL_PIN2);
lcd.setCursor(0,1);
lcd.print("FQ2=");
lcd.print(freq1);
//lcd.print(" Hz");
lcd.setCursor(10,1);
lcd.print(" DT=");
lcd.print(duty);
//lcd.print(" %");
readPWM(FAIL_PIN3);
lcd.setCursor(0,2);
lcd.print("FQ3=");
lcd.print(freq1);
//lcd.print(" Hz");
lcd.setCursor(10,2);
lcd.print(" DT=");
lcd.print(duty);
//lcd.print(" %");
readPWM(FAIL_PIN4);
lcd.setCursor(0,3);
lcd.print("FQ4=");
lcd.print(freq1);
//lcd.print(" Hz");
lcd.setCursor(10,3);
lcd.print(" DT=");
lcd.print(duty);
//lcd.print(" %");
delay (800);
}
// ----------------------Delay //
void freq()
{
delayMicroseconds(100);
}
//----------------------------
// ----------------------Delay //
// SDO 011 rebuild //
void rebuild()
{
//START SLOAD BIT
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SLOAD,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SLOAD,LOW);
// END SLOAD
// -----------------1st SD0 011
digitalWrite(SDO,LOW); [color=red]// SDO 1st 0[/color]
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
//-------------------- [color=red]2nd 011[/color]
freq();
digitalWrite(CLK,HIGH);//SDO 2nd 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 2nd 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 1st 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
// -------------- [color=red]3rd 011 [/color]
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
// --------------[color=red] 4th 011[/color]
digitalWrite(CLK,HIGH);//SDO 4th 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 4th 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 4th 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
}
// ------- Locate 副程式 -----------------
void locate()
{
//START SLOAD BIT
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SLOAD,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SLOAD,LOW);
// END SLOAD
// -----------------1st SD0 011
digitalWrite(SDO,LOW); // SDO 1st 0
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
//-------------------- 2nd 011
freq();
digitalWrite(CLK,HIGH);//SDO 2nd 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 2nd 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 1st 1
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
// -------------- 3rd 011
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 3rd 1
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
// -------------- 4th 011
digitalWrite(CLK,HIGH);//SDO 4th 0
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 4th 1
digitalWrite(SDO,HIGH);
freq();
digitalWrite(CLK,LOW);
freq();
digitalWrite(CLK,HIGH);//SDO 4th 1
digitalWrite(SDO,LOW);
freq();
digitalWrite(CLK,LOW);
}
// ---------------------------------------------
//Takes in reading pins and outputs pwm frequency and duty cycle.
void readPWM(int readPin)
{
highTime = 0;
lowTime = 0;
lastSeen = millis();
while((millis()-lastSeen)<READ_DELAY)
{
tempPulse = pulseIn(readPin,HIGH,2000000);
if(tempPulse>highTime){
highTime = tempPulse;
}
}
lastSeen = millis();
while((millis()-lastSeen)<READ_DELAY)
{
tempPulse = pulseIn(readPin,LOW,2000000);
if(tempPulse>lowTime){
lowTime = tempPulse;
}
}
freq1 = ((double) 1000000)/(double (lowTime+highTime));
duty = (100*(highTime/(double (lowTime+highTime))));
}
void buttonStateChanged() {
buttonState = digitalRead(button);
if (buttonState == HIGH) {locate();} else {rebuild();}
}