?? mcu_uart.c
字號(hào):
#pragma interrupt INTSR6 MD_INTSR6
#pragma interrupt INTST6 MD_INTST6
#include "includes.h"
unsigned char mcu_rx_buf[MCU_UART_RX_BUF_SIZE];
sreg unsigned char mcu_tx_buf[MCU_UART_TX_BUF_SIZE];
volatile unsigned char modem_tx_recv_ptr = 0;
volatile unsigned char modem_tx_send_ptr = 0;
volatile unsigned char modem_tx_status = 0;
unsigned char mcu_rx_len = 0;
unsigned char mcu_rx_flag = 0;
unsigned char mcu_tx_pos = 0;
unsigned char mcu_tx_len = 0;
const unsigned char _mcu_br[] =
{
0x07,0x68,//300
0x07,0x34,//600
0x06,0x34,//1200
0x06,0x1A,//2400
0x05,0x1A,//4800
0x04,0x1A,//9600
0x02,0x09//115200
};
int set_mcu_uart_baud_rate(void)
{
unsigned char br;
if( ( soft_switch & SOFT_SWITCH_GRADE ) != 0 )
{
E2promRead( MANUFACTURER_BAUD_RATE, &br, LEN_BAUD_RATE );
}
else
{
E2promRead( CLIENT_BAUD_RATE, &br, LEN_BAUD_RATE );
}
if( br > 6 ) br = 5;
CKSR6 = _mcu_br[br*2];
BRGC6 = _mcu_br[br*2 + 1];
return 0;
}
int mcu_uart_start_to_rx(void)
{
SRMK6 = 1; // 關(guān)接收中斷
mcu_rx_len = 0;
mcu_rx_flag = MCU_RX_STAR;
modem_tx_send_ptr = 0;
modem_tx_recv_ptr = 0;
modem_tx_status = FRAME_TX_START;
RS232_RXD_DIR |= RS232_RXD;
ASIM6 = 0;
RS485_RX_EN();
ASIM6 |= (BIT2|BIT0); //無(wú)校驗(yàn), 8位,1位停止位
ASICL6 = 0x16;
set_mcu_uart_baud_rate();
SRIF6=0;
SRMK6=0;
SRPR6=1;
ASIM6.7 = 1; //POWER6 = 1
delay(5);
SetIORBit( ASIM6, 0x60 ); //啟動(dòng)發(fā)送和接收
return 0;
}
int mcu_uart_start_to_tx( unsigned char *dPtr, unsigned char len )
{
unsigned short cnt = 0;
if( len > sizeof( mcu_tx_buf ) )
{
return;
}
while( mcu_tx_len )
{
clr_wdt();
if( cnt++ > 5000 )
{
mcu_uart_init();
break;
}
}
STMK6 = 1; // 關(guān)發(fā)送中斷
if( dPtr != mcu_tx_buf )
{
memcpy( mcu_tx_buf, dPtr, len );
}
mcu_tx_pos = 0;
mcu_tx_len = len-1;
RS485_TX_EN();
RS232_TXD_OUT |= RS232_TXD;
set_mcu_uart_baud_rate();
STIF6=0;
STPR6=1;
TXB6 = mcu_tx_buf[mcu_tx_pos++];
STMK6=0;
return 0;
}
__interrupt void MD_INTSR6( void )
{
unsigned char err_flag,rxdata;
err_flag = ASIS6;
rxdata = RXB6;
if( err_flag != 0 )
{
return;
}
if( mcu_rx_len >= ( sizeof( mcu_rx_buf )-1 ) )
{
mcu_rx_flag = MCU_RX_ERROR;
return;
}
else
{
if( modem_tx_status == FRAME_TX_START )
{
mcu_rx_buf[mcu_rx_len++] = rxdata;
}
mcu_rx_flag = MCU_RX_DEAL;
if( ( modem_state == _m22_online_csd ) || ( modem_state == _m22_online_gprs ) )
{
modem_tx_buf[modem_tx_recv_ptr] = rxdata;
modem_tx_recv_ptr = ( modem_tx_recv_ptr + 1 ) % TX_BUF_SIZE;
if( ( modem_tx_status == FRAME_TX_START ) && ( modem_tx_recv_ptr >= TX_BUF_HALF_SIZE ) )
{
mcu_rx_len = 0;
modem_tx_status = FRAME_TX_PROCESS;
sys_evt_add( SYS_EVT_FRMMCU_FRAME );
}
}
}
}
__interrupt void MD_INTST6( void )
{
if( mcu_tx_status == FRAME_TX_PROCESS )
{
TXB6 = mcu_tx_buf[mcu_tx_send_ptr];
mcu_tx_send_ptr = ( mcu_tx_send_ptr + 1 ) % TX_BUF_SIZE;
if( mcu_tx_send_ptr == mcu_tx_recv_ptr )
{
mcu_tx_status = FRAME_TX_END;
}
}
else if( mcu_tx_status == FRAME_TX_END )
{
STMK6 = 1;
RS485_RX_EN();
mcu_rx_flag = MCU_RX_STAR;
sys_evt_add( SYS_EVT_MODEM_UART_INIT );
}
else
{
if( mcu_tx_len )
{
if( ( !( ASIF6 & 0x02 ) ) && ( ASIM6 & 0x80 ) )
{
TXB6 = mcu_tx_buf[mcu_tx_pos ++];
mcu_tx_len--;
}
}
else
{
STMK6 = 1;
RS485_RX_EN();
mcu_rx_flag = MCU_RX_STAR;
}
}
}
int mcu_uart_init(void)
{
mcu_uart_start_to_rx();
return 0;
}
int mcu_uart_check(void)
{
unsigned char rxd_len = 0;
if( mcu_rx_flag >= MCU_RX_ERROR )
{
mcu_uart_start_to_rx();
}
if( mcu_rx_flag & MCU_RX_END )
{
if( mcu_rx_flag == MCU_RX_END )
{
SRMK6 = 1;
rxd_len = mcu_rx_len;
mcu_rx_buf[mcu_rx_len] = 0;
}
else
{
SRMK6 = 1;
mcu_rx_flag = MCU_RX_END;
SRMK6 = 0;
}
}
return rxd_len;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -