CH372(USB芯片)单片机程序_子诺_311的空间_百度空间

/*
*------------------------------------------------------*
* file name : test.c           *
* Author    : 子诺            *
* use for   : CH372通信                               *
* time by   : 2010-3-16          *
* QQ        : 910972385                               *
* blogs     : *
* note      : 1.修改自沁恒电子有限公司提供源程序    *
*------------------------------------------------------*
*/
#pragma NOAREGS         //禁止编译器使用{jd1}寄存器寻址,一定要加上
#include <reg52.h>
#include <string.h>
#include "CH375INC.H" // CH372/CH375头文件

unsigned char volatile xdata CH372_CMD_PORT _at_ 0xffff;   /* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH372_DAT_PORT _at_ 0xfeff;   /* CH375数据端口的I/O地址 */
/*--
* volatile unsigned char *pt;
*表示 pt 所指向的内容有可能在一个很意外的情况下被改变。所以,volatile 关键字告诉编译器,不要
*对 pt 做任何想当然的优化,以免出错。补充一点,这种声明一般意味着在程序运行时,该数据存储在动
*态存储器中(内存吧,可理解成)。这种声明尤其应用在setjmp和longjmp的时候,使得跳回时候值不被
*清成初始状态。一般情况下你用不到它。在和外设打交道时会用到的。
--*/

#define TESTDAT 0x55//测试数据
sbit p1_0=P1^0;   //硬件错误指示
sbit p1_1=P1^1;   //接收数据正确指示
sbit p1_2=P1^2;   //发送完成指示
/*+++++++++++++++++++++++++++延时程序++++++++++++++++++++++++++++++*/
/*---------------------------------*
*名称:延时函数       *
*功能:延时2微秒,不xx      *
*入口:无         *
*出口:无         *
*说明:         *
*---------------------------------*/
void delay2us( )
{
unsigned char i;
for ( i=2; i!=0; i-- ); /* 根据单片机的时钟选择初值 */
}
/*---------------------------------*
*名称:延时函数       *
*功能:延时50毫秒,不xx      *
*入口:无         *
*出口:无         *
*说明:         *
*---------------------------------*/
void Delay50ms( )
{
unsigned char i, j;
for (i=200; i!=0; i--)
   for (j=250; j!=0; j--);
}
/*++++++++++++++++++++++基本操作++++++++++++++++++++++*/
/*----------------------------------------------------------------------*
*名称:写命令函数               *
*功能:向CH372的命令端口写入命令           *
*入口:unsigned char cmd             *
*出口:无                 *
*说明:向CH372的命令端口写入命令时,周期不小于4uS,如果单片机较快则延时 *
*----------------------------------------------------------------------*/
void CH372_WR_CMD_PORT( unsigned char cmd )
{
delay2us();
CH372_CMD_PORT=cmd;
delay2us();
}
/*----------------------------------------------------------------------*
*名称:写数据函数               *
*功能:向CH372数据端口写入数据            *
*入口:unsigned char dat             *
*出口:无                 *
*说明:向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 *
*----------------------------------------------------------------------*/
void CH372_WR_DAT_PORT( unsigned char dat )
{
CH372_DAT_PORT=dat;
}
/*----------------------------------------------------------------------*
*名称:读数据函数               *
*功能:从CH372数据端口读出数据            *
*入口:无                 *
*出口:CH372_DAT_PORT(8位数据)            *
*说明:从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 *
*----------------------------------------------------------------------*/
unsigned char CH372_RD_DAT_PORT( void )
{
return( CH372_DAT_PORT );
}
/*++++++++++++++++++初始化和中断服务程序++++++++++++++++++++*/
/*--------------------------------------------------*
*名称:CH372初始化函数         *
*功能:初始化CH372芯片         *
*入口:无            *
*出口:无            *
*说明:            *
*--------------------------------------------------*/
void CH372_Init( )
{
unsigned char i;
#ifdef CHECK_EXIST
/* 测试CH372是否正常工作,可选操作,通常不需要 */
CH372_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试CH375是否正常工作 */
CH372_WR_DAT_PORT( 0x55 );     /* 写入测试数据 */
i = ~ 0x55;         /* 返回数据应该是测试数据取反 */        
if ( CH372_RD_DAT_PORT( ) != i )    /* CH372不正常 */
{
   for ( i=80; i!=0; i-- )
   {
    CH372_WR_CMD_PORT( CMD_RESET_ALL ); /* 多次重复发命令,执行硬件复位 */
    CH372_RD_DAT_PORT( );
   }
   CH372_WR_CMD_PORT( 0 );
   Delay50ms( ); /* 延时50ms */
}
#endif
/* 设置USB工作模式, 必要操作 */
CH372_WR_CMD_PORT( CMD_SET_USB_MODE ); //设置USB模式命令
CH372_WR_DAT_PORT( 0x02 ); /* 方式2即设置为使用内置固件的USB设备方式 */
for ( i=100; i!=0; i-- )
{ /* 等待操作成功,通常需要等待10uS-20uS */
   if ( CH372_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;
}
if ( i==0 ) { p1_0=0; } // CH372存在硬件错误(调试指示)
/* 下述启用中断,假定CH372连接在INT0 */
IT0 = 0; /* 置外部信号为低电平触发 */
IE0 = 0; /* 清中断标志 */
EX0 = 1; /* 允许CH372中断 */
}
/*--------------------------------------------------*
*名称:CH372中断服务函数        *
*功能:对CH372中断及时进行响应,读出或写入数据   *
*入口:无            *
*出口:无            *
*说明:CH372中断服务程序,使用寄存器组1     *
----------------------------------------------------*/
void mCh372Interrupt( ) interrupt 0 using 1
{
unsigned char InterruptStatus;//中断状态
unsigned char i, length;
unsigned char data buffer[ 64 ];
CH372_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */
InterruptStatus = CH372_RD_DAT_PORT( ); /* 获取中断状态 */
switch ( InterruptStatus )      /* 分析中断状态处理 */
{
   case USB_INT_EP2_OUT:      /* 批量端点下传成功 */
   {
    CH372_WR_CMD_PORT( CMD_RD_USB_DATA ); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区
    length = CH372_RD_DAT_PORT( );      //首先读取后续数据长度
    for ( i=0; i<length; i++ )
    {
     buffer[ i ] = CH372_RD_DAT_PORT( ); //接收数据包
     if(buffer[i]==TESTDAT) p1_1=0;    //数据正确(调试指示)
    }
    //测试数据正确性,将接收到的命令包数据取反后返回给PC机
    CH372_WR_CMD_PORT( CMD_WR_USB_DATA7 ); //向USB端点2的发送缓冲区写入数据块
    CH372_WR_DAT_PORT( length );     //首先写入后续数据长度
    for(i=0;i<length;i++)
     CH372_WR_DAT_PORT( ~buffer[i] ); //将数据取反后返回   
    break;
   }
   case USB_INT_EP2_IN:        //批量数据发送成功
   {
    p1_2=0;//进入中断,发送数据成功(调试指示)
    CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
    break;
   }
   default:           /* 其它中断,未用到,解锁后退出即可 */
   {
    CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
    break;
   }
}
}
/*--------------------------------------------------*
*名称:主函数           *
*功能:            *
*入口:无            *
*出口:无            *
*说明:            *
*--------------------------------------------------*/
void main( )
{
Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */
CH372_Init( ); /* 初始化CH375 */
EA = 1;    /* 允许中断 */
while ( 1 ); /* 以下指令开始工作循环,等待PC机命令进行操作 */
}



郑重声明:资讯 【CH372(USB芯片)单片机程序_子诺_311的空间_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——