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

📄 dd_isr._c

📁 ADI公司射频芯片7020+ATMEGA16射频模块源程序
💻 _C
字号:
/*****************************************************************************
*   File:											       dd_isr.c
*****************************************************************************/

#include "dd.h"
//#include "api.h"
extern unsigned int crc16(unsigned char byte);
extern void crc16_reset(void);
unsigned char uart_tx_buffer[max_uart_buffer_size];
unsigned char time_count;
unsigned char rf_tx_state[3],crc_tempn[2];
/*****************************************************************************
 * Function:    dd_spi_i2c_isr
 ****************************************************************************/
void dd_spi_i2c_isr(void)  // 8051 vector 0x003B
{
	unsigned char temp;
//	UINT16 temp_crc;

    /* Handle priority processes first: SPIDAT access is extremely critical */


    	// Handle SPI interrupt 
        if (dd_data_port_state == DATA_PORT_TRANSMITTING)
        {   
		
		    if(dd_port_data_tx_frame_idx<dd_port_data_tx_buffer[8]+9){
			
			        
			        temp = dd_port_data_tx_buffer[dd_port_data_tx_frame_idx];
	 				SPDR = temp;
					if(dd_port_data_tx_frame_idx>8){
					  
					crc16(temp);
					   
					}
					dd_port_data_tx_frame_idx++;
					
			}
			else{
			
			      if(dd_port_data_tx_frame_idx==dd_port_data_tx_buffer[8]+9){
			      
				      SPDR = crc_lo;
				      dd_port_data_tx_frame_idx++;
					  
			      }else if(dd_port_data_tx_frame_idx==dd_port_data_tx_buffer[8]+10){
			        
					     SPDR = crc_hi;
        				 dd_port_data_tx_frame_idx++;
						 
			      }else{
			             dd_port_data_tx_frame_idx = 0;
						 rf_tx_state[2]=1;
						 SPCR  &= 0x3f;
						 //IEIP2 &= ~0x01;
						 //SPICON &= ~0x20;
						 
			      }
			   
		    }
			   
			        
	  	}		       
				  
			        
					   
					



        if (dd_data_port_state == DATA_PORT_RECEIVING)
        {
			temp = SPDR;
			//SPDR = 0xFF;
			
			if(dd_port_data_rx_frame_idx==0){
			
			     crc16(temp);
				 dd_port_data_rx_frame_idx++;
				 dd_port_data_rx_payload_length=temp;
				 
			}
			//else  if(dd_port_data_rx_frame_idx<(dd_port_data_rx_payload_length+1)){
			else  if(dd_port_data_rx_frame_idx<6){
			      
				  dd_port_data_rx_buffer[dd_port_data_rx_frame_idx-1]=temp;
				  crc16(temp);
				  dd_port_data_rx_frame_idx++;
		    }else {
				          if(dd_port_data_rx_frame_idx==(dd_port_data_rx_payload_length+1)){
						  
						         dd_port_data_rx_buffer[dd_port_data_rx_frame_idx-1]=temp;
				                 dd_port_data_rx_frame_idx++;
								 
						  }
						  else{
						         if((temp==crc_hi)&&(dd_port_data_rx_buffer[dd_port_data_rx_frame_idx-1]==crc_lo)){
								 	
						                SPCR  &= 0x3f;	// Disable SPI,Disable I2C/SPI interrupt
						                //dd_has_received_whole_frame = TRUE;
										uart_tx_payload_length=dd_port_data_rx_payload_length;
										memcpy(uart_tx_buffer,&dd_port_data_rx_buffer[0], uart_tx_payload_length);
										uart_buffer_tx_idx=0;
						                UDR = uart_tx_buffer[uart_buffer_tx_idx++];
								 }
								 
								 
								 
								 
						  }
						  
		   }        
								
    }

}


/*****************************************************************************
 * Function:    dd_adf7021_sync_isr
 ****************************************************************************/
void dd_adf7021_sync_isr(void)  // 8051 vector 0x0003
{
   
    unsigned char i,j,byte;
    CLI(); 		// Not needed if we're in an interrupt thread

	
	crc16_reset();
   
	SPCR |= 0x40;			// Enable SPI port now for correct byte sync 

	crc16_reset();

    while((PINB&0x80)==0x80)
	{
	}
	while ((PINB&0x80)!=0x80)
	{
	}
   
	SPCR |= 0x80;          // Enable I2C/SPI interrupt	
 
	//SPDR = 0xFF;
	SPSR &= ~0x80;		//to avoid the first byte 0x00;
 
    dd_data_port_state = DATA_PORT_RECEIVING;
	dd_data_packet_phase = PACKET_PHASE_HEADER;
	dd_port_data_rx_frame_idx=0;
  
	//P3 ^= 0x10;
}

















void UART_RECV_DEAL (void)

{
   unsigned char  temp;
   temp=UDR;
   uart_rx_buffer[uart_buffer_rx_idx]=temp;
   if(uart_buffer_rx_idx++==0){
      
      
      OCR1A=0x4d88;
//OCR1A=0x4d88;
      TCNT1=0x00;
      TIMSK=0x10;
      TCCR1B=0x00;
	  TCNT1=0x00;
	  TIFR=0x00;
	  TCCR1B=0x09;
	  
      }
	  
   if(uart_buffer_rx_idx>=max_uart_buffer_size){
   
      uart_buffer_rx_idx=0;
	  
	  }
	  
   time_count=0;
   
}
   
void UART_SEND_DEAL (void)

{
   if (uart_buffer_tx_idx < uart_tx_payload_length)
			{	
				UDR = uart_tx_buffer[uart_buffer_tx_idx++];
			}
   
}   
   
   
   
   
   
   
   
      
     
 
 








void USART_Init(void)
{
/* 设置波特率*/
//CLI();
UBRRH = 0;
UBRRL = 0x33;
/* 接收器与发送器使能*/

UCSRB = (1<<RXEN)|(1<<TXEN);
/* 设置帧格式: 8 个数据位, 2 个停止位*/
UCSRC = 0xa6;
UCSRA = 0;
UCSRB |= (1<<RXCIE)|(1<<TXCIE);
//SEI();

}

//timer 1初始化
void  timer1_init (void) 
{
TCCR1B=0x00;
TCCR1A=0x00;
TIFR=0x00;
TIMSK=0x00;
OCR1A=0x4d88;
//OCR1A=0x4d88;
TCNT1=0x00;
TIMSK=0x10;
TCCR1B=0x00;
}
//timer 1匹配中断

void  timer1_int (void)
{
   if(time_count++>20){
   
        if(led_state[1]==0){
        PORTD |= 1<<RX_LED;
	    led_state[1]=1;
	    }else{
	
	    PORTD &= ~(1<<RX_LED);
	    led_state[1]=0;
	    }
      time_count=0;
	  TCCR1B=0;
	  rf_tx_state[0] = 1;
	  uart_rx_rf_tx_count=uart_buffer_rx_idx;
	  uart_buffer_rx_idx=0;
   }
   
}
 
 
/* EOF */

#if  0
	SPCR |= 0x40;			// Enable SPI port now for correct byte sync 

	crc16_reset();

    while((PINB&0x80)==0x80)
	{
	}
	while ((PINB&0x80)!=0x80)
	{
	}
   
	SPCR |= 0x80;          // Enable I2C/SPI interrupt	
 
	//SPDR = 0xFF;
	SPSR &= ~0x80;		//to avoid the first byte 0x00;
 
    dd_data_port_state = DATA_PORT_RECEIVING;
	dd_data_packet_phase = PACKET_PHASE_HEADER;
	dd_port_data_rx_frame_idx=0;
    #endif 

⌨️ 快捷键说明

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