📄 uart3.c
字号:
#include <iom128v.h>
#include <macros.h>
#define TRE3 7
#define SET_485_TX3() PORTB &= ~(1<<TRE3)
#define SET_485_RX3() PORTB |= (1<<TRE3)
#define RHR (*(volatile unsigned char *)0x4000)
#define THR (*(volatile unsigned char *)0x4000)
#define IER (*(volatile unsigned char *)0x4100)
#define ISR (*(volatile unsigned char *)0x4200)
#define FCR (*(volatile unsigned char *)0x4200)
#define LCR (*(volatile unsigned char *)0x4300)
#define MCR (*(volatile unsigned char *)0x4400)
#define LSR (*(volatile unsigned char *)0x4500)
#define MSR (*(volatile unsigned char *)0x4600)
#define SPR (*(volatile unsigned char *)0x4700)
#define DLL (*(volatile unsigned char *)0x4000)
#define DLM (*(volatile unsigned char *)0x4100)
#define AFR (*(volatile unsigned char *)0x4200)
#pragma interrupt_handler exint6_isr:8
#define STEN MCUCR |= 0x80
#define STDISEN MCUCR &= 0x7F
//-------------
unsigned char rx_ok3;
unsigned char rx3_data;
unsigned char uart3_state;
unsigned char uart3_flag;
unsigned char uart3_counter;
unsigned char test_en=0;
unsigned char tx3_buf[8];
unsigned char rx3_buf[13];
unsigned char uart3_tx_over;
unsigned char state_check;
unsigned char rx3_step;
unsigned char mode_counter;
unsigned char mode_flag;
unsigned char mode_flag_temp;
//-----------------
void delay_time (void)
{
unsigned int t=1000;
for(;t>0;t--)
{
NOP();
}
}
//-----------------------
void mcu_exmemory_en (void)
{
MCUCR = 0x80;
}
//----------------
void mcu_exmemory_dis (void)
{
MCUCR = 0x00;
}
//-----------------------
void uart3_tx (unsigned char data)
{
unsigned char temp;
SET_485_TX3();
STEN ;
do{
temp=LSR;
delay_time ();
temp &= 0x60;
}while(temp==0x00);
THR = data;
delay_time ();
do{
temp=LSR;
delay_time ();
temp &= 0x60;
}while(temp==0x00);
STDISEN ;
SET_485_RX3();
}
//--------------------
void uart3_rx (void)
{
unsigned char temp;
STEN ;
delay_time ();
if(rx3_step<13)
{
rx3_buf[rx3_step]=RHR;
delay_time ();
rx3_step++;
if(rx3_step==13)
{
rx_ok3=1;
rx3_step=0;
};
};
STDISEN ;
}
//------------------
void EXINT6_INIT (void)
{
EICRB |= (1<<ISC60);
EICRB |= (1<<ISC61);//上升沿中断
EIMSK |= (1<<INT6);//开中断
EIFR |= (1<<INTF6);//通过写入1来请0
PORTE |= (1<<PE6);
//PORTE &= ~(1<<PE6);
DDRE &= ~(1<<PE6);
}
//------------
//--------------
void exint6_isr (void)
{
unsigned char temp,temp0;
NOP();
NOP();
STEN ;
uart3_state=ISR;
delay_time();
NOP();
NOP();
if((uart3_state&0xFE)!=0x00)
{
if(uart3_state&0x0F)
{
temp = uart3_state & 0x0F;
if(temp==0x06)//接收器线状态寄存器
{
NOP();
temp0 = LSR;
delay_time();
NOP();
};
if(temp==0x04)//数据接收完成
{
NOP();
NOP();
uart3_rx ();
NOP();
NOP();
};
if(temp==0x0C)//接受超时
{
temp0 = RHR;
delay_time();
NOP();
NOP();
NOP();
};
if(temp==0x02)//发送完成
{
NOP();
NOP();
NOP();
THR = 0xAA;
delay_time();
SET_485_RX3();
};
if(temp==0x00)//调制解调状态寄存器
{
NOP();
temp0 = MSR;
NOP();
};
};
}
else
{
NOP();
}
STDISEN ;
}
//----------
//--------------------------
void uart3_init (void)
{
unsigned char i=0x00;
XMCRA = 0x0E;
XMCRB = 0x00;
uart3_flag = 0x01;
state_check=0x00;
rx3_step=0;
mode_counter=0x00;
}
//-----------------
void st16c_init (void)
{
if(uart3_flag==0x02)//init st16c2552
{
STEN;
switch (uart3_counter)
{
case 0:
{
LCR = 0x80;
uart3_counter++;
};break;
case 1:
{
NOP();
NOP();
state_check=LCR;
NOP();
NOP();
DLM = 0x00;
uart3_counter++;
};break;
case 2:
{
NOP();
NOP();
state_check=DLM;
NOP();
NOP();
DLL = 0x48;//9600BPS
uart3_counter++;
};break;
case 3:
{
NOP();
NOP();
state_check=DLL;
NOP();
NOP();
AFR = 0x00;//不同时写AB寄存器,不使能MF管教
uart3_counter++;
};break;
case 4:
{
NOP();
NOP();
state_check=AFR;
NOP();
NOP();
LCR = 0x03;//8 BIT ; 1 STOP BIT;NO 校验
uart3_counter++;
};break;
case 5:
{
NOP();
NOP();
state_check=LCR;
NOP();
NOP();
FCR = 0x00;
uart3_counter++;
};break;
case 6:
{
NOP();
NOP();
state_check=FCR;
NOP();
NOP();
// IER = 0x00;
IER = 0x01;//enable rx int
uart3_counter++;
};break;
case 7:
{
NOP();
NOP();
state_check=IER;
NOP();
NOP();
MCR = 0x08;
uart3_counter++;
};break;
case 8:
{
NOP();
NOP();
state_check=MCR;
NOP();
NOP();
LCR = 0x03;
uart3_counter++;
};break;
case 9:
{
NOP();
NOP();
state_check=LCR;
NOP();
NOP();
uart3_counter=0;
uart3_flag =0x00;
DDRB |= (1<<PB7);
SET_485_RX3();
EXINT6_INIT ();
test_en=0;
};break;
default:break;
}
STDISEN ;
};
if(uart3_flag==0x01)//reset
{
DDRD |= (1<<PD7);
PORTD |= (1<<PD7);
if(uart3_counter<100)
{
uart3_counter++;
}
else
{
PORTD &= ~(1<<PD7);
uart3_flag &= 0xFE;
uart3_flag = 0x02;
uart3_counter = 0;
state_check =0x00;
}
};
}
//------------------
void uart3_check (void)
{
unsigned char i,j=0;
unsigned char flag=0x00;
for(i=2;i<11;i++)
{
j+= rx3_buf[i];
}
if((rx3_buf[0]==0x68)&&
(rx3_buf[1]==0x09)&&
(j==rx3_buf[11])&&
(rx3_buf[12]==0x16))
{
flag=1;
};
if(flag)
{
switch (rx3_buf[3])
{
case 0x03
{
mode_flag|=0x01;
};break;
case 0x04:
{
mode_flag|=0x02;
};break;
case 0x05:
{
mode_flag|=0x04;
};break;
case 0x06:
{
mode_flag|=0x08;
};break;
default:break;
}
if(mode_flag!=mode_flag_temp)
{
mode_counter++;
};
mode_flag_temp = mode_flag;
};
}
//------------------
void uart3_handle (void)
{
unsigned char uart3_counter1,counter2;
if(uart3_flag)
{
st16c_init();
};
if(rx_ok3)
{
uart3_check();
// uart3_tx (rx3_data);
rx_ok3=0;
};
/*
if(++test_en>100)
{
test_en=0;
uart3_tx (0xAA);
};
*/
}
//--------------------
void uart3_turn_on (void)
{
unsigned char i=0x00;
tx3_buf[0]=0x68;
tx3_buf[1]=0x04;
tx3_buf[2]=0x10;
i=tx3_buf[2];
tx3_buf[3]=0x03;//sadd
i+=tx3_buf[3];
tx3_buf[4]=0x00;
i+=tx3_buf[4];
tx3_buf[5]=0x00;//YK
i+=tx3_buf[5];
tx3_buf[6]=i;//cs
tx3_buf[7]=0x16;
for(i=0;i<8;i++)
{
uart3_tx (tx3_buf[i]);
}
}
//------------------
void uart3_turn_off (void)
{
unsigned char i;
tx3_buf[0]=0x68;
tx3_buf[1]=0x04;
tx3_buf[2]=0x10;
i=tx3_buf[2];
tx3_buf[3]=0x03;//sadd
i+=tx3_buf[3];
tx3_buf[4]=0x00;
i+=tx3_buf[4];
tx3_buf[5]=0xFF;//YK
i+=tx3_buf[5];
tx3_buf[6]=i;//cs
tx3_buf[7]=0x16;
for(i=0;i<8;i++)
{
uart3_tx (tx3_buf[i]);
}
}
//------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -