亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? level2.c

?? EM4094示例Firmware
?? C
字號:
/*
*-------------------------------------------------------------------------------
*--  RCSId: $Id: level2.c,v 1.33 2004-06-30 12:47:41+02 mjg Exp mjg $
*--         $Name:  $
*-------------------------------------------------------------------------------
*-- level2.c - Low level data transforming 
*-------------------------------------------------------------------------------
*-- $Log: level2.c,v $*-- Revision 1.33  2004-06-30 12:47:41+02  mjg*-- key selection extension*--*-- Revision 1.32  2004-05-31 16:41:51+02  mjg*-- single carrier too slow caused CRC errors, speeded up*--*-- Revision 1.31  2004-05-21 09:29:37+02  mjg*-- startup inventory, to toggle EAS off for EM4034*--
*-- Revision 1.30  2004-05-10 09:23:27+02  mjg
*-- to toggle EAS off
*--
*-- Revision 1.29  2004-05-07 08:10:25+02  mjg
*-- HW auth passed
*--
*-- Revision 1.28  2004-04-27 17:05:44+02  mjg
*-- to better test the design
*--
*-- Revision 1.27  2004-04-21 15:48:47+02  mjg
*-- FSK low data rate support
*--
*-- Revision 1.26  2004-04-21 13:05:21+02  mjg
*-- EOF ignored because of FSK and 4034 support
*--
*-- Revision 1.25  2004-04-13 11:21:39+02  mjg
*-- sync
*--
*-- Revision 1.24  2004-03-25 16:09:19+01  mjg
*-- to add delayed EOF feature
*--
*-- Revision 1.23  2004-03-25 15:13:23+01  mjg
*-- to add delayed EOF feature
*--
*-- Revision 1.22  2004-03-24 13:35:36+01  mjg
*-- error msg needs better handling
*--
*-- Revision 1.21  2004-03-15 16:59:06+01  mjg
*-- to check SPI
*--
*-- Revision 1.20  2004-02-16 08:04:11+01  mjg
*-- preliminary CD
*--
*-- Revision 1.18  2004-02-10 19:24:40+01  mjg
*-- FSK to add valid bits
*--
*-- Revision 1.17  2004-02-10 18:30:46+01  mjg
*-- dual carrier raw, decoded 1st try
*--
*-- Revision 1.16  2004-02-09 18:03:33+01  mjg
*-- raw dual carrier capture
*--
*-- Revision 1.15  2004-02-08 12:30:52+01  mjg
*-- Decode var removed, FSK polling added
*--
*-- Revision 1.14  2004-02-07 14:59:47+01  mjg
*-- Response parsing correction
*--
*-- Revision 1.13  2004-02-03 08:42:52+01  mjg
*-- hubneme II
*--
*-- Revision 1.12  2004-02-03 07:24:37+01  mjg
*-- fwd debug implemented and removed from being compiled
*--
*-- Revision 1.11  2004-01-19 14:08:05+01  mjg
*-- hubneme I
*--
*-- Revision 1.10  2004-01-14 14:57:35+01  mjg
*-- to Invenotry version 2
*--
*-- Revision 1.9  2003-12-11 17:37:20+01  mjg
*-- yes
*--
*-- Revision 1.8  2003-12-11 16:33:41+01  mjg
*-- 1TS gives too much responses, stayquiet ?
*--
*-- Revision 1.7  2003-12-10 08:15:48+01  mjg
*-- to add dbg code
*--
*-- Revision 1.6  2003-12-09 12:43:01+01  mjg
*-- to 1TS inventory
*--
*-- Revision 1.4  2003-12-09 12:42:44+01  mjg
*-- to 1TS inventory
*--
*-- Revision 1.3  2003-12-05 08:38:56+01  mjg
*-- write update
*--
*-- Revision 1.2  2003-12-04 15:58:08+01  mjg
*-- to write
*--
*-- Revision 1.1  2003-12-01 08:18:04+01  mjg
*-- single carrier low drate level1 ok
*--
*-- Revision 1.0  2003-11-26 09:01:02+01  mjg
*-- Initial revision
*--
*-------------------------------------------------------------------------------
*/

#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "level4.h"
#include "level3.h"
#include "level2.h"
#include "level1.h"

//--------------------------------------------------------------
//global variables

uint8_t bufferClean = 0;                     //flag for pre-cleaning

//struct {
//  uint8_t capture_data[CAPTURE_SIZE];          //captured and decoded data bits
//  uint8_t capture_valid[CAPTURE_SIZE];         //their valid bits
//} capture;
struct TCAPTURE capture;

uint8_t * forward_ptr;                       //ptr for forward message preparation

uint8_t data_buffer[CAPTURE_SIZE];           //array of forwarded bits XOR clean response data

#ifdef DEBUG
uint16_t solich = 0;
uint16_t offset = 0;
#endif

uint16_t fwd_delays[7] = { -81, -238, -384, -531, -679, -825, -972 };      //for 16MHz clock
uint16_t fwd_flow[9];

//--------------------------------------------------------------
//local variables

#define SPI_DELAY 5                          //dummy cycles of WaitSPI 

volatile uint8_t fwd_bit_phase;              //forwardlink bit phase
uint8_t fwd_bit_sz;                          //forwardlink bit counter
uint8_t * fwd_write_ptr;                     //forwardlink bit pointer

uint8_t field_stop;                          //next field stop in RF clocks

// ==================================================================
// Forward link interrupt routine (implements a final state machine)

SIGNAL (SIG_OVERFLOW1) {

  if (forward_link_type == 0x01) {           //1 from 4 type forwardlink

    switch (fwd_bit_phase) {

    case 4 :
      cbi( PORTC, MOD_PIN );

      if(fwd_bit_sz-- > 0) {                   //prepare next bit modulation
        TCNT1 = fwd_delays[(*fwd_write_ptr) * 2];
        fwd_bit_phase = 5;
      } else {                                 //EOF
        TCNT1 = fwd_delays[1];
//        TCNT1 = -226;
        fwd_bit_phase = 8;
//        cbi(PORTC, DBG_TRANS); 
      }
      break;

    case 5:
      sbi( PORTC, MOD_PIN );
      TCNT1 = fwd_delays[0];

      if((*fwd_write_ptr) == 3) {
        fwd_write_ptr++;
        fwd_bit_phase = 4;
      }
      else
        fwd_bit_phase = 6;
      break;

    case 6:
      cbi( PORTC, MOD_PIN );

      TCNT1 = fwd_delays[5 - ((*fwd_write_ptr++) * 2)]; 
      fwd_bit_phase = 4;
      break;

    case 12:                             //standalone EOF
      sbi( PORTC, MOD_PIN );

      TCNT1 = fwd_delays[0];
      fwd_bit_phase = 13;
      break;

    case 13:
      cbi( PORTC, MOD_PIN );

      TCNT1 = -755;
      fwd_bit_phase = 5;                 //generate 2nd standalone EOF pulse
      break;

    default :
      if (fwd_bit_phase < 9) {

        TCNT1 = fwd_flow[fwd_bit_phase];
        if (fwd_bit_phase & 1) 
          cbi( PORTC, MOD_PIN );
        else
          sbi( PORTC, MOD_PIN );
        fwd_bit_phase++;

      } else {
        TCCR1B = 0;                             //no clock T1
        cbi( PORTC, MOD_PIN );
        cbi(TIMSK, TOIE1 );                    //stop 
        cbi(TIFR, TOV1);                       //clear pending int
      }

      break;
    }
  
  } else {                                   //invalid modulation type
    TCCR1B = 0;                               //no clock T1
    cbi(TIMSK, TOIE1);                       //else stop
    cbi(TIFR, TOV1);                         //clear pending int
  };

}


// ==================================================================
// Forward Link setup function
// Requires: forwarLink_data filled with valid bits (1 bit per byte)
//           fwd_bit_count set with number of bits to be sent

void SendForward(uint8_t fwd_bit_count) {

  fwd_write_ptr = data_buffer;
  fwd_bit_sz = fwd_bit_count;
  fwd_bit_phase = 0;

  int i;
  for(i=0; i<9; i++) fwd_flow[i] = fwd_delays[0];
  fwd_flow[1] = fwd_delays[3];
  fwd_flow[3] = fwd_delays[1];

/*
  if (debug_mode == 1) {
    UDR = fwd_bit_sz;
    while (!(UCSRA & (1<<UDRE)))
      {} 

    for(i=0; i<fwd_bit_sz; i++) {
      UDR = data_buffer[i];
      while (!(UCSRA & (1<<UDRE)))
        {} 
    }
  }
*/

//  sbi(PORTD, DBG_TRANS); 


  TCNT1 = -256;                            //minimum startup pulse length
  cbi( PORTC, MOD_PIN );                   //notmod pulse
  sbi(TIMSK, TOIE1);
  TCCR1B = 1;                              //internal clock T1, RUN!

  // waiting for clearing TOIE1 => command sending
  while ( bit_is_set(TIMSK, TOIE1) != 0 )
    {
//      SetLEDOff();
//      SetLEDOn();
//      SetLEDOff();
    }
#if 0
//#ifdef DEBUG
  cbi(PORTC, DBG_TRANS); 
  sbi(PORTC, DBG_TRANS); 
  cbi(PORTC, DBG_TRANS); 
#endif
}

// ==================================================================
// EOF send function, assumes valid initialization by SendForward

void SendEOF(void) {

  fwd_write_ptr = data_buffer;
  fwd_bit_sz = 0;
  fwd_bit_phase = 5;

  PORTB = PINB ^ (1<<SDA_PIN);

  TCNT1 = -256;                            //minimum startup pulse length
  cbi( PORTC, MOD_PIN );                   //notmod pulse
  sbi(TIMSK, TOIE1);
  TCCR1B = 1;                              //internal clock T1, RUN!

  // waiting for clearing TOIE1 => command sending
  while ( bit_is_set(TIMSK, TOIE1) != 0 )
    {}

  PORTB = PINB ^ (1<<SDA_PIN);
}

// ==================================================================
// prepares data bit pairs
// see EM4x35 uplink spec

uint8_t Prepare_Data( uint8_t data ) {

  register uint8_t i;

  for(i=0; i<4; i++) {
    *forward_ptr++ = data & 3;
    data >>= 2;
  }

  return 4;                             //return number of emited bits
}


// ==================================================================

void ClearCaptureBuffers(void) {
  uint8_t i;
  for(i=0; i<CAPTURE_SIZE; i++) {
    capture.capture_data[i] = 0;
    capture.capture_valid[i] = 0xFF;
  }
  bufferClean = 1;
}


// ==================================================================

void WaitSPI(void) {
  int register x = SPI_DELAY;
  while(x-->0)
    {}
}

// ==================================================================

void WriteSPI(uint16_t low, uint16_t hi) {

  int16_t data = low;  
  uint8_t bitcnt = 32;  

  //SPI start event
  cbi(PORTC, MOD_PIN);
  WaitSPI();
  sbi(PORTC, DCLK_PIN);
  WaitSPI();
  sbi(PORTC, MOD_PIN);
  WaitSPI();

  while (bitcnt-- > 0) {

    cbi(PORTC, DCLK_PIN);
    WaitSPI();
  
    if(data & 1) sbi(PORTC, MOD_PIN); else cbi(PORTC, MOD_PIN);
    WaitSPI();
  
    data >>= 1;
    if(bitcnt == 16)
      data = hi;
  
    sbi(PORTC, DCLK_PIN);
    WaitSPI();
  }

  cbi(PORTC, DCLK_PIN);              //for the first time, DCLK is '1', for the next, enable DIN
  WaitSPI();
  cbi(PORTC, MOD_PIN);
}

// ==================================================================

uint16_t CRC(uint8_t *data, uint8_t len) {

  uint16_t crc = 0xFFFF;        //CRC preset
  int i, j;
  const uint16_t poly = 0x8408; //CRC polynom

  for (i=0;i<len;i++) {
    crc ^= data[i];

    for (j=0; j<8; j++)
      if (crc&1)
        crc = (crc>>1) ^ poly;
      else
        crc = (crc>>1);
  }
  return ~crc;
}


// ==================================================================
// Search 1st valid bit ('1' from SOF)
//   maximum size bits to be searched from start position to end position
//
//  ASK data usually starts at bit position 0 or 1 of captured_data
//  FSK data usually starts at 4th bit position 

uint8_t SearchValidBit( uint8_t start, uint8_t end ) {

  uint8_t bitcnt = start % 8;
  uint8_t byte = start / 8;
  uint8_t valid;

  if ((decode_number & 1) == 0) {              //ASK specific

    while (start < end) {
     
      valid = (capture.capture_valid[byte] >> (7-bitcnt)) & 1;
     
      if (valid == 0) return start;  //return 1st valid bit position

      if (bitcnt == 7) {
        bitcnt = 0;
        byte++;
      } else
        bitcnt++;

      start++;
    }

  } else {                                    //FSK specific
    
    if ((capture.capture_data[byte] & 0xF0) == 0x50) 
      if ((capture.capture_valid[byte] & 0xF0) == 0)
        return 3;

    if ((capture.capture_data[byte] & 0x78) == 0x28) 
      if ((capture.capture_valid[byte] & 0x78) == 0)
        return 4;
  }

  return 255;                               //no valid bit
}


// ==================================================================
// Extracts decoded data to bytes accroding to start position
//   valid start range is < 255 

uint8_t ExtractData( uint8_t size ) {

  uint8_t value = 0;
  uint8_t valid;
  uint8_t pom;  
  uint8_t start;
  uint8_t bitcnt;
  uint8_t ptr = 0;  

  pom = SearchValidBit( 0, 7 );             //find the first valid bit in 0th byte of capture_valid
  if (pom == 255) return size;
  start = pom;

#if 0
//#ifdef DEBUG
    UDR = size;
    while (!(UCSRA & (1<<UDRE)))
      {} 
    UDR = start;
    while (!(UCSRA & (1<<UDRE)))
      {} 
#endif

  bitcnt = start % 8;                                     //set the pointers
  start = start / 8;

  pom = (capture.capture_data[start] >> (7-bitcnt)) & 1;          //check the 1st bit is '1'
  if (pom != 1) return size;

  while (size > 0) {

    if (bitcnt == 7) {                                    //increment position to next bit
      bitcnt = 0;
      start++;
    } else
      bitcnt++;
     
    pom = (capture.capture_data[start] >> (7-bitcnt)) & 1;
    value >>= 1;

    if (pom != 0) value |= 0x80;      
    valid = (capture.capture_valid[start] >> (7-bitcnt)) & 1;

    if(valid != 0)
      break;

    size--;

#if 0
//#ifdef DEBUG
      UDR = ptr;
      while (!(UCSRA & (1<<UDRE)))
        {} 
      UDR = value;
      while (!(UCSRA & (1<<UDRE)))
        {} 
#endif

    data_buffer[ptr/8] = value >> (7-(ptr%8));              //always store the byte (for inventory)
    ptr++;
  }
  return size;
}

// ==================================================================

void WaitCPLD(void) {
  int register x = 5;
  while(x-->0)
    { asm ( "nop" ); }
}

// ==================================================================

