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

📄 demo.c

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 C
📖 第 1 页 / 共 2 页
字号:
                        break;
                }
            }
        } 
        else
        {
            switch( InterruptStatus )
            {
                case INT_MODEM_CHANGE:
                    ModemStatus = ReadCH432Data( CH432_MSR_PORT );
                    WriteCH432Data( CH432_THR_PORT, ModemStatus );
                    UART0_SendStr( SEND_STRING1 );
                    if ( ModemStatus == 0x30 )    /* Modem信号发送数据变化 */
                    {
                        UART0_SendStr( SEND_STRING1 );
                    }
                    else if ( ModemStatus == 0x11 )    /* Modem 信号接收数据变化 */
                    {
                        WriteCH432Data( CH432_THR_PORT, 0xAA );
                    }
                    else if ( ModemStatus == 0x22 )    /* Modem 信号接收数据变化 */
                    {
                        s = ReadCH432Data( CH432_RBR_PORT );
                        WriteCH432Data( CH432_THR_PORT, s );
                    }
                    break;
                case INT_NOINT:    /* 没有中断 */
                    break;
                case INT_THR_EMPTY:    /* 发送保持寄存器空中断 */
                    UART0_SendStr( SEND_STRING );
                    break;
                case INT_RCV_SUCCESS:    /* 串口接收可用数据中断 */
                    RcvNum = CH432Seril0Rcv( buf );
                    UART0_SendByte( RcvNum );
                    CH432Seril0Send( buf, RcvNum );
                    break;
                case INT_RCV_LINES :    /* 接收线路状态中断 */
                    ReadCH432Data( CH432_LSR_PORT);
                    break;
                case INT_RCV_OVERTIME:    /* 接收数据超时中断 */
                    RcvNum = CH432Seril0Rcv( buf );
                    UART0_SendByte( RcvNum );
                    CH432Seril0Send( buf, RcvNum );
                    break;
                default:    /* 不可能发生的中断 */
                    break;
            }
        }
    }
    return( InterruptStatus );
}

void Auto_HandFlow0_Ctrl( )    /* 串口0自动硬件流控制 */
{
    WriteCH432Data( CH432_MCR_PORT, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS );    /* 设置MCR寄存器的AFE和RTS为1 */
}

void Auto_HandFlow1_Ctrl( )     /* 串口1自动硬件流控制*/
{
    WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_AFE | BIT_MCR_OUT2 | BIT_MCR_RTS );    /* 设置MCR1寄存器的AFE和RTS为1 */
}

UINT8 Modem_Ctrl()    /* Modem发送接收数据子程序 */
{
    UINT8 ModemStatus;
    UINT8 s;
    UINT8 InterruptStatus;
    while( 1 )
    {
        InterruptStatus = ReadCH432Data( CH432_IIR_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );
        if( ( InterruptStatus & 0x01 ) ) continue;
        else
        {
            ModemStatus = ReadCH432Data( CH432_MSR_PORT );

            WriteCH432Data( CH432_THR_PORT, ModemStatus );
            if ( ModemStatus == 0x30 )    /* Modem信号发送数据变化 */
            {
                UART0_SendStr( SEND_STRING );
            }
            else if ( ModemStatus == 0x11 )    /* Modem 信号接收数据变化 */
            {
                WriteCH432Data( CH432_THR_PORT, 0xAA );
            }
            else if ( ModemStatus == 0x22 )    /* Modem 信号接收数据变化 */
            {
                s = ReadCH432Data( CH432_RBR_PORT );
                WriteCH432Data( CH432_THR_PORT, s );
            }
        }
    }
    return( ModemStatus );
}

void mInitSTDIO( )    /* 初始化单片机串口 用于查看寄存器值 */
{
    SCON = 0x50;
    PCON = 0x80;
    TMOD = 0x20;
    TH1 = 0xf3;  /* 24MHz晶振, 9600bps */
    TR1 = 1;
    TI = 1;
}

void  CH432INT()    /* 查询CH432 INT0、INT1引脚子程序 */
{
    UINT8 InterruptStatus;
    UINT8 ModemStatus;
    UINT8 RcvNum, s;
    while( 1 )
    {
        if( CH432_INT1_WIRE )
        {
            InterruptStatus = ReadCH432Data( CH432_IIR1_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );    /* 读串口1的中断状态 */
            if( ( InterruptStatus & 0x01 ) ) continue;    /* 没有中断退出 */
            else
            {
                switch( InterruptStatus )
                {
                    case INT_NOINT:    /* 没有中断 */
                        break;
                    case INT_THR_EMPTY:    /* 发送保持寄存器空中断 */
                        UART1_SendStr( SEND_STRING1 );
                        break;
                    case INT_RCV_SUCCESS :    /* 串口接收可用数据中断 */
                        RcvNum = CH432Seril1Rcv( buf );
                        UART1_SendByte( RcvNum );
                        CH432Seril1Send( buf, RcvNum );
                        break;
                    case INT_RCV_LINES:    /* 接收线路状态中断 */
                        ReadCH432Data( CH432_LSR1_PORT);
                        break;
                    case INT_RCV_OVERTIME:    /* 接收数据超时中断 */
                        RcvNum = CH432Seril1Rcv( buf );
                        UART1_SendByte( RcvNum );
                        CH432Seril1Send( buf, RcvNum );
                        break;
                    default:    /* 不可能发生的中断 */
                        break;
                }
            }
         }
        if( CH432_INT0_WIRE )
        {
            InterruptStatus=ReadCH432Data( CH432_IIR_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );    /* 读串口1的中断状态 */
            if( ( InterruptStatus & 0x01 ) ) continue;    /* 没有中断退出 */
            else
            {
                switch( InterruptStatus )
                {
                    case INT_MODEM_CHANGE:
                        ModemStatus = ReadCH432Data( CH432_MSR_PORT );
                        WriteCH432Data( CH432_THR_PORT, ModemStatus );
                        if ( ModemStatus == 0x30)    /* Modem信号发送数据变化 */
                        {
                            UART0_SendStr( SEND_STRING1 );
                        }
                        else if ( ModemStatus == 0x11 )    /* Modem 信号接收数据变化 */
                        {
                            UART0_SendStr( SEND_STRING );
                        }
                        else if ( ModemStatus == 0x22 )    /* Modem 信号接收数据变化 */
                        {
                            s= ReadCH432Data( CH432_RBR_PORT );
                            WriteCH432Data( CH432_THR_PORT, s );
                        }
                        break;
                    case INT_NOINT:    /* 没有中断 */
                        break;
                    case INT_THR_EMPTY:    /* 发送保持寄存器空中断 */
                        WriteCH432Data( CH432_THR_PORT, 0xdd );
                        break;
                    case INT_RCV_SUCCESS:    /* 串口接收可用数据中断 */
                        s=UART0_RcvByte();
                        UART0_SendByte( s );
                        break;
                    case INT_RCV_LINES:        /* 接收线路状态中断 */
                        ReadCH432Data( CH432_LSR_PORT);
                        break;
                    case INT_RCV_OVERTIME:    /* 接收数据超时中断 */
                        RcvNum = CH432Seril0Rcv( buf );
                        UART0_SendByte( RcvNum );
                        CH432Seril0Send( buf, RcvNum );
                        break;
                    default:    /* 不可能发生的中断 */
                        break;
                }
             }
         }
    }
}


void main()
{
    UINT8 i,Status;
    UINT8 s = 0;
    CH432_PORT_INIT();
    #if 0
    mInitSTDIO( );    /* 测试CH432与单片机硬件正确连接 */
    Status = ReadCH432Data( CH432_IER_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data( CH432_IIR1_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data(CH432_IIR_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data( CH432_FCR_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data( CH432_MCR_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data( CH432_LSR_PORT );
    printf("%02X\n", Status );
    Status = ReadCH432Data( CH432_MSR_PORT );
    printf("%02X\n", Status );
    #endif
    InitCH432( );
    
    UART0_SendByte( 0xAA );
    UART1_SendByte( 0xBB );
    for( i = 0; i < 30; i++ )
    {
        buf[ i ] = i;
    }
    CH432UART0Send( buf, 30 );
    CH432UART1Send( buf, 30 );
   
    #if 0
    Auto_HandFlow0_Ctrl( );
    Auto_HandFlow1_Ctrl( );
    #endif

    #if 0
    Modem_Ctrl();
    #endif

    #if 0
    s = CH432Seril0Rcv( buf );
    WriteCH432Data( CH432_THR_PORT, s );
    CH432Seril0Send( buf, s );
    #endif

    #if 0
    CH432INT();
    #endif
   
    while(1)
    {
        if( Query432Interrupt() ) UartDetectInterrupt();   /* 产生中断进入查询中断程序处理 */
    }
    
}

⌨️ 快捷键说明

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