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

📄 ch372.c

📁 CAN总线开发板源代码与原理图
💻 C
字号:
/*****************************************************

  宇航工作室
  2010-04-22


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

#include <ch372.h>
#include <usb.h>

/********************************************************************************************
** 函数名称: void DelayUs(uchar us)
** 功能描述: uS级延时函数 11.0592M
** 输 入: us
** 输 出: 无
*********************************************************************************************/
void DelayUs(uchar us)
{
    while (us--)
	{
		_nop_();_nop_();
		_nop_();_nop_();
	}
}

/********************************************************************************************
** 函数名称: void DelayMs(uchar t)
** 功能描述: MS级延时函数 11.0592M
** 输 入: t
** 输 出: 无
*********************************************************************************************/
void DelayMs(uchar t)
{
    uint y;
    while (t--!=0)
    {
        for (y=0;y<500;y++)	nop;
    }
}

/********************************************************************************************
** 函数名称: void CH372_RdData(void)
** 功能描述: 从CH372读出单个数据
** 输 入: 无
** 输 出: dat 读到的数据
*********************************************************************************************/
uchar CH372_RdData(void)
{
	DelayUs(1); 
	return( CH375_DAT_PORT );
}

/********************************************************************************************
** 函数名称: void CH372_WrCmd(uchar cmd)
** 功能描述: 向CH372写入命令
** 输 入: cmd 要写的命令
** 输 出: 无
*********************************************************************************************/
void CH372_WrCmd(uchar cmd)
{	
	DelayUs(2);
	CH375_CMD_PORT=cmd;
	DelayUs(2);
}

/********************************************************************************************
** 函数名称: void CH372_WrData(uchar dat)
** 功能描述: 向CH372写入单个数据
** 输 入: dat 要写的数据
** 输 出: 无
*********************************************************************************************/
void CH372_WrData(uchar dat)
{
	CH375_DAT_PORT=dat;
	DelayUs(1); 
}

/********************************************************************************************
** 函数名称: bit CH372_Init()
** 功能描述: 初始化CH372
** 输 入: 无
** 输 出: 成功返回1,失败返回0
*********************************************************************************************/
bit CH372_Init()
{
    uchar i, status;
	CH372_WrCmd(CMD_RESET_ALL);//CH372硬件复位
	DelayMs(50);
	CH372_WrCmd(CMD_CHECK_EXIST);//CH372硬件测试
	CH372_WrData(0x55);  // 写入测试数据
	status = CH372_RdData();
	if(status!=0xaa) return 0;//读出返回数据!=~0x55;CH372工作不正常

	CH372_WrCmd(CMD_SET_USB_MODE);
	CH372_WrData(2);  // 设置为使用内置固件的USB设备方
	for (i=10;i!=0;i--)// 等待操作成功,通常需要等待10uS-20uS
	{
		status=CH372_RdData();
		if (status==CMD_RET_SUCCESS)
		{
			return 1;
		}
		DelayUs(10);
	}
	return 0;
}

/********************************************************************************************
** 函数名称: void CH372Interrupt()
** 功能描述: USB中断处理函数
** 输 入: 无
** 输 出: 无
*********************************************************************************************/
void CH372Interrupt()
{
    uchar i;
    uchar IntStatus;
    if(!CH372_INT)
    {
        CH372_WrCmd(CMD_GET_STATUS);                       /*CMD_GET_STATUS 获取中断状态并取消中断请求 */
        IntStatus = CH372_RdData( );              /* 获取中断状态 */
        if( IntStatus == USB_INT_EP2_OUT )            /* 批量端点下传成功,接收到命令包 */
        {
            CH372_WrCmd( CMD_RD_USB_DATA );  /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
            USB_RecLen = CH372_RdData( );            /* 首先读取后续数据长度 */
            for (i=0;i<USB_RecLen;i++)
            {
                USB_Buff[i]=CH372_RdData( );   /* 接收命令包的数据 */
            }
            USB_RecFlag = 1;
        }
        else if ( IntStatus == USB_INT_EP2_IN )         /* 批量数据发送成功,状态包已发送 */
        {
            CH372_WrCmd( CMD_UNLOCK_USB );       /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */
			USB_SendFlag = 0;
        }
        else if ( IntStatus == USB_INT_EP1_IN )         /* 中断数据发送成功,本程序未用到 */
        {
            CH372_WrCmd( CMD_UNLOCK_USB );       /* 释放当前USB缓冲区 */
        }
    }
}
/********************************************************************************************
** 函数名称: void USB_Send_Data(uchar*p,len)
** 功能描述: USB数据发送函数
** 输 入: *p发送缓冲区地址,len数据长度
** 输 出: 无
*********************************************************************************************/
void USB_Send_Data(uchar*p,len)
{
    uchar i;
	USB_SendFlag = 1; 
    CH372_WrCmd( CMD_WR_USB_DATA7 );  /* 向USB端点2的发送缓冲区写入数据块 */
    CH372_WrData(len);               /* 首先写入后续数据长度 */
    for (i=0;i<len;i++)
    {
        CH372_WrData( *p );     /* 写入数据到CH372 */
		p++;
    }
}




⌨️ 快捷键说明

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