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

📄 mcu_uart.c

📁 单相 CPU卡表复费率电能表,内部有提供I2C驱动,CPU卡驱动,NEC单片机0513等
💻 C
字号:
#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; // 关接收中断       
    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);    //无校验, 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 ); //启动发送和接收
    
    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; // 关发送中断	
    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;
}


⌨️ 快捷键说明

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