⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 level4.c

📁 此程序为利用mage8 AVR 和EM4094实现读取ISO15693类型卡的C程序、读卡稳定、这个项目我们做了好久、非常不错的程序、很适合做这方面产品的朋友们参考
💻 C
📖 第 1 页 / 共 2 页
字号:


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

//--------------------------------------------------------------
//global declarations


uint8_t volatile uart_command;          // command handshake value
                                        // set by UART RECV
                                        // reset by main() when done

uint8_t cmd_message[ 32 ];                // maximum
uint8_t cmd_message_len;                // length of current cmd_message
uint8_t message_flags;                  // current message flags 
uint8_t expectedResponseLen;            // expected number of response bits

uint8_t read_tag_memory_word_flags;     // first byte of message
uint8_t read_tag_memory_word_address;   // address of Read cmd
uint8_t read_tag_memory_word_blocks;    // number of blocks to send

uint16_t read_tag_memory_word_low;      // Read Cmd content low
uint16_t read_tag_memory_word_hi;       // Read Cmd content hi

uint16_t write_tag_memory_word_address; // address of Write Tag cmd
uint16_t write_tag_memory_word_low;     // low word of Write Tag cmd
uint16_t write_tag_memory_word_hi;      // hi word of Write Tag cmd
uint16_t write_tag_memory_delay;        // time delay before eof/response

uint16_t write_tag_memory_login_low;    // low word of Login cmd
uint16_t write_tag_memory_login_hi;     // hi word of Login cmd

uint16_t read_only_word_low;            // Read Only Cmd content low
uint16_t read_only_word_hi;             // Read Only Cmd content hi

uint16_t write_4094_low;                // low word of SPI configuration word
uint16_t write_4094_hi;                 // hi word of SPI configuration word


uint8_t * read_ptr;                     //debug capture pulse lengths uart data pointer
uint8_t volatile read_pos;              //debug capture pulse lengths uart read counter

uint8_t debug_mode;

uint8_t tx_number;           //received data byte number of raw data from PC;
uint8_t rx_number;

uint8_t uart_in_command;
uint8_t uart_in_param;
uint8_t valid_data_flag ;
//--------------------------------------------------------------
//local declarations

register uint8_t captured_byte asm ("r6");      //store_bit current capture bits
register uint8_t captured_valid asm ("r7");     //store_bit current capture valid bits
register uint8_t capture_cnt asm ("r8");        //store_bit current capture byte index
register uint8_t captured_bit_count asm ("r9"); //store_bit current capture bit counter

#define UART_IN_BUFFER_SIZE  32         // incoming data uart buffer reserved size

void Copy(uint8_t *dst , uint8_t *src , uint8_t len);
void SendByte( uint8_t byte );
void Send_Weigan0( void );
void Send_Weigan1( void );
void Send_Weigan26( uint8_t * data );
void Send_Weigan34( uint8_t * data );
void Send_Weigan36( uint8_t * data );
void Send_Weigan44( uint8_t * data );
void Send_9600( uint8_t * data );
void Send_Card_ID( uint8_t format , uint8_t *data );



 


// ==================================================================
// uart init routine

void UARTIni( void ) 
{
   // UCSRA is not necessary to set up, using initial valuses         
   // no double transmission speed, no multi-processor mode           

    UCSRB  = ( 1 << RXCIE ) | ( 0 << UDRIE) | ( 1 << RXEN ) | ( 1 << TXEN ); 
                       // set up : RXCIE, UDRIE, RXEN, TXEN           
                       // (interrupt enable from receiver,            
                       // UART receiver enable, UART transmit enable) 

    UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); 
                       // asynchronous operation, 8 data bits,        
                       // no parity, 1 stop bit                       

    UBRRL = 103;         // baud rate - see UBRR register setting table 
                       //             in AVR ATmega8 specification    
                       // UBRRH - using initial values                
                       // UBRRL - 25 for 38k4Bd and frequency f=16 MHz 
                       // (using SINGLE transmission speed)           
    rx_number = 0;
    tx_number = 0;
    valid_data_flag = 0;
}