void HWTransaction(uint8_t *data, uint8_t *dst, uint8_t len) {

  uint8_t read = 7;
  uint8_t byte = 7;
  uint8_t cnt = 7;

  while (len-->0) {

    if (++cnt==8) {
      cnt = 0;
      byte = *data++;
    }

    if(byte & 1) SetSDA(); else ResetSDA();
    byte >>= 1;

    read = (read >> 1) | ((PINB << (7-SDO_PIN)) & 0x80);
    if (cnt==7) {
      *dst++ = read ^ 0xFF;
    }

    SetSCK();
    WaitCPLD();

    ResetSCK();
  }

  SetSSN();
}


// ==================================================================

void HWSign(uint8_t *data, uint8_t *dst, uint8_t len) {

  uint8_t read = 7;
  uint8_t byte = 7;
  uint8_t cnt = 7;

  while (len-->0) {

    if (++cnt==8) {
      cnt = 0;
      byte = *data++;
    }

    if(byte & 1) SetSDA(); else ResetSDA();
    byte >>= 1;

    WaitCPLD();
    SetSCK();
    WaitCPLD();

    read = (read >> 1) | ((PINB << (7-SDO_PIN)) & 0x80);
    ResetSCK();    
    if (cnt==7)
      *dst++ = read ^ 0xFF;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美影视一区二区三区| 丝袜美腿成人在线| 亚洲精品美腿丝袜| 亚洲一二三四区| 天堂蜜桃91精品| 一区二区三区四区激情| 精品免费国产二区三区| 欧美一级国产精品| 在线免费观看成人短视频| 91论坛在线播放| 91影院在线观看| 99re成人在线| 99热这里都是精品| 国产伦理精品不卡| 国产一级精品在线| 国产一区二区调教| 日本女优在线视频一区二区| 成人欧美一区二区三区视频网页| 欧美日韩一区三区四区| 六月婷婷色综合| 国产在线视频精品一区| 色www精品视频在线观看| 久久激五月天综合精品| 五月婷婷欧美视频| 麻豆91在线播放| 亚洲欧美日韩电影| 欧美精品一区二区三区久久久| 91美女片黄在线| 91久久香蕉国产日韩欧美9色| 色猫猫国产区一区二在线视频| 亚洲精品一区二区三区在线观看| 久久夜色精品国产噜噜av| 午夜一区二区三区视频| 在线免费观看日韩欧美| 国产精品久久久久久久久久久免费看| 国内精品伊人久久久久av影院| 在线视频亚洲一区| 中文字幕五月欧美| 99久久精品国产精品久久| 亚洲精品一区二区三区蜜桃下载| 免费在线视频一区| 日韩精品一区二区三区四区视频 | 国产91精品久久久久久久网曝门| 国产91丝袜在线18| 成人午夜看片网址| 欧美日韩在线综合| 国产精品全国免费观看高清| 午夜av电影一区| 免费成人美女在线观看| 日本高清不卡视频| 久久一日本道色综合| 亚洲大片精品永久免费| 国产乱码精品1区2区3区| jizz一区二区| 91精品国产综合久久精品app | ㊣最新国产の精品bt伙计久久| 91欧美激情一区二区三区成人| 九九视频精品免费| 在线影院国内精品| 亚洲美女在线国产| 99久久综合色| 日本一区二区三区久久久久久久久不| av不卡在线播放| 一区二区欧美在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 亚洲日本乱码在线观看| 在线一区二区观看| 成人h动漫精品| 精品写真视频在线观看| 日韩美女视频19| 成人综合婷婷国产精品久久 | 国模冰冰炮一区二区| 91浏览器打开| 亚洲精品欧美激情| eeuss鲁片一区二区三区在线看| 久久综合久久久久88| 狠狠色丁香婷综合久久| 2020国产精品久久精品美国| 国产一区二区在线影院| 精品久久久久一区| 成人精品一区二区三区中文字幕 | 日本不卡在线视频| 色狠狠av一区二区三区| 一区二区三区高清| 成人伦理片在线| 一区二区三区影院| 国产精品乱人伦一区二区| 91精品国产欧美一区二区| 一区二区在线免费观看| 一本到高清视频免费精品| 久久亚洲精品小早川怜子| 国内外成人在线| 亚洲另类在线视频| 欧美一区二区三区四区五区| 成人一区二区在线观看| 国产成人综合亚洲91猫咪| 亚洲伦在线观看| 亚洲精品欧美在线| 亚洲摸摸操操av| 亚洲国产毛片aaaaa无费看| 一区二区三区波多野结衣在线观看 | 国产精品看片你懂得| 日韩亚洲欧美在线| 欧美mv和日韩mv的网站| 精品1区2区在线观看| 欧美国产日韩一二三区| 久久这里只有精品视频网| 99热在这里有精品免费| 蜜桃一区二区三区在线观看| 亚洲天堂网中文字| 久久久久久免费毛片精品| 欧美日韩aaaaa| 91一区二区三区在线观看| 国产一区二区女| 日本aⅴ精品一区二区三区| 国产精品伦一区二区三级视频| 欧美蜜桃一区二区三区| 色素色在线综合| 成人在线视频一区| 国产91露脸合集magnet| 麻豆精品视频在线观看视频| 亚洲综合色视频| 亚洲一区在线观看视频| 国产精品欧美精品| 久久久精品欧美丰满| 欧美色手机在线观看| 精品国产a毛片| 国产精品久久久久四虎| 欧美日本一区二区在线观看| 色哟哟精品一区| 欧美日韩久久一区二区| 精品国产露脸精彩对白| 中文字幕第一页久久| 国产精品久久久久一区| 亚洲国产视频在线| 亚洲地区一二三色| 一区二区三区欧美在线观看| 日本女人一区二区三区| 亚洲欧美国产毛片在线| 国产日韩欧美制服另类| 欧美高清视频一二三区 | 偷拍日韩校园综合在线| 美女在线视频一区| 99精品欧美一区二区蜜桃免费| 欧美精品一区二区蜜臀亚洲| 日本一区二区三区视频视频| 久久精品国产成人一区二区三区| 在线日韩一区二区| 国产女人18毛片水真多成人如厕 | 欧美一级免费观看| 亚洲成人av一区二区三区| 91免费在线播放| 亚洲一区国产视频| 欧美乱熟臀69xxxxxx| 亚洲国产综合色| 日韩视频一区二区| 国产精品久久久久一区| 久久se这里有精品| 国产成人综合视频| 欧美日韩高清一区二区不卡| 久久久久久久国产精品影院| 午夜av一区二区三区| 在线观看av一区| 国产精品美女一区二区三区| 韩国精品在线观看| 欧美日韩精品综合在线| 国产精品午夜春色av| 麻豆精品视频在线观看| 色www精品视频在线观看| 精品国产一区二区三区久久影院| 一区二区三区不卡视频在线观看| 国产精品1区2区3区| 欧美日韩国产一级片| 亚洲免费色视频| 99热国产精品| 国产精品国产精品国产专区不片| 麻豆成人久久精品二区三区红| 欧美群妇大交群中文字幕| 国产精品自拍三区| 国产精品卡一卡二| 紧缚奴在线一区二区三区| 91麻豆精品国产91久久久久久久久| 欧美精品一区二区高清在线观看| 蜜桃久久久久久久| 欧美一级午夜免费电影| 国产呦精品一区二区三区网站| 久久久精品国产99久久精品芒果 | 一区二区三区色| 成人av网站在线| 国产视频亚洲色图| 国产乱码一区二区三区| 日韩一区欧美一区| 欧美久久久久免费| 激情久久久久久久久久久久久久久久| 国产清纯美女被跳蛋高潮一区二区久久w| 欧美大片免费久久精品三p | 亚洲一区二区在线观看视频| 久久久噜噜噜久噜久久综合| 911精品国产一区二区在线| 波多野结衣视频一区|