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

📄 modbusfdl.c.svn-base

📁 给MOTO 360 单片机 开发的MODBUS协议 直流奥特寻协议。。要用SDS编译
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
    CHARACTER31=0x8000;
    CHARACTER32=0x8000;
    CHARACTER33=0x8000;
    CHARACTER34=0x8000;
    CHARACTER35=0x8000;
    CHARACTER36=0x8000;
    CHARACTER37=0x8000;
    CHARACTER38=0x8000;

    SCCE3=0xFFFF;
    SCCM3=0x0000;

    GSMR_H3=0x00000020;
    GSMR_L3=0x00028004;    //UART,16X RX\TX clock

    switch(SCC_PARITY[2])   //0:no parity,1 stop; 1:even 1 stop; 2:odd 1 stop;
    {
    case 0:
        PSMR3=0x3040;
        break;	
    case 1:
        PSMR3=0x305A;
        break;
    case 2:
        PSMR3=0x3050;
        break;
    default:
        PSMR3=0x3040;
        break;
    }

    CR=RESTART_TX|CPM_CR_CH_SCC3|CPM_CR_FLG;
    while(CR & CPM_CR_FLG);
}

void Init_SCC4_Config(void)
{
    BRGC4=BRGC_code[SCC_BAUD[3]];		//设置SCC4波特率

    RBASE4=SCC4_RX_BD_BASE;
    TBASE4=SCC4_TX_BD_BASE;
    CR=0x00C1;  //INIT_TRX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;
    while(CR & CPM_CR_FLG);

    RFCR4=0x18; //set Receive FCR to normal
    TFCR4=0x18; //set Transmit FCR to normal
    MRBLR4=0x00FF; //set max no of bytes to 8

    MAX_IDL4=30;

    BRKCR4=0x0000;             //if a stop transmit command is issued,one break character will be sent

    PAREC4=0;
    FRMEC4=0;
    NOSEC4=0;	
    BRKEC4=0;

    RCCM4=0xC0FF;

    UADDR41=0;         
    UADDR42=0;         

    TOSEQ4=0;          

    CHARACTER41=0x8000;
    CHARACTER42=0x8000;
    CHARACTER43=0x8000;
    CHARACTER44=0x8000;
    CHARACTER45=0x8000;
    CHARACTER46=0x8000;
    CHARACTER47=0x8000;
    CHARACTER48=0x8000;

    SCCE4=0xFFFF;
    SCCM4=0x0000;

    GSMR_H4=0x00000020;
    GSMR_L4=0x00028004;    //UART,16X RX\TX clock

    switch(SCC_PARITY[3])   //0:no parity,1 stop; 1:even 1 stop; 2:odd 1 stop;
    {
    case 0:
        PSMR4=0x3040;
        break;	
    case 1:
        PSMR4=0x305A;
        break;
    case 2:
        PSMR4=0x3050;
        break;
    default:
        PSMR4=0x3040;
        break;
    }

    CR=RESTART_TX|CPM_CR_CH_SCC4|CPM_CR_FLG;
    while(CR & CPM_CR_FLG);
}

void inittimer1(void)
{
    TGCR&=0xFFF0;	
    TMR1=0x0e1a;          //ORI: bit 4, =1 enable interrupt;
    //FRR: bit 3, =1 restart after the reference value is reached;
    //ICLK:bit 2-1, =01 system clock; =10 system clock divided by 16
    TCN1=0x0000;
    TRR1=0x3a98;          //10ms

    TER1=0xFFFF;
    CIMR|=CIMR_TIMER1;
    TGCR|=0x0001;

    //system clock/16: 1ms--0x5dc           
} 

void inittimer2(void)
{   
    TGCR&=0xFF0F;	
    TMR2=0x0e1a;                

    TCN2=0x0000;	
    TRR2=0x5dc;              //1ms
    //TRR2=0xBB8;                //2MS

    TER2=0xFFFF;
    CIMR|=CIMR_TIMER2;
    TGCR|=0x0010;            //开始计数  

    com_led=0;
}