// ==================================================================
// uart byte receive interrupt

SIGNAL ( SIG_UART_RECV )
{
	  uint8_t temp;
	  uint8_t error;
	  error = UCSRA & ( ( 1 << FE ) | ( 1 << DOR ) | ( 1 << PE ) ); 
    temp = UDR;               //store byte into cyclic buffer
    if ( error != 0 )
    {
        rx_number = 0 ;
            
        return;
    }
    if ( valid_data_flag != 0 )
    	  return;
    switch( rx_number )
    {
        case 0 :
        	  if ( temp == 0x55 )
        	      rx_number = 1 ;
        	  else
        	      rx_number = 0 ;
            break;
            
        case 1 :
        	  if ( temp == 0xAA )
        	      rx_number = 2 ;
        	  else
        	      rx_number = 0 ;
        	  break;	
        	  
        case 2 :
        	  if ( temp == 0x01 )
        	      rx_number = 3 ;
        	  else 
        	      rx_number = 0 ;
        	  break;	
        	  
        case 3 :
        	  if ( error != 0 )
        	  	  rx_number = 0 ;
        	  else
        	  {
        	      uart_in_command = temp;
        	      //uart_in_buffer[ uart_in_write++ ] = temp;
        	      rx_number = 4 ;
        	  }
        	  break;	
        	          	  
        case 4 :
        	  if ( error != 0 )
        	  	  rx_number = 0 ;
        	  else
        	  {
        	      uart_in_param = temp;
        	      //uart_in_buffer[ uart_in_write++ ] = temp;
        	      rx_number = 5 ;
        	  }
        	  break;	 
        	         	  
        case 5 :
        	  if ( temp == 0x55 )
        	      rx_number = 6 ;
        	  else
        	  {
        	  	  rx_number = 0 ;
        	  	  //uart_in_write -= 2 ;
        	  }
        	  break;	
        	          	  
        case 6 :
        	  rx_number = 0 ;
        	  if ( temp == 0xAA )
        	  {
                valid_data_flag = 0x55;
        	  }
        	  break;
        default :
        	  rx_number = 0 ;
        	  break;	        	          	  
    }
    cbi( PORTC , TEN_485 );
}

// ==================================================================
// copy

void Copy( uint8_t *dst , uint8_t *src , uint8_t len ) 
{

  while (len-- > 0)
    *dst++ = *src++;
}



//==================================================================
//Send one raw byte
// 
void SendByte( uint8_t byte ) 
{
	  sbi( PORTC , TEN_485 );
	  UDR = byte;
    while ( !( UCSRA & ( 1 << UDRE ) ) )
    { }
    Delayus( 1000 );
    cbi( PORTC , TEN_485 );     
}


//weigan26
//E CCCC CCCC CCCC                    CCCC CCCC CCCC O

//weigan34 
//E CCCC CCCC CCCC CCCC          CCCC CCCC CCCC CCCC O

//weigan36
//O CCCC CCCC CCCC CCCC C       CCC CCCC CCCC CCCC IIE
//I is '0';

//weigan44
//CCCC CCCC CCCC CCCC CCCC
//CCCC CCCC CCCC CCCC CCCC XXXX
//XXXX is the value of XOR of first 10 CCCC;


// ********************************************************************************************
// Description : Send weigan26 model and encode according to weigan26 protocol.
// Return value: None.   
// parameter   : * data -- the point of the data to be encoded.
// ********************************************************************************************

void Send_Weigan26( uint8_t * data )
{
	  uint8_t i , weigan26_even_data , weigan26_odd_data , parity_bit , bit_cnt;
	  parity_bit = 0;               //If use even parity check , this bit must be 0;
	  for ( i = 8 ; i < 20 ; i++ )
	  {
	  	  bit_cnt = i % 8 ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -