USIWire icon indicating copy to clipboard operation
USIWire copied to clipboard

test failure

Open trombik opened this issue 8 years ago • 2 comments

hi,

I am trying the provided tests but failed to reproduce reliable test results.

the setup:

  • arduino nano as master
  • attiny85 as slave
  • both are on a breadboard
  • the 5V power is provided by USB cable to nano
  • no other discrete parts

without modification to the example code, the test keeps failing. I guessed failures were caused by timing, and inserted some delay(). after trials and errors, sometimes, the test passes, but not always. do you see anything I am missing? AUX_Callback test fails in most cases, but now always. here is the diff, failed result, and successful one.

--- ../src/TestMaster/TestMaster.ino	2017-07-16 23:03:06.650753365 +0900
+++ src/TestMaster.ino	2017-07-17 00:29:23.520245148 +0900
@@ -611,7 +611,7 @@
     Wire.write(CONTROL_ADDR);
     Wire.write(AUX_STATE_ON << CONTROL_AUX_POS | slaveSleepMode);
     assertEqual(Wire.endTransmission(), 0);
-    delay(1);
+    delay(20);
     if (slaveSleepMode) delay(2);
     assertEqual(digitalRead(AUX_PIN), HIGH);
     // AUX pin low
@@ -619,7 +619,7 @@
     Wire.write(CONTROL_ADDR);
     Wire.write(AUX_STATE_OFF << CONTROL_AUX_POS | slaveSleepMode);
     assertEqual(Wire.endTransmission(), 0);
-    delay(1);
+    delay(20);
     if (slaveSleepMode) delay(2);
     assertEqual(digitalRead(AUX_PIN), LOW);
   }
@@ -639,8 +639,8 @@
       Wire.write(i);
     }
     assertEqual(Wire.endTransmission(), 3);
-    delay(1);
-    if (slaveSleepMode) delay(2);
+    delay(10);
+    if (slaveSleepMode) delay(20);
     assertEqual(digitalRead(AUX_PIN), HIGH);
     // AUX pin low
     Wire.beginTransmission(SLAVE_ADDR);
@@ -650,8 +650,8 @@
       Wire.write(i);
     }
     assertEqual(Wire.endTransmission(), 3);
-    delay(1);
-    if (slaveSleepMode) delay(2);
+    delay(10);
+    if (slaveSleepMode) delay(20);
     assertEqual(digitalRead(AUX_PIN), LOW);
   }
 }
@@ -672,8 +672,9 @@
     assertEqual(Wire.endTransmission(false), 0); // send no Stop Condition
     assertEqual(digitalRead(AUX_PIN), LOW); // still low
     Wire.beginTransmission(SLAVE_ADDR);
+    delay(10);
     assertEqual(Wire.endTransmission(false), 0); // repeat start
-    delay(1);
+    delay(10);
     if (slaveSleepMode) delay(2);
     assertEqual(digitalRead(AUX_PIN), HIGH);
     // request AUX pin low
@@ -684,7 +685,7 @@
     assertEqual(digitalRead(AUX_PIN), HIGH); // still high
     Wire.beginTransmission(SLAVE_ADDR);
     assertEqual(Wire.endTransmission(false), 0); // repeat start
-    delay(1);
+    delay(100);
     if (slaveSleepMode) delay(2);
     assertEqual(digitalRead(AUX_PIN), LOW);
   }
@@ -717,8 +718,8 @@
     assertEqual(digitalRead(AUX_PIN), LOW); // still low
     Wire.beginTransmission(SLAVE_ADDR);
     assertEqual(Wire.endTransmission(false), 0); // repeat start
-    delay(1);
-    if (slaveSleepMode) delay(2);
+    delay(10);
+    if (slaveSleepMode) delay(20);
     assertEqual(digitalRead(AUX_PIN), HIGH);
     // request AUX pin low
     Wire.beginTransmission(SLAVE_ADDR);
@@ -730,6 +731,7 @@
     assertEqual(Wire.endTransmission(false), 3); // send no Stop Condition
     assertEqual(digitalRead(AUX_PIN), HIGH); // still high
     Wire.beginTransmission(SLAVE_ADDR);
+    delay(10);
     assertEqual(Wire.endTransmission(false), 0); // repeat start
     delay(1);
     if (slaveSleepMode) delay(2);
@@ -752,12 +754,14 @@
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   // simple read
   assertEqual(Wire.requestFrom(SLAVE_ADDR, BYTE), BYTE);
+  delay(1000);
   assertEqual(digitalRead(AUX_PIN), HIGH); // high after read event
   // simple write
   Wire.beginTransmission(SLAVE_ADDR);
   Wire.write(BYTE_ADDR0);
   Wire.write(DATA1);
   assertEqual(Wire.endTransmission(), 0);
