📄 ch372.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 + -