BI-Directional Clock (3 Wire Serial)

Hi all,

I am currently working with a 3 wire serial communication interface (SCLOCK, DIN, DOUT). I am having issues setting up the bidirectional SCLOCK. I am not sure how to achieve this in Arduino.

Any suggestions or literature on this topic would be very much appreciated.

Thanks in advance...

More information? Are you looking at async serial, SPI, I2C, or some other protocol?

Nick,

Thanks for your prompt response.

It looks to me as if it doesn't adhere to any well known serial interface (that I can think of)... I have been successful with reading the configuration register (verified on oscilloscope) through bit banging on the pin ports but that does not require the use of a bidirectional clock.

This is the module I am working with...

Any insight would be very appreciated.

Can I switch the PinMode outside of the setup?

Could this be done by adjusting the DDR of the PORT in the middle of a function?

You can change pinMode as many times as you want, where you want.

Would you suggest using the PinMode function over manipulating the I/O Register's & Ports?

I almost always use pinMode/digitalRead/digitalWrite unless I think that last microsecond will make a difference.

You get readability, portability (to other chips), faster programming etc.

The only time I fool with the ports for writing/reading is when time is absolutely critical - which isn't often.

Hi all,

Still having issues here.

Progress
I have been able to write data to the configuration register and read it back.
The data was clocked out of the transceiver using a clock coming from the micro.

Need Help
Where I run into issues is when SCLOCK needs to be bi-directional. Meaning SCLOCK needs to be used by both the controller and the transceiver.

After sending my request using the controller the transceiver needs to generate the SCLOCK so I can read back the tag data.

If anyone has a similar project or literature I can refer to regarding a possible solution I would greatly appreciate it.

Thanks,
Brian

**bump

Need Help
Where I run into issues is when SCLOCK needs to be bi-directional. Meaning SCLOCK needs to be used by both the controller and the transceiver.

I would suggest, if you are not already doing so, that you use an external pull-up resistor (say 10k ohms) to +5vdc on the SCLOCK line if you require bidirectional control, otherwise there is bound to be glitches as you switch from input to output modes on the arduino digital pin, and however your remote devices switches direction control

Lefty

purduefiji:
After sending my request using the controller the transceiver needs to generate the SCLOCK so I can read back the tag data.

You are bumping but not posting code. How are we supposed to help you with some hypothetical code?

Nick,
Attached is the code and a screen shot of the register read back.

I am writing a value 0x27 or 0010-0111 and then reading it back and verifying this value on the oscilloscope. I tried reading and storing this value using the controller but haven't had any luck there.

Any suggestions?

/*****************************************************
Purpose: Read/Write to RI-R6C-001A Register
*****************************************************/


int SCLK = 7; // SCLOCK
int DIN = 4; //Data from main controller to transceiver ic
int DOUT = 8; //Data from transceiver ic to main controller
/*****************************************************/
void setup()
{
  
  Serial.begin(9600);
  //Serial1.begin(9600);
  Serial.println("Setting up Serial I/O");
  
  pinMode(SCLK, OUTPUT);      // sets SCLK digital pin as output
  pinMode(DIN, OUTPUT);      //sets DIN digital pin as output
  pinMode(DOUT, INPUT);
 
 
 
/*****************************************************
Write configuration register command 0x7D
*****************************************************/
 Serial.println("Write 0x7D");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);

  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
 
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  
/*****************************************************
Write configuration register content 0x27
*****************************************************/
 Serial.println("Write content 0x27");
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  
  
 
/*****************************************************
Read configuration register command 0x71
*****************************************************/
Serial.println("Read Command 0x71");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);

  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  
/*****************************************************
Read back configuration register using controller clock = 0x27
*****************************************************/  
Serial.println("Read Register");
  digitalWrite(SCLK, HIGH);
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);

  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);

  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
}

void loop()
{
}

ReadRegister (1020 KB)

I can't see anywhere in the code below where you are reading anything:

  /*****************************************************
   * Read configuration register command 0x71
   *****************************************************/
  Serial.println("Read Command 0x71");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);

  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);

  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

There's a lot of digitalWrite, no digitalRead.

Nick,

Attached is code with digitalread as well as my output from the serial monitor.

I should be reading 0010-0111 but am instead reading 0001-0011.

/*****************************************************
Purpose: Read/Write to RI-R6C-001A Register
*****************************************************/


int SCLK = 7; // SCLOCK
int DIN = 4; //Data from main controller to transceiver ic
int DOUT = 3; //Data from transceiver ic to main controller
int val;
/*****************************************************/
void setup()
{
  
  Serial.begin(9600);
  //Serial1.begin(9600);
  Serial.println("Setting up Serial I/O");
  
  pinMode(SCLK, OUTPUT);      // sets SCLK digital pin as output
  pinMode(DIN, OUTPUT);      //sets DIN digital pin as output
  pinMode(DOUT, INPUT);      //sets the digital pin as input

/*****************************************************
Start Bit
*****************************************************/
  Serial.println("Start Bit");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

/*****************************************************
Write configuration register command 0x7D
Data - > MSB; Latched on Rising Clock Edge
*****************************************************/   
  Serial.println("Write 0x7D");
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);

  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1); 
  