+  delay(100);
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   // read zero
   Wire.beginTransmission(SLAVE_ADDR);
@@ -769,6 +773,7 @@
   Wire.beginTransmission(SLAVE_ADDR);
   Wire.write(ZERO_ADDR);
   assertEqual(Wire.endTransmission(), 0);
+  delay(100);
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   //repeated start, read
   Wire.beginTransmission(SLAVE_ADDR);
@@ -810,6 +815,7 @@
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   // simple read
   assertEqual(Wire.requestFrom(SLAVE_ADDR, BYTE+1), BYTE+1);
+  delay(500);
   assertEqual(digitalRead(AUX_PIN), HIGH); // high after read event
   // simple write
   Wire.beginTransmission(SLAVE_ADDR);
@@ -819,7 +825,7 @@
     Wire.write(i);
   }
   assertEqual(Wire.endTransmission(), 3);
-  delayMicroseconds(100);
+  delayMicroseconds(1000);
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   // read zero
   Wire.beginTransmission(SLAVE_ADDR);
@@ -834,7 +840,7 @@
     Wire.write(i);
   }
   assertEqual(Wire.endTransmission(), 3);
-  delayMicroseconds(100);
+  delayMicroseconds(1000);
   assertEqual(digitalRead(AUX_PIN), LOW); // low after write event
   //repeated start, read
   Wire.beginTransmission(SLAVE_ADDR);
--- Miniterm on /dev/ttyUSB0  9600,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Sleep mode off!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off: .................... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ...FAILED!
0x0 != 0x1
Error state!
Sleep mode off!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off: .................... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ...FAILED!
0x0 != 0x1
Error state!
Sleep mode off!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off: .................... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ...FAILED!
0x0 != 0x1
Error state!
Sleep mode off!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off: .................... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ................... SUCCESS!
Fill_Slave_RX_Buffer: ...................... SUCCESS!
AUX_On_Off_Repeated_Start_NACK: ........................................... SUCCESS!
AUX_Callback_NACK: .................. SUCCESS!
AUX_On_Off_NACK: .................... SUCCESS!
All test finished!

Idle sleep mode!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off: .................... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ................... SUCCESS!
Fill_Slave_RX_Buffer: ...................... SUCCESS!
AUX_On_Off_Repeated_Start_NACK: ........................................... SUCCESS!
AUX_Callback_NACK: .................. SUCCESS!
AUX_On_Off_NACK: .................... SUCCESS!
All test finished!

Power down sleep mode!
Initialize all tests: . SUCCESS!
SMBus_Quick_Read_Command: . SUCCESS!
SMBus_Quick_Write_Command: . SUCCESS!
SMBus_Receive_Byte: .... SUCCESS!
SMBus_Send_Byte: . SUCCESS!
SMBus_Read_Byte: ... SUCCESS!
SMBus_Read_Word: .... SUCCESS!
SMBus_Write_Byte: .... SUCCESS!
SMBus_Write_Word: ..... SUCCESS!
SMBus_Process_Call: ........ SUCCESS!
SMBus_Block_Read: ................. SUCCESS!
SMBus_Block_Write: ................. SUCCESS!
SMBus_Block_Process_Call: ........................ SUCCESS!
SMBus_Quick_Read_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Quick_Write_Command_Wrong_Addr: ..... SUCCESS!
SMBus_Read_Byte_Multiple_Times: .................. SUCCESS!
Read_Too_Much: .... SUCCESS!
Read_Too_Less: ...................... SUCCESS!
Write_Too_Much: ............ SUCCESS!
Write_Too_Less: .......... SUCCESS!
AUX_On_Off_Repeated_Start: ........................................... SUCCESS!
AUX_Callback: ................... SUCCESS!
Fill_Slave_RX_Buffer: ...................... SUCCESS!
AUX_On_Off_Repeated_Start_NACK: ........................................... SUCCESS!
AUX_Callback_NACK: .................. SUCCESS!
All test finished!

trombik avatar Jul 16 '17 15:07 trombik

Hi, thank you for testing USIWire.

Unfortunately, I can confirm that the test not always run successfully. Tuning of the delay() may help. The current delay() values were tested with a ATTiny85 at 8 MHz. With these I can run at least 8 test in a row without any failure.

What clock you are using?

puuu avatar Jul 26 '17 06:07 puuu

I think it is 8 Mhz. but will double-check.

it is very helpful for a library to have tests (most of them do not), but it would be nicer if the test configuration was documented, such as the chips used as master and slave in the test, wiring, breadboard or not, etc.

trombik avatar Jul 28 '17 01:07 trombik