1818
1919#if defined(WIN32 ) // {
2020
21+ #ifndef NOMINMAX
2122#define NOMINMAX
23+ #endif
2224#include <windows.h>
2325
2426void ErrorExit (const char * func_name )
@@ -323,7 +325,7 @@ uint8_t i2c_reset(I2CDriver *sd)
323325
324326int i2c_start (I2CDriver * sd , uint8_t dev , uint8_t op )
325327{
326- uint8_t start [2 ] = {'s' , (dev << 1 ) | op };
328+ uint8_t start [2 ] = {'s' , (uint8_t )(( dev << 1 ) | op ) };
327329 writeToSerialPort (sd -> port , start , sizeof (start ));
328330 return i2c_ack (sd );
329331}
@@ -367,6 +369,56 @@ void i2c_monitor(I2CDriver *sd, int enable)
367369 charCommand (sd , enable ? 'm' : '@' );
368370}
369371
372+ void i2c_capture (I2CDriver * sd )
373+ {
374+ printf ("Capture started\n" );
375+ charCommand (sd , 'c' );
376+ uint8_t bytes [1 ];
377+
378+ int starting = 0 ;
379+ int nbits = 0 , bits = 0 ;
380+ while (1 ) {
381+ int i ;
382+ readFromSerialPort (sd -> port , bytes , 1 );
383+ for (i = 0 ; i < 2 ; i ++ ) {
384+ int symbol = (i == 0 ) ? (bytes [0 ] >> 4 ) : (bytes [0 ] & 0xf );
385+ switch (symbol ) {
386+ case 0 :
387+ break ;
388+ case 1 :
389+ starting = 1 ;
390+ break ;
391+ case 2 :
392+ printf ("STOP\n" );
393+ starting = 1 ;
394+ break ;
395+ case 8 :
396+ case 9 :
397+ case 10 :
398+ case 11 :
399+ case 12 :
400+ case 13 :
401+ case 14 :
402+ case 15 :
403+ bits = (bits << 3 ) | (symbol & 7 );
404+ nbits += 3 ;
405+ if (nbits == 9 ) {
406+ int b8 = (bits >> 1 ), ack = !(bits & 1 );
407+ if (starting ) {
408+ starting = 0 ;
409+ printf ("START %02x %s" , b8 >> 1 , (b8 & 1 ) ? "READ" : "WRITE" );
410+ } else {
411+ printf ("BYTE %02x" , b8 );
412+ }
413+ printf (" %s\n" , ack ? "ACK" : "NAK" );
414+ nbits = 0 ;
415+ bits = 0 ;
416+ }
417+ }
418+ }
419+ }
420+ }
421+
370422int i2c_commands (I2CDriver * sd , int argc , char * argv [])
371423{
372424 int i ;
@@ -479,6 +531,12 @@ int i2c_commands(I2CDriver *sd, int argc, char *argv[])
479531 }
480532 break ;
481533
534+ case 'c' :
535+ {
536+ i2c_capture (sd );
537+ }
538+ break ;
539+
482540 default :
483541 badcommand :
484542 fprintf (stderr , "Bad command '%s'\n" , token );
@@ -492,6 +550,7 @@ int i2c_commands(I2CDriver *sd, int argc, char *argv[])
492550 fprintf (stderr , " p send a STOP\n" );
493551 fprintf (stderr , " r dev N read N bytes from I2C device dev, then STOP\n" );
494552 fprintf (stderr , " m enter I2C bus monitor mode\n" );
553+ fprintf (stderr , " c enter I2C bus capture mode\n" );
495554 fprintf (stderr , "\n" );
496555
497556 return 1 ;
0 commit comments