/*****************************************************
Write configuration register content 0x27
This is the value I am storing in the register
*****************************************************/
  Serial.println("Write content 0x27");
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1); 
  
/*****************************************************
Stop Bit
*****************************************************/  
  Serial.println("Stop bit");
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  
 
/*****************************************************
Start Bit
*****************************************************/
  Serial.println("Start Bit");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

/*****************************************************
Read configuration register command 0x71
*****************************************************/
  Serial.println("Read Command 0x71");
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  
/*****************************************************
Read back configuration register using controller clock = 0x27
*****************************************************/  
Serial.println("Read Register");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(5);
Serial.println(digitalRead(DOUT)); //1
delayMicroseconds(1);
  //var = digitalRead(DOUT);  //read the pin and save it into var
  //Serial.println(var);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(5);
Serial.println(digitalRead(DOUT)); //2
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(5);
Serial.println(digitalRead(DOUT)); //3
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
Serial.println(digitalRead(DOUT)); //4
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
Serial.println(digitalRead(DOUT)); //5
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
Serial.println(digitalRead(DOUT)); //6
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
Serial.println(digitalRead(DOUT)); //7
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
Serial.println(digitalRead(DOUT)); //8
delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);

/*****************************************************
Stop Bit
*****************************************************/  
  Serial.println("Stop bit");
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);

}

void loop()
{
}

Output_SerialMonitor.png

purduefiji:
After sending my request using the controller the transceiver needs to generate the SCLOCK so I can read back the tag data.

Your code is not consistent with that remark.

  Serial.println("Read Register");
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(5);
  Serial.println(digitalRead(DOUT)); //1
  delayMicroseconds(1);

You are writing SCLK not reading it.

I strongly suggest you read up on doing loops. This is unnecessary to write 8 bits:

  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW); 
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //0
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  //1
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

That is just clutter. It hides what is really going on. Make a function that outputs a byte by looping through each bit.

Nick,

I wrote a loop to take care of the 8 bit commands. It works but I am open to suggestions if you can think of a more efficient way of doing this.

Attached is a screen shot of the program in action.
SCLK - Output Controller into Transceiver
DIN - Output Controller into Transceiver
DOUT- Output Transceiver into Controller

As of now I am using my logic analyzer to read the value. I have tried placing a digital read in between the clock pulses but it isn't that efficient. Any ideas of some other ways of reading the DOUT line?

/*****************************************************
Commands
*****************************************************/
int write_reg = 0x7D; //value to transmit, binary 0111-1101
int read_reg = 0x71;
int configure_register = 0x27;


/*****************************************************
Pins
*****************************************************/
int SCLK = 8; // SCLOCK
int DIN = 7; //Data from main controller to transceiver ic
int DOUT = 5; //Data from transceiver ic to main controller


void setup()
{
  
  Serial.begin(9600);
  
  pinMode(SCLK, OUTPUT);      // sets SCLK digital pin as output
  pinMode(DIN, OUTPUT);      //sets DIN digital pin as output
  pinMode(DOUT, INPUT);      //sets the digital pin as input
  
  
  write_configuration_register();
 
  read_configuration_register();

}




int write_configuration_register (void) {
  
  Serial.println("Write");
  //start sequence
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  
loopfunction(write_reg,8); //Write configuration register command 0x7D
delayMicroseconds(1);

digitalWrite(SCLK, LOW);
delayMicroseconds(1);
 
loopfunction(configure_register,8); //Write configuration register content 0x27
delayMicroseconds(1);  
 
  //Stop sequence
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
 
}


 
int read_configuration_register (void){
  Serial.println("read");
  //start sequence
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  digitalWrite(DIN, HIGH);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

  loopfunction(read_reg,8); //Read configuration register command 0x71
  delayMicroseconds(1);  
  
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);

//readback register  
  
  loopfunction(0x00,8);
  delayMicroseconds(1);
  
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  
  
  //Stop sequence
  digitalWrite(DIN, HIGH);  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);  
  delayMicroseconds(1);
  digitalWrite(DIN, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
}


int loopfunction (int data, int length)
{
  
  int length_test;
  
while (length != 0){
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  length_test = (data & 0x80);
  if (length_test == 0){
    digitalWrite(DIN, LOW);
  }else{
    digitalWrite(DIN, HIGH);
  }
  
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);
  delayMicroseconds(1);
  
  data = (data << 1);
  length--;
}
}
void loop()
{
}

Thank you,
Brian

WriteRead.jpg

Reading the line? Which on the rather hard-to-read screenshot shows a straight line?

For some reason I got trigger happy with the cropping.

Attached is the full screen capture.

Write_Read.jpg

Feel free to post a larger screenshot. My eyes aren't that good.

Maybe this will work better?