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

📄 demo_int.c

📁 南京沁恒电子有限公司USB通用设备接口芯片资料
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************************************************************
//Website:  http://wch.cn
//Email:    tech@wch.cn
//Author:   W.ch 2007.6
//*******************************************************************

/* CH432Q和CH432T芯片  应用层  V1.0 */
/* 查询方式的全双工通讯,MODEM信号、自动硬件流控制,串口操作示例程序 */
#include <reg52.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>

#pragma NOAREGS
#include "BASE.C"

/* CH432与单片机的硬件接口层,以下连接方式任选一种 */
//#include "PARA.C"        /* 硬件标准8位并口方式子程序, CH432Q */
// #include "SPI_HW.C"      /* 硬件标准4线SPI串口方式,CH432Q&CH432T */
#include "SPI_SW.C"         /* 软件I/O模拟4线SPI串口方式, CH432Q&CH432T */
#include "SPI.C"            /* 接口子程序 */

#define CH432_BPS  19200    /* 定义CH432串口0通讯波特率 */
#define CH432_BPS1 57600    /* 定义CH432串口1通讯波特率 */
#define Fpclk    1843200    /* 定义内部时钟频率    */
#define CH432_INT_WIRE   INT1
// #define CH432_INT0_WIRE   INT1
// #define CH432_INT1_WIRE   INT1

UINT8 SEND_STRING[ ] = { "444444555566666777788889999000009999995555555hello" };
UINT8 SEND_STRING1[ ] = { "33333333wwwwww" };
UINT8 idata buf[ 100 ];    /* 缓冲区保存数据 */
UINT8 xdata rcvbuf[ 64 ];    /* 缓冲区保存数据 */

void InitCH432( void )    /* 初始化CH432 */
{
    UINT16 div;
    UINT8 DLL, DLM;
/**************************************************************************
          设置CH432串口0的寄存器

**************************************************************************/
    div = ( Fpclk >> 4 ) / CH432_BPS;
    DLM = div >> 8;
    DLL = div & 0xff;
    WriteCH432Data( CH432_LCR_PORT, BIT_LCR_DLAB );    /* 设置DLAB为1 */
    WriteCH432Data( CH432_DLL_PORT, DLL );    /* 设置波特率 */
    WriteCH432Data( CH432_DLM_PORT, DLM );
    WriteCH432Data( CH432_FCR_PORT, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN );    /* 设置FIFO模式,触发点为14 */
    WriteCH432Data( CH432_LCR_PORT, BIT_LCR_WORDSZ1
                                  | BIT_LCR_WORDSZ0 );    /* 字长8位,1位停止位、无校验 */
    WriteCH432Data( CH432_IER_PORT, BIT_IER_IEMODEM | BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV );    /* 使能中断 */
    WriteCH432Data( CH432_MCR_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR );    /* 允许中断输出,DTR,RTS为1 */

/**************************************************************************
          设置CH432串口1的寄存器

**************************************************************************/
    div = ( Fpclk >> 4 ) / CH432_BPS1;
    DLM = div >> 8;
    DLL = div & 0xff;
    WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB );    /* 设置DLAB为1 */
    WriteCH432Data( CH432_DLL1_PORT, DLL );    /* 设置波特率 */
    WriteCH432Data( CH432_DLM1_PORT, DLM );
    WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN );    /* 设置FIFO模式,触发点为14 */
    WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_PAREN
                                   | BIT_LCR_WORDSZ1
                                   | BIT_LCR_WORDSZ0 );    /* 字长8位,1位停止位、奇校验 */
    WriteCH432Data( CH432_IER1_PORT, BIT_IER_IEMODEM | BIT_IER_IELINES | BIT_IER_IETHRE | BIT_IER_IERECV );    /* 使能中断 */
    WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 | BIT_MCR_RTS | BIT_MCR_DTR );    /* 允许中断输出,DTR,RTS为1 */
}

void UART0_SendByte( UINT8 dat )    /* CH432串口0发送一字节子程序 */
{
    while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_THRE ) == 0 );    /* 等待数据发送完毕 */
    WriteCH432Data( CH432_THR_PORT, dat );
}

UINT8 UART0_RcvByte()    /* CH432串口0接收一字节子程序 */
{
    UINT8 Rcvdat;
    if( !( ReadCH432Data( CH432_LSR_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) )    /*  b1-b4无错误 */
    {
        while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0 );    /* 等待数据准备好 */
        Rcvdat = ReadCH432Data( CH432_RBR_PORT );    /* 从接收缓冲寄存器读出数据 */
        return( Rcvdat );
    }
    else ReadCH432Data( CH432_RBR_PORT );    /* 有错误清除 */
}

