📄 level4.c
字号:
#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 + -