Skip to content

I2C 抓包

PicoXTools I2C调试助手全新升级,新增I2C总线抓包功能!

C

#define BTN_UP_12    12
#define BTN_DOWN_23  23
#define CTRL_C  3


#define EV_DATA 0
#define EV_START 1
#define EV_STOP 3



int main(){
  i2c_sniffer_init();
  int i = 0;
  int nNum = 0;

  int buff[32];
  while(1){

    nNum = i2c_sniffer_peek();
    if(nNum <=0){
      sleep_ms_v(100);
      if (getchar_timeout_us(0) == CTRL_C){
        i2c_sniffer_deinit();
        return 0;
      }
      continue;
    }
    nNum = i2c_sniffer_read((int)&buff[0],32*4,0);
    

    for(i=0;i<nNum/4;i++){
      int msg = buff[i];
      /*
      第1字节为数据或 I2C 地址
      第3字节 
        bit0  ACK;  
        bit1  R/W;
        bit[2-7] 消息类型;
      */

      int Byte3= msg >> 24;
      int data = msg &0xff;
      
      int type = Byte3 >>6;
      int RW   = Byte3&0x2?1:0;
      int ACK  = Byte3&0x1?1:0;
      if(type == EV_START){
        printf("\r\n\033[31mS\033[39m\033[34m%02x\033[39m%s%s :",data,RW?"R":"W",ACK?"N":"\033[32mA\033[39m");
      }else if(type == EV_DATA){
        printf("%02x ",data);
      }else if(type == EV_STOP){
        printf("P");
      }
    }

  }
  return 0;
}