📄 dd_isr._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 + -