void UART0_SendStr( UINT8 *str )    /* CH432串口0发送一字符串子程序 */
{
    while( 1 )
    {
        if( *str == '\0' ) break;
        UART0_SendByte( *str++ );
    }
}

void UART1_SendByte( UINT8 dat )    /* CH432串口1发送一字节子程序 */
{
    while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 );    /* 等待数据发送完毕 */
    WriteCH432Data( CH432_THR1_PORT, dat );
}

UINT8 UART1_RcvByte()    /* CH432串口1接收一字节子程序 */
{
    UINT8 Rcvdat;
    if( !( ReadCH432Data( CH432_LSR1_PORT ) & (BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) )    /* b1-b4无错误 */
    {
        while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 );    /* 等待数据准备好 */
        Rcvdat = ReadCH432Data( CH432_RBR1_PORT );    /* 从接收缓冲寄存器读出数据 */
        return( Rcvdat );
    }
    else ReadCH432Data( CH432_RBR1_PORT );    /* b1-b4有错误清除 */
}

void  UART1_SendStr( UINT8 *str )    /* CH432串口1发送一字符串子程序 */
{
    while(1)
    {
        if( *str == '\0' ) break;
        UART1_SendByte( *str++ );
    }
}

void  CH432Seril0Send( UINT8 *Data, UINT8 Num )    /* 禁用FIFO,CH432串口0发送多字节子程序 */
{
    do
    {
        while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_THRE ) == 0 );    /* 等待数据发送完毕 */
        WriteCH432Data( CH432_THR_PORT, *Data++ );
    }
    while( --Num );
}

void  CH432Seril1Send( UINT8 *Data, UINT8 Num )    /* 禁用FIFO,CH432串口1发送多字节子程序 */
{
    do
    {
        while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_THRE ) == 0 );    /* 等待数据发送完毕 */
        WriteCH432Data( CH432_THR1_PORT, *Data++ );
    }
    while( --Num );
}

UINT8  CH432Seril0Rcv( UINT8 *buf )    /* 禁用FIFO,CH432串口0接收多字节子程序 */
{
    UINT8 RcvNum = 0;
    if( !( ReadCH432Data( CH432_LSR_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) )    /* b1-b4无错误 */
    {
        while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0 );    /* 等待数据准备好 */
        do
        {
            *buf++ = ReadCH432Data( CH432_RBR_PORT );    /* 从接收缓冲寄存器读出数据 */
            RcvNum++;
        }
        while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
    }
    else ReadCH432Data( CH432_RBR_PORT );
    return( RcvNum );
}

UINT8 CH432Seril1Rcv( UINT8 *buf )    /* 禁用FIFO,CH432串口1接收多字节子程序*/
{
    UINT8 RcvNum = 0;
    if( !( ReadCH432Data( CH432_LSR1_PORT ) & ( BIT_LSR_BREAKINT | BIT_LSR_FRAMEERR | BIT_LSR_PARERR | BIT_LSR_OVERR ) ) )    /* b1-b4无错误 */
    {
         while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0 );    /* 等待数据准备好 */
         do
         {
              *buf++ = ReadCH432Data( CH432_RBR1_PORT );    /* 从接收缓冲寄存器读出数据 */
              RcvNum++;
         }
         while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_DATARDY ) == 0x01 );
    }
    else ReadCH432Data( CH432_RBR1_PORT );
    return( RcvNum );
}

void  CH432UART0Send( UINT8 *Data, UINT8 Num )    /* 启用FIFO,一次最多16字节,CH432串口0发送多字节子程序 */
{
    while( 1 )
    {
        while( ( ReadCH432Data( CH432_LSR_PORT ) & BIT_LSR_TEMT ) == 0 );    /* 等待数据发送完毕,THR,TSR全空 */
        if( Num <= 16 )
        {
            WriteCH432Block( CH432_THR_PORT, Num, Data );
            break;
        }
        else
        {
            WriteCH432Block( CH432_THR_PORT, 16, Data );
            Num -= 16;
            Data += 16;
        }
    }
}

void CH432UART1Send( UINT8 *Data, UINT8 Num )    /* 启用FIFO,一次最多16字节,CH432串口1发送多字节子程序 */
{
    while( 1 )
    {
        while( ( ReadCH432Data( CH432_LSR1_PORT ) & BIT_LSR_TEMT ) == 0 );    /* 等待数据发送完毕,THR,TSR全空 */
        if( Num <= 16 )
        {
            WriteCH432Block( CH432_THR1_PORT, Num, Data );

⌨️ 快捷键说明

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