#pragma interrupt()
void SCC1_IntProcess()
{
    struct SCCE SCCEtmp;
    SCCEtmp=*((struct SCCE*)(&SCCE1));
    SCCE1=0xFFFF;   //Clear the SCCE1.

    if(SCCEtmp.BSY) //BSY - Busy Condition (bit 2) A character was received and discarded due to lack of buffers.
    { 
        SCC1_RX_BD0_ST=0xB000;	
        SCC1_RX_BD0_LN=0;	  
    }
    if(SCCEtmp.RX)  //RX - RX Buffer (bit 0) A buffer has been received over the PROFIBUS channel.
    {	
        if(!(SCC1_RX_BD0_ST&0x8000)) SCC_INTFLAG[0]=1;
    }
    if ((*(unsigned short*)(&SCCEtmp)) & 0xFEF8) cpm_other_error();

    CISR=CISR_SCC1;  //Clear the SCC1 bit in the CISR.
}

#pragma interrupt()
void SCC2_IntProcess()
{
    struct SCCE SCCEtmp;
    SCCEtmp=*((struct SCCE*)(&SCCE2));
    SCCE2=0xFFFF;   //Clear the SCCE1.

    if(SCCEtmp.BSY) //BSY - Busy Condition (bit 2) A character was received and discarded due to lack of buffers.
    {
        SCC2_RX_BD0_ST=0xB000;	
        SCC2_RX_BD0_LN=0;
    }
    if(SCCEtmp.RX)  //RX - RX Buffer (bit 0) A buffer has been received over the PROFIBUS channel.
    {
        if(!(SCC2_RX_BD0_ST&0x8000)) SCC_INTFLAG[1]=1;          
    }
    if ((*(unsigned short*)(&SCCEtmp)) & 0xFEF8) cpm_other_error();

    CISR=CISR_SCC2;  //Clear the SCC1 bit in the CISR.
}

#pragma interrupt()
void SCC3_IntProcess()
{
    struct SCCE SCCEtmp;
    SCCEtmp=*((struct SCCE*)(&SCCE3));
    SCCE3=0xFFFF;   //Clear the SCCE1.

    if(SCCEtmp.BSY) //BSY - Busy Condition (bit 2) A character was received and discarded due to lack of buffers.
    {
        SCC3_RX_BD0_ST=0xB000;	
        SCC3_RX_BD0_LN=0;
    }
    if(SCCEtmp.RX)  //RX - RX Buffer (bit 0) A buffer has been received over the PROFIBUS channel.
    {
        if(!(SCC3_RX_BD0_ST&0x8000)) SCC_INTFLAG[2]=1;
    }
    if ((*(unsigned short*)(&SCCEtmp)) & 0xFEF8) cpm_other_error();

    CISR=CISR_SCC3;  //Clear the SCC1 bit in the CISR.
}

#pragma interrupt()
void SCC4_IntProcess()
{
    struct SCCE SCCEtmp;
    SCCEtmp=*((struct SCCE*)(&SCCE4));
    SCCE4=0xFFFF;   //Clear the SCCE1.

    if(SCCEtmp.BSY) //BSY - Busy Condition (bit 2) A character was received and discarded due to lack of buffers.
    {
        SCC4_RX_BD0_ST=0xB000;	
        SCC4_RX_BD0_LN=0;
    }
    if(SCCEtmp.RX)  //RX - RX Buffer (bit 0) A buffer has been received over the PROFIBUS channel.
    {	
        if(!(SCC4_RX_BD0_ST&0x8000)) SCC_INTFLAG[3]=1;
    }
    if ((*(unsigned short*)(&SCCEtmp)) & 0xFEF8) cpm_other_error();

    CISR=CISR_SCC4;  //Clear the SCC1 bit in the CISR.
}

#pragma interrupt()
void cpm_error_interrupt()
{
}

#pragma interrupt()
void Timer1_IntProcess()
{
    TER1=0xFFFF;            //Clear interrupt event

    CISR=CISR_TIMER1;
}

#pragma interrupt()
void Timer2_IntProcess()
{      	    	
    TER2=0xFFFF;

    com_led++;
    if(com_led>100)
    {	
        WDI=!WDI;
        com_led=0;
    }

    READY_WORDLINE=0;
    if(!(READY_WORDLINE&0x01)) 

        if(WORDLINE_NEWFLAG == NEW_WRITE) console(); 

    READY_WORDLINE=1; 

    comproc();	

    CISR=CISR_TIMER2;	
}

void cpm_other_error()
{
}

/**********************************************************************************************/

void   memsetchar ( unsigned char *s1, unsigned char ch,  unsigned short n )
{
    register unsigned char *src = (unsigned char *)s1;
    register unsigned char *end = src;
    end += n;
    while ( src < end )  *src++ = ch;
}

/**********************************************************************************************/
void SCC1_TxDATA(unsigned char Len,unsigned char *s)
{
    short i;

    ((struct GSMR_L*)(&GSMR_L1))->ENT=0;
    if (TBPTR1 != SCC1_TX_BD_BASE)
    {
        CR=0x0201;  //INIT_TX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;	
    }
    SCC1_TX_BD0_ST=0xB000;
    SCC1_TX_BD0_LN=Len;

    for(i=0;i<Len;i++)
        SCC_TBUF[0][i]=*(s+i);

    ((struct GSMR_L*)(&GSMR_L1))->ENT=1;

    //while(SCC1_TX_READY==1);  //不可靠,只是都放入了FIFO,未必发送完.用中断来判断同样不可靠,存疑
}

void SCC2_TxDATA(unsigned char Len,unsigned char *s)
{
    short i;

    ((struct GSMR_L*)(&GSMR_L2))->ENT=0;
    if (TBPTR2 != SCC2_TX_BD_BASE)
    {
        CR=0x0241;  //INIT_TX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;	
    }
    SCC2_TX_BD0_ST=0xB000;
    SCC2_TX_BD0_LN=Len;

    for(i=0;i<Len;i++)
        SCC_TBUF[1][i]=*(s+i);

    ((struct GSMR_L*)(&GSMR_L2))->ENT=1;
}

void SCC2_Tx_char(unsigned char s)
{
    ((struct GSMR_L*)(&GSMR_L2))->ENT=0;
    if (TBPTR2 != SCC2_TX_BD_BASE)
    {
        CR=0x0241;  //INIT_TX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;	
    }
    SCC2_TX_BD0_ST=0xB000;
    SCC2_TX_BD0_LN=1;

    SCC_TBUF[1][0]=s;

    ((struct GSMR_L*)(&GSMR_L2))->ENT=1;
}

void SCC3_TxDATA(unsigned char Len,unsigned char *s)
{
    short i;

    ((struct GSMR_L*)(&GSMR_L3))->ENT=0;
    if (TBPTR3 != SCC3_TX_BD_BASE)
    {
        CR=0x0281;  //INIT_TX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;	
    }
    SCC3_TX_BD0_ST=0xB000;
    SCC3_TX_BD0_LN=Len;

    for(i=0;i<Len;i++)
        SCC_TBUF[2][i]=*(s+i);

    ((struct GSMR_L*)(&GSMR_L3))->ENT=1;
}

void SCC4_TxDATA(unsigned char Len,unsigned char *s)
{
    short i;

    ((struct GSMR_L*)(&GSMR_L4))->ENT=0;
    if (TBPTR4 != SCC4_TX_BD_BASE)
    {
        CR=0x02c1;  //INIT_TX_PARAMS|CPM_CR_FLG|CPM_CR_CH_SCC1;	
    }
    SCC4_TX_BD0_ST=0xB000;
    SCC4_TX_BD0_LN=Len;

    for(i=0;i<Len;i++)
        SCC_TBUF[3][i]=*(s+i);

    ((struct GSMR_L*)(&GSMR_L4))->ENT=1;
}
/**********************************************************************************************/

⌨️ 快捷键说明

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