Created
October 4, 2022 16:53
-
-
Save NP95/82ec0bee8a0b4fd0e6f9347b86a942e0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #define VERBOSE1 1 // for debug | |
| // Code for I2C interface. | |
| #include <Wire.h> | |
| // The red LED is controlled by pin 13. | |
| #define RED_LED 13 | |
| //Retimer Address | |
| #define Retimer_WriteAddress_0 0x18 | |
| #define Retimer_WriteAddress_1 0x1B | |
| #define Retimer_ReadAddress_0 0x18 | |
| #define Retimer_ReadAddress_1 0x1B | |
| //Register Addresses | |
| #define Broadcast_Enable 0xFF | |
| #define Channel_Registers 0x00 | |
| #define Preset_Signal_Detect 0x14 | |
| #define Override 0x09 | |
| #define VCO_Cap_Count 0x08 | |
| #define Divider_Select 0x18 | |
| #define Charge_Pump_Control 0x1B | |
| #define Loop_filter_DAC 0x1F | |
| #define PRBS_enable 0x1E | |
| #define Clock_enable 0x30 | |
| #define Output_Mux_PRBS_Gen 0x1E | |
| #define PRBS_Load 0x0D | |
| //Data | |
| #define Broadcast_Enable_Data 0x0C | |
| #define Reset_Channel_Registers_Data 0x04 | |
| #define Preset_Signal_Detect_Data 0x80 | |
| #define Divider_Select_Override_Data 0x04 | |
| #define VCO_Cap_Select_Override_Data 0x80 | |
| #define VCO_Cap_Count_Data 0x06 | |
| #define Divider_Select_Data 0x00 | |
| #define Charge_Pump_Down_Override_Data 0x08 | |
| #define Charge_Pump_Down_Enable_Data 0x00 | |
| #define Loop_filter_DAC_Override_Data 0x40 | |
| #define Loop_filter_DAC_Override_Value_Data 0x12 | |
| #define PRBS_enable_Data 0x10 | |
| #define Clock_enable_Data 0x0A | |
| #define Loopthr_select_override_Data 0x20 | |
| #define Output_Mux_PRBS_Gen_Data 0x80 | |
| #define PRBS_Load_Data 0x20 | |
| //Masks | |
| #define Broadcast_Enable_Mask 0xFF | |
| #define Reset_Channel_Registers_Mask 0x04 | |
| #define Preset_Signal_Detect_Mask 0x80 | |
| #define Divider_Select_Override_Mask 0x04 | |
| #define VCO_Cap_Select_Override_Mask 0x80 | |
| #define VCO_Cap_Count_Mask 0x1F | |
| #define Divider_Select_Mask 0x70 | |
| #define Charge_Pump_Down_Override_Mask 0x08 | |
| #define Charge_Pump_Down_Enable_Mask 0x03 | |
| #define Loop_filter_DAC_Override_Mask 0x40 | |
| #define Loop_filter_DAC_Override_Value_Mask 0x1F | |
| #define PRBS_enable_Mask 0x10 | |
| #define Clock_enable_Mask 0x0F | |
| #define Loopthr_select_override_Mask 0x20 | |
| #define Output_Mux_PRBS_Gen_Mask 0xE0 | |
| #define PRBS_Load_Mask 0x20 | |
| void setRegister(byte retimer_address,byte address,byte data,byte mask) | |
| { | |
| byte read1; | |
| byte read2; | |
| Wire.beginTransmission(retimer_address); | |
| Wire.write(address); | |
| Wire.write( (data) ); | |
| delay(100); | |
| Wire.write( (data) ); | |
| Wire.endTransmission( true ); | |
| Wire.beginTransmission(retimer_address); // select device with "beginTransmission()" | |
| Wire.write(address); // select starting register with "write()" | |
| Wire.endTransmission(); // end write operation, as we just wanted to select the starting register | |
| Wire.requestFrom(retimer_address, 1); // select number of bytes to get from the device (2 bytes in this case) | |
| read2= Wire.read(); // read next byte from the following register | |
| Serial.print(address); | |
| Serial.print(":"); | |
| Serial.println(read2); | |
| delay(1000); | |
| } | |
| // void readRegister(byte retimer_address,byte address) | |
| // { | |
| // } | |
| void PRBS31_Retimer_0() | |
| { | |
| setRegister(Retimer_WriteAddress_0,Broadcast_Enable,Broadcast_Enable_Data,Broadcast_Enable_Mask); | |
| setRegister(Retimer_WriteAddress_0,Channel_Registers,Reset_Channel_Registers_Data,Reset_Channel_Registers_Mask); | |
| setRegister(Retimer_WriteAddress_0,Preset_Signal_Detect,Preset_Signal_Detect_Data,Preset_Signal_Detect_Mask); | |
| setRegister(Retimer_WriteAddress_0,Override,Divider_Select_Override_Data,Divider_Select_Override_Mask); | |
| setRegister(Retimer_WriteAddress_0,Override,VCO_Cap_Select_Override_Data,VCO_Cap_Select_Override_Mask); | |
| setRegister(Retimer_WriteAddress_0,VCO_Cap_Count,VCO_Cap_Count_Data,VCO_Cap_Count_Mask); | |
| setRegister(Retimer_WriteAddress_0,Divider_Select,Divider_Select_Data,Divider_Select_Mask); | |
| setRegister(Retimer_WriteAddress_0,Override,Charge_Pump_Down_Override_Data,Charge_Pump_Down_Override_Mask); | |
| setRegister(Retimer_WriteAddress_0,Charge_Pump_Control,Charge_Pump_Down_Enable_Data,Charge_Pump_Down_Enable_Mask); | |
| setRegister(Retimer_WriteAddress_0,Override,Loop_filter_DAC_Override_Data,Loop_filter_DAC_Override_Mask); | |
| setRegister(Retimer_WriteAddress_0,Loop_filter_DAC,Loop_filter_DAC_Override_Value_Data,Loop_filter_DAC_Override_Value_Mask); | |
| setRegister(Retimer_WriteAddress_0,PRBS_enable,PRBS_enable_Data,PRBS_enable_Mask); | |
| setRegister(Retimer_WriteAddress_0,Clock_enable,Clock_enable_Data,Clock_enable_Mask); | |
| setRegister(Retimer_WriteAddress_0,Override,Loopthr_select_override_Data,Loopthr_select_override_Mask); | |
| setRegister(Retimer_WriteAddress_0,Output_Mux_PRBS_Gen,Output_Mux_PRBS_Gen_Data,Output_Mux_PRBS_Gen_Mask); | |
| setRegister(Retimer_WriteAddress_0,PRBS_Load,PRBS_Load_Data,PRBS_Load_Mask); | |
| } | |
| void PRBS31_Retimer_1() | |
| { | |
| setRegister(Retimer_WriteAddress_1,Broadcast_Enable,Broadcast_Enable_Data,Broadcast_Enable_Mask); | |
| setRegister(Retimer_WriteAddress_1,Channel_Registers,Reset_Channel_Registers_Data,Reset_Channel_Registers_Mask); | |
| setRegister(Retimer_WriteAddress_1,Preset_Signal_Detect,Preset_Signal_Detect_Data,Preset_Signal_Detect_Mask); | |
| setRegister(Retimer_WriteAddress_1,Override,Divider_Select_Override_Data,Divider_Select_Override_Mask); | |
| setRegister(Retimer_WriteAddress_1,Override,VCO_Cap_Select_Override_Data,VCO_Cap_Select_Override_Mask); | |
| setRegister(Retimer_WriteAddress_1,VCO_Cap_Count,VCO_Cap_Count_Data,VCO_Cap_Count_Mask); | |
| setRegister(Retimer_WriteAddress_1,Divider_Select,Divider_Select_Data,Divider_Select_Mask); | |
| setRegister(Retimer_WriteAddress_1,Override,Charge_Pump_Down_Override_Data,Charge_Pump_Down_Override_Mask); | |
| setRegister(Retimer_WriteAddress_1,Charge_Pump_Control,Charge_Pump_Down_Enable_Data,Charge_Pump_Down_Enable_Mask); | |
| setRegister(Retimer_WriteAddress_1,Override,Loop_filter_DAC_Override_Data,Loop_filter_DAC_Override_Mask); | |
| setRegister(Retimer_WriteAddress_1,Loop_filter_DAC,Loop_filter_DAC_Override_Value_Data,Loop_filter_DAC_Override_Value_Mask); | |
| setRegister(Retimer_WriteAddress_1,PRBS_enable,PRBS_enable_Data,PRBS_enable_Mask); | |
| setRegister(Retimer_WriteAddress_1,Clock_enable,Clock_enable_Data,Clock_enable_Mask); | |
| setRegister(Retimer_WriteAddress_1,Override,Loopthr_select_override_Data,Loopthr_select_override_Mask); | |
| setRegister(Retimer_WriteAddress_1,Output_Mux_PRBS_Gen,Output_Mux_PRBS_Gen_Data,Output_Mux_PRBS_Gen_Mask); | |
| setRegister(Retimer_WriteAddress_1,PRBS_Load,PRBS_Load_Data,PRBS_Load_Mask); | |
| } | |
| // void ReadSequence_1() | |
| // { | |
| // readRegister(Retimer_ReadAddress_0,Broadcast_Enable); | |
| // readRegister(Retimer_ReadAddress_0,Channel_Registers); | |
| // readRegister(Retimer_ReadAddress_0,Preset_Signal_Detect); | |
| // readRegister(Retimer_ReadAddress_0,Override); | |
| // readRegister(Retimer_ReadAddress_0,Override); | |
| // readRegister(Retimer_ReadAddress_0,VCO_Cap_Count); | |
| // readRegister(Retimer_ReadAddress_0,Divider_Select); | |
| // readRegister(Retimer_ReadAddress_0,Override); | |
| // readRegister(Retimer_ReadAddress_0,Charge_Pump_Control); | |
| // readRegister(Retimer_ReadAddress_0,Override); | |
| // readRegister(Retimer_ReadAddress_0,Loop_filter_DAC); | |
| // readRegister(Retimer_ReadAddress_0,PRBS_enable); | |
| // readRegister(Retimer_ReadAddress_0,Clock_enable); | |
| // readRegister(Retimer_ReadAddress_0,Override); | |
| // readRegister(Retimer_ReadAddress_0,Output_Mux_PRBS_Gen); | |
| // readRegister(Retimer_ReadAddress_0,PRBS_Load); | |
| // } | |
| // void ReadSequence_2() | |
| // { | |
| // readRegister(Retimer_ReadAddress_1,Broadcast_Enable); | |
| // readRegister(Retimer_ReadAddress_1,Channel_Registers); | |
| // readRegister(Retimer_ReadAddress_1,Preset_Signal_Detect); | |
| // readRegister(Retimer_ReadAddress_1,Override); | |
| // readRegister(Retimer_ReadAddress_1,Override); | |
| // readRegister(Retimer_ReadAddress_1,VCO_Cap_Count); | |
| // readRegister(Retimer_ReadAddress_1,Divider_Select); | |
| // readRegister(Retimer_ReadAddress_1,Override); | |
| // readRegister(Retimer_ReadAddress_1,Charge_Pump_Control); | |
| // readRegister(Retimer_ReadAddress_1,Override); | |
| // readRegister(Retimer_ReadAddress_1,Loop_filter_DAC); | |
| // readRegister(Retimer_ReadAddress_1,PRBS_enable); | |
| // readRegister(Retimer_ReadAddress_1,Clock_enable); | |
| // readRegister(Retimer_ReadAddress_1,Override); | |
| // readRegister(Retimer_ReadAddress_1,Output_Mux_PRBS_Gen); | |
| // readRegister(Retimer_ReadAddress_1,PRBS_Load); | |
| // } | |
| int pca9545a_write(byte i2c_addr, byte dat); | |
| int stat; | |
| // The setup function runs once when you press reset or power the board. | |
| void setup() { | |
| // Initialize the RED_LED pin as an output. | |
| pinMode(RED_LED, OUTPUT); | |
| pinMode(7, OUTPUT); | |
| digitalWrite(7, HIGH); | |
| pinMode(9, OUTPUT); | |
| digitalWrite(9, HIGH); | |
| // Join i2c bus. | |
| Wire.begin(); | |
| // Debug thru the IDE console. | |
| if (VERBOSE1 == 1) { | |
| while (!Serial); | |
| Serial.begin(9600); // start serial for output | |
| Serial.println("setup done."); | |
| Serial.println(); | |
| } | |
| PRBS31_Retimer_0(); | |
| PRBS31_Retimer_1(); | |
| } | |
| // the loop function runs over and over again forever | |
| void loop() { | |
| pca9545a_write(0x73,0x6); // enable channel 3 | |
| digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) | |
| delay(500); // wait for 1/2 second | |
| digitalWrite(13, LOW); // turn the LED off by making the voltage LOW | |
| delay(500); // wait for 1/2 second | |
| byte error, address; //variable for error and I2C address | |
| int nDevices; | |
| Serial.println("Scanning..."); | |
| nDevices = 0; | |
| for (address = 1; address < 127; address++ ) | |
| { | |
| // The i2c_scanner uses the return value of | |
| // the Write.endTransmisstion to see if | |
| // a device did acknowledge to the address. | |
| Wire.beginTransmission(address); | |
| error = Wire.endTransmission(); | |
| if (error == 0) | |
| { | |
| Serial.print("I2C device found at address 0x"); | |
| if (address < 16) | |
| Serial.print("0"); | |
| Serial.print(address, HEX); | |
| Serial.println(" !"); | |
| nDevices++; | |
| } | |
| else if (error == 4) | |
| { | |
| Serial.print("Unknown error at address 0x"); | |
| if (address < 16) | |
| Serial.print("0"); | |
| Serial.println(address, HEX); | |
| } | |
| } | |
| if (nDevices == 0) | |
| Serial.println("No I2C devices found\n"); | |
| else | |
| Serial.println("done\n"); | |
| delay(5000); // wait 5 seconds for the next I2C scan | |
| PRBS31_Retimer_0(); | |
| PRBS31_Retimer_1(); | |
| } | |
| int pca9545a_write(byte i2c_addr, byte dat) | |
| { | |
| Wire.beginTransmission(i2c_addr); // transmit to I2C device | |
| Wire.write(dat); // send byte | |
| stat = Wire.endTransmission(); // stop transmitting | |
| if (VERBOSE1 == 1) { | |
| Serial.print("I2C status = "); | |
| Serial.println(stat); // https://www.arduino.cc/en/Reference/WireEndTransmission | |
| } | |
| //if (stat == 0) { | |
| //Serial.print("I2C addr = "); | |
| //Serial.println(i2c_addr); | |
| //} | |
| Wire.requestFrom(i2c_addr,1); // request 1 byte from i2c device | |
| int c = Wire.read(); // receive a byte | |
| if (VERBOSE1 == 1) { | |
| Serial.print("c = "); | |
| Serial.println(c); | |
| } | |
| return(0); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment