From 05b0cf5500bf096442525566819d26da335fcaf9 Mon Sep 17 00:00:00 2001 From: hebiyilaowang <1263939237@qq.com> Date: Thu, 16 Apr 2026 13:01:01 +0800 Subject: [PATCH 1/2] Utf-8 --- CH552.H | 10 +-- Debug.C | 36 ++++----- Debug.H | 32 ++++---- Main_Usb.C | 234 ++++++++++++++++++++++++++--------------------------- SW_DP.c | 6 +- Uart.c | 148 ++++++++++++++++----------------- Uart1Dbg.C | 46 ++++++----- 7 files changed, 261 insertions(+), 251 deletions(-) diff --git a/CH552.H b/CH552.H index 74b7522..bd40134 100644 --- a/CH552.H +++ b/CH552.H @@ -972,7 +972,7 @@ extern "C" #endif #ifndef USB_DEVICE_ADDR -#define USB_DEVICE_ADDR 0x02 /* 默认的USB设备地址 */ +#define USB_DEVICE_ADDR 0x02 /* 榛樿鐨刄SB璁惧鍦板潃 */ #endif #ifndef DEFAULT_ENDP0_SIZE #define DEFAULT_ENDP0_SIZE 64 /* default maximum packet size for endpoint 0 */ @@ -981,15 +981,15 @@ extern "C" #define MAX_PACKET_SIZE 64 /* maximum packet size */ #endif #ifndef USB_BO_CBW_SIZE -#define USB_BO_CBW_SIZE 0x1F /* 命令块CBW的总长度 */ -#define USB_BO_CSW_SIZE 0x0D /* 命令状态块CSW的总长度 */ +#define USB_BO_CBW_SIZE 0x1F /* 鍛戒护鍧桟BW鐨勬婚暱搴 */ +#define USB_BO_CSW_SIZE 0x0D /* 鍛戒护鐘舵佸潡CSW鐨勬婚暱搴 */ #endif #ifndef USB_BO_CBW_SIG0 -#define USB_BO_CBW_SIG0 0x55 /* 命令块CBW识别标志'USBC' */ +#define USB_BO_CBW_SIG0 0x55 /* 鍛戒护鍧桟BW璇嗗埆鏍囧織'USBC' */ #define USB_BO_CBW_SIG1 0x53 #define USB_BO_CBW_SIG2 0x42 #define USB_BO_CBW_SIG3 0x43 -#define USB_BO_CSW_SIG0 0x55 /* 命令状态块CSW识别标志'USBS' */ +#define USB_BO_CSW_SIG0 0x55 /* 鍛戒护鐘舵佸潡CSW璇嗗埆鏍囧織'USBS' */ #define USB_BO_CSW_SIG1 0x53 #define USB_BO_CSW_SIG2 0x42 #define USB_BO_CSW_SIG3 0x53 diff --git a/Debug.C b/Debug.C index 0e8c28b..262acde 100644 --- a/Debug.C +++ b/Debug.C @@ -4,7 +4,7 @@ * Version : V1.0 * Date : 2017/01/20 * Description : CH552 DEBUG Interface - (1)、串口0输出打印信息,波特率可变; + (1)銆佷覆鍙0杈撳嚭鎵撳嵃淇℃伅锛屾尝鐗圭巼鍙彉; *******************************************************************************/ #include "CH552.H" @@ -12,10 +12,10 @@ /******************************************************************************* * Function Name : CfgFsys( ) -* Description : CH552时钟选择和配置函数,默认使用内部晶振12MHz,如果定义了FREQ_SYS可以 - 根据PLL_CFG和CLOCK_CFG配置得到,公式如下: +* Description : CH552鏃堕挓閫夋嫨鍜岄厤缃嚱鏁,榛樿浣跨敤鍐呴儴鏅舵尟12MHz锛屽鏋滃畾涔変簡FREQ_SYS鍙互 + 鏍规嵁PLL_CFG鍜孋LOCK_CFG閰嶇疆寰楀埌锛屽叕寮忓涓嬶細 Fsys = (Fosc * ( PLL_CFG & MASK_PLL_MULT ))/(CLOCK_CFG & MASK_SYS_CK_DIV); - 具体时钟需要自己配置 + 鍏蜂綋鏃堕挓闇瑕佽嚜宸遍厤缃 * Input : None * Output : None * Return : None @@ -25,8 +25,8 @@ void CfgFsys() #ifdef OSC_EN_XT SAFE_MOD = 0x55; SAFE_MOD = 0xAA; - CLOCK_CFG |= bOSC_EN_XT; //使能外部晶振 - CLOCK_CFG &= ~bOSC_EN_INT; //关闭内部晶振 + CLOCK_CFG |= bOSC_EN_XT; //浣胯兘澶栭儴鏅舵尟 + CLOCK_CFG &= ~bOSC_EN_INT; //鍏抽棴鍐呴儴鏅舵尟 #endif SAFE_MOD = 0x55; SAFE_MOD = 0xAA; @@ -57,12 +57,12 @@ void CfgFsys() /******************************************************************************* * Function Name : mDelayus(UNIT16 n) -* Description : us延时函数 +* Description : us寤舵椂鍑芥暟 * Input : UNIT16 n * Output : None * Return : None *******************************************************************************/ -void mDelayuS(UINT16 n) // 以uS为单位延时 +void mDelayuS(UINT16 n) // 浠S涓哄崟浣嶅欢鏃 { #ifdef FREQ_SYS #if FREQ_SYS <= 6000000 @@ -117,12 +117,12 @@ void mDelayuS(UINT16 n) // /******************************************************************************* * Function Name : mDelayms(UNIT16 n) -* Description : ms延时函数 +* Description : ms寤舵椂鍑芥暟 * Input : UNIT16 n * Output : None * Return : None *******************************************************************************/ -void mDelaymS(UINT16 n) // 以mS为单位延时 +void mDelaymS(UINT16 n) // 浠S涓哄崟浣嶅欢鏃 { while (n) { @@ -140,7 +140,7 @@ void mDelaymS(UINT16 n) // /******************************************************************************* * Function Name : CH552WatchDog(UINT8 mode) -* Description : CH552看门狗模式设置 +* Description : CH552鐪嬮棬鐙楁ā寮忚缃 * Input : UINT8 mode 0 timer 1 watchDog @@ -150,19 +150,19 @@ void mDelaymS(UINT16 n) // //void CH552WatchDog(UINT8 mode) //{ // SAFE_MOD = 0x55; -// SAFE_MOD = 0xaa; //进入安全模式 +// SAFE_MOD = 0xaa; //杩涘叆瀹夊叏妯″紡 // if(mode){ // GLOBAL_CFG |= bWDOG_EN; // } // else GLOBAL_CFG &= ~bWDOG_EN; -// SAFE_MOD = 0x00; //退出安全模式 -// WDOG_COUNT = 0; //看门狗赋初值 +// SAFE_MOD = 0x00; //閫鍑哄畨鍏ㄦā寮 +// WDOG_COUNT = 0; //鐪嬮棬鐙楄祴鍒濆 //} /******************************************************************************* * Function Name : CH552WatchDogFeed(UINT8 tim) -* Description : CH552看门狗喂狗 -* Input : UINT8 tim 看门狗复位时间设置 +* Description : CH552鐪嬮棬鐙楀杺鐙 +* Input : UINT8 tim 鐪嬮棬鐙楀浣嶆椂闂磋缃 00H(6MHz)=2.8s 80H(6MHz)=1.4s * Output : None @@ -170,12 +170,12 @@ void mDelaymS(UINT16 n) // *******************************************************************************/ //void CH552WatchDogFeed(UINT8 tim) //{ -// WDOG_COUNT = tim; //看门狗赋初值 +// WDOG_COUNT = tim; //鐪嬮棬鐙楄祴鍒濆 //} /******************************************************************************* * Function Name : CH552SoftReset() - * Description : CH552软复位 + * Description : CH552杞浣 * Input : None * Output : None * Return : None diff --git a/Debug.H b/Debug.H index 93d785b..b7bf73c 100644 --- a/Debug.H +++ b/Debug.H @@ -1,10 +1,10 @@ -/* 调试 */ -/* 提供printf子程序和延时函数 */ +/* 璋冭瘯 */ +/* 鎻愪緵printf瀛愮▼搴忓拰寤舵椂鍑芥暟 */ #ifndef __DEBUG_H__ #define __DEBUG_H__ -//定义函数返回值 +//瀹氫箟鍑芥暟杩斿洖鍊 #ifndef SUCCESS #define SUCCESS 0 #endif @@ -12,7 +12,7 @@ #define FAIL 0xFF #endif -//定义定时器起始 +//瀹氫箟瀹氭椂鍣ㄨ捣濮 #ifndef START #define START 1 #endif @@ -23,20 +23,20 @@ //#ifndef DE_PRINTF //#define DE_PRINTF 1 //#endif -#define FREQ_SYS 24000000 //系统主频16MHz +#define FREQ_SYS 24000000 //绯荤粺涓婚16MHz -void CfgFsys(); //CH552时钟选择和配置 -void mDelayuS(UINT16 n); // 以uS为单位延时 -void mDelaymS(UINT16 n); // 以mS为单位延时 -void CH552UART0Alter(); //CH552串口0引脚映射到P0.2/P0.3 -void UART0Setup(); //T1作为波特率发生器 -UINT8 CH552UART0RcvByte(); //CH552 UART0查询方式接收一个字节 -void CH552UART0SendByte(UINT8 SendDat); //CH552UART0发送一个字节 +void CfgFsys(); //CH552鏃堕挓閫夋嫨鍜岄厤缃 +void mDelayuS(UINT16 n); // 浠S涓哄崟浣嶅欢鏃 +void mDelaymS(UINT16 n); // 浠S涓哄崟浣嶅欢鏃 +void CH552UART0Alter(); //CH552涓插彛0寮曡剼鏄犲皠鍒癙0.2/P0.3 +void UART0Setup(); //T1浣滀负娉㈢壒鐜囧彂鐢熷櫒 +UINT8 CH552UART0RcvByte(); //CH552 UART0鏌ヨ鏂瑰紡鎺ユ敹涓涓瓧鑺 +void CH552UART0SendByte(UINT8 SendDat); //CH552UART0鍙戦佷竴涓瓧鑺 void UART1Setup(); // -UINT8 CH552UART1RcvByte(); //CH552 UART1查询方式接收一个字节 -void CH552UART1SendByte(UINT8 SendDat); //CH552UART1发送一个字节 +UINT8 CH552UART1RcvByte(); //CH552 UART1鏌ヨ鏂瑰紡鎺ユ敹涓涓瓧鑺 +void CH552UART1SendByte(UINT8 SendDat); //CH552UART1鍙戦佷竴涓瓧鑺 -void CH552WatchDog(UINT8 mode); //CH552看门狗模式设置 -void CH552WatchDogFeed(UINT8 tim); //CH552看门狗喂狗 +void CH552WatchDog(UINT8 mode); //CH552鐪嬮棬鐙楁ā寮忚缃 +void CH552WatchDogFeed(UINT8 tim); //CH552鐪嬮棬鐙楀杺鐙 #endif diff --git a/Main_Usb.C b/Main_Usb.C index 8d20d52..7cce7c9 100644 --- a/Main_Usb.C +++ b/Main_Usb.C @@ -4,7 +4,7 @@ * Author : WCH * Version : V1.2 * Date : 2018/02/28 -* Description : CH554模拟HID兼容设备,支持中断上下传,支持控制端点上下传,支持设置全速,低速 +* Description : CH554妯℃嫙HID鍏煎璁惧锛屾敮鎸佷腑鏂笂涓嬩紶锛屾敮鎸佹帶鍒剁鐐逛笂涓嬩紶锛屾敮鎸佽缃叏閫燂紝浣庨 *******************************************************************************/ #include "CH552.H" @@ -17,28 +17,28 @@ #define Fullspeed 1 #define THIS_ENDP0_SIZE 64 -UINT8X Ep0Buffer[THIS_ENDP0_SIZE] _at_ 0x0000; //端点0 OUT&IN缓冲区,必须是偶地址 -UINT8X Ep1BufferO[THIS_ENDP0_SIZE] _at_ 0x0040; //端点1 OUT双缓冲区,必须是偶地址 Not Change!!!!!! -UINT8X Ep1BufferI[THIS_ENDP0_SIZE] _at_ 0x0080; //端点1 IN双缓冲区,必须是偶地址 Not Change!!!!!! +UINT8X Ep0Buffer[THIS_ENDP0_SIZE] _at_ 0x0000; //绔偣0 OUT&IN缂撳啿鍖猴紝蹇呴』鏄伓鍦板潃 +UINT8X Ep1BufferO[THIS_ENDP0_SIZE] _at_ 0x0040; //绔偣1 OUT鍙岀紦鍐插尯,蹇呴』鏄伓鍦板潃 Not Change!!!!!! +UINT8X Ep1BufferI[THIS_ENDP0_SIZE] _at_ 0x0080; //绔偣1 IN鍙岀紦鍐插尯,蹇呴』鏄伓鍦板潃 Not Change!!!!!! //100,140,180,1C0 -UINT8X Ep2BufferO[4 * THIS_ENDP0_SIZE] _at_ 0x0100; //端点2 OUT双缓冲区,必须是偶地址 +UINT8X Ep2BufferO[4 * THIS_ENDP0_SIZE] _at_ 0x0100; //绔偣2 OUT鍙岀紦鍐插尯,蹇呴』鏄伓鍦板潃 //200,240,280,2C0 -UINT8X Ep3BufferI[4 * THIS_ENDP0_SIZE] _at_ 0x0200; //端点3 IN双缓冲区,必须是偶地址 +UINT8X Ep3BufferI[4 * THIS_ENDP0_SIZE] _at_ 0x0200; //绔偣3 IN鍙岀紦鍐插尯,蹇呴』鏄伓鍦板潃 extern BOOL UART_TX_BUSY; extern BOOL EP1_TX_BUSY; BOOL DAP_LED_BUSY; -UINT8I Ep2Oi, Ep2Oo; //OUT 索引 -UINT8I Ep3Ii, Ep3Io; //IN 索引 -UINT8I Ep3Is[DAP_PACKET_COUNT]; //发送包 -PUINT8 pDescr; //USB配置标志 +UINT8I Ep2Oi, Ep2Oo; //OUT 绱㈠紩 +UINT8I Ep3Ii, Ep3Io; //IN 绱㈠紩 +UINT8I Ep3Is[DAP_PACKET_COUNT]; //鍙戦佸寘 +PUINT8 pDescr; //USB閰嶇疆鏍囧織 UINT8I Endp3Busy = 0; UINT8I SetupReq, SetupLen, Count, UsbConfig; #define UsbSetupBuf ((PUSB_SETUP_REQ)Ep0Buffer) -/*HID类报表描述符*/ +/*HID绫绘姤琛ㄦ弿杩扮*/ UINT8C HIDRepDesc[] = { 0x06, 0x00, 0XFF, //Usage Page (Vendor-Defined 1) @@ -140,11 +140,11 @@ code const UINT8C CfgDesc[] = sizeof(HIDRepDesc) & 0xFF, sizeof(HIDRepDesc) >> 8, // Total length of report descriptor. #endif - //端点描述符 + //绔偣鎻忚堪绗 0x07, 0x05, 0x02, -#ifdef DAP_USE_HID_FW_V1 //切换通讯方式,HID属于中断通讯,WinUsb属于块 +#ifdef DAP_USE_HID_FW_V1 //鍒囨崲閫氳鏂瑰紡锛孒ID灞炰簬涓柇閫氳锛學inUsb灞炰簬鍧 0x03, // bmAttributes #else 0x02, // bmAttributes @@ -153,11 +153,11 @@ code const UINT8C CfgDesc[] = 0x00, 0x01, - //端点描述符 + //绔偣鎻忚堪绗 0x07, 0x05, 0x83, -#ifdef DAP_USE_HID_FW_V1 //切换通讯方式,HID属于中断通讯,WinUsb属于块 +#ifdef DAP_USE_HID_FW_V1 //鍒囨崲閫氳鏂瑰紡锛孒ID灞炰簬涓柇閫氳锛學inUsb灞炰簬鍧 0x03, // bmAttributes #else 0x02, // bmAttributes @@ -276,7 +276,7 @@ code const UINT8C CfgDesc[] = UINT16I USB_STATUS = 0; -UINT8I LineCoding[7] = {0x00, 0xA2, 0x5D, 0x4F, 0x00, 0x00, 0x08}; //初始化波特率为115200,1停止位,无校验,8数据位。 +UINT8I LineCoding[7] = {0x00, 0xA2, 0x5D, 0x4F, 0x00, 0x00, 0x08}; //鍒濆鍖栨尝鐗圭巼涓115200锛1鍋滄浣嶏紝鏃犳牎楠岋紝8鏁版嵁浣嶃 code const UINT8C LangDesc[] = { 4, 0x03, // Length = 4 bytes, String Descriptor (0x03) @@ -288,9 +288,9 @@ code const UINT8C i_SerialNumber[] = { 'l', 0, 'c', 0, 'k', 0, 'f', 0, 'b', 0, '.', 0, 'c', 0, 'o', 0, 'm', 0, '-', 0, 'v', 0, '1', 0, '.', 0, '1', 0, '.', 0, '0', 0, #ifdef DAP_USE_HID_FW_V1 - 'H', 0 //表示使用hid协议 兼容win7 mdk5.28一下可以正常识别 + 'H', 0 //琛ㄧず浣跨敤hid鍗忚 鍏煎win7 mdk5.28涓涓嬪彲浠ユ甯歌瘑鍒 #else - 'W', 0 //表示使用winusb协议 不兼容win7 mdk5.28一下可以正常识别 + 'W', 0 //琛ㄧず浣跨敤winusb鍗忚 涓嶅吋瀹箇in7 mdk5.28涓涓嬪彲浠ユ甯歌瘑鍒 #endif }; @@ -313,7 +313,7 @@ code const UINT8C i_CdcString[] = 'D', 0, 'A', 0, 'P', 0, 'L', 0, 'i', 0, 'n', 0, 'k', 0, '-', 0, 'C', 0, 'D', 0, 'C', 0, 'E', 0, 'x', 0, 't', 0 }; -// 接口: CMSIS-DAP +// 鎺ュ彛: CMSIS-DAP UINT8C i_Interface[] = { 26, @@ -392,7 +392,7 @@ UINT8C WINUSB_Descriptor[] = /******************************************************************************* * Function Name : USBDeviceInit() -* Description : USB设备模式配置,设备模式启动,收发端点配置,中断开启 +* Description : USB璁惧妯″紡閰嶇疆,璁惧妯″紡鍚姩锛屾敹鍙戠鐐归厤缃紝涓柇寮鍚 * Input : None * Output : None * Return : None @@ -400,104 +400,104 @@ UINT8C WINUSB_Descriptor[] = void USBDeviceInit() { IE_USB = 0; - USB_CTRL = 0x00; // 先设定USB设备模式 - UDEV_CTRL = bUD_PD_DIS; // 禁止DP/DM下拉电阻 + USB_CTRL = 0x00; // 鍏堣瀹歎SB璁惧妯″紡 + UDEV_CTRL = bUD_PD_DIS; // 绂佹DP/DM涓嬫媺鐢甸樆 #ifndef Fullspeed - UDEV_CTRL |= bUD_LOW_SPEED; //选择低速1.5M模式 + UDEV_CTRL |= bUD_LOW_SPEED; //閫夋嫨浣庨1.5M妯″紡 USB_CTRL |= bUC_LOW_SPEED; #else - UDEV_CTRL &= ~bUD_LOW_SPEED; //选择全速12M模式,默认方式 + UDEV_CTRL &= ~bUD_LOW_SPEED; //閫夋嫨鍏ㄩ12M妯″紡锛岄粯璁ゆ柟寮 USB_CTRL &= ~bUC_LOW_SPEED; #endif - UEP0_DMA = Ep0Buffer; //端点0数据传输地址 - UEP4_1_MOD &= ~(bUEP4_RX_EN | bUEP4_TX_EN); //端点0单64字节收发缓冲区 - UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; //OUT事务返回ACK,IN事务返回NAK + UEP0_DMA = Ep0Buffer; //绔偣0鏁版嵁浼犺緭鍦板潃 + UEP4_1_MOD &= ~(bUEP4_RX_EN | bUEP4_TX_EN); //绔偣0鍗64瀛楄妭鏀跺彂缂撳啿鍖 + UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; //OUT浜嬪姟杩斿洖ACK锛孖N浜嬪姟杩斿洖NAK - UEP1_DMA = Ep1BufferO; //端点1数据传输地址 - UEP4_1_MOD |= bUEP1_TX_EN | bUEP1_RX_EN; //端点1发送接收使能 - UEP4_1_MOD &= ~bUEP1_BUF_MOD; //端点1收发各64字节缓冲区 - UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK; //端点1自动翻转同步标志位,IN事务返回NAK,OUT返回ACK + UEP1_DMA = Ep1BufferO; //绔偣1鏁版嵁浼犺緭鍦板潃 + UEP4_1_MOD |= bUEP1_TX_EN | bUEP1_RX_EN; //绔偣1鍙戦佹帴鏀朵娇鑳 + UEP4_1_MOD &= ~bUEP1_BUF_MOD; //绔偣1鏀跺彂鍚64瀛楄妭缂撳啿鍖 + UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK; //绔偣1鑷姩缈昏浆鍚屾鏍囧織浣嶏紝IN浜嬪姟杩斿洖NAK锛孫UT杩斿洖ACK - UEP2_DMA = Ep2BufferO; //端点2数据传输地址 - UEP3_DMA = Ep3BufferI; //端点2数据传输地址 - UEP2_3_MOD |= (bUEP3_TX_EN | bUEP2_RX_EN); //端点2发送接收使能 - UEP2_3_MOD &= ~(bUEP2_BUF_MOD | bUEP3_BUF_MOD); //端点2收发各64字节缓冲区 - UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK; //端点2自动翻转同步标志位,IN事务返回NAK,OUT返回ACK - UEP3_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_NAK;//端点3自动翻转同步标志位,IN事务返回NAK,OUT返回NACK + UEP2_DMA = Ep2BufferO; //绔偣2鏁版嵁浼犺緭鍦板潃 + UEP3_DMA = Ep3BufferI; //绔偣2鏁版嵁浼犺緭鍦板潃 + UEP2_3_MOD |= (bUEP3_TX_EN | bUEP2_RX_EN); //绔偣2鍙戦佹帴鏀朵娇鑳 + UEP2_3_MOD &= ~(bUEP2_BUF_MOD | bUEP3_BUF_MOD); //绔偣2鏀跺彂鍚64瀛楄妭缂撳啿鍖 + UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK; //绔偣2鑷姩缈昏浆鍚屾鏍囧織浣嶏紝IN浜嬪姟杩斿洖NAK锛孫UT杩斿洖ACK + UEP3_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_NAK;//绔偣3鑷姩缈昏浆鍚屾鏍囧織浣嶏紝IN浜嬪姟杩斿洖NAK锛孫UT杩斿洖NACK USB_DEV_AD = 0x00; - USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN; // 启动USB设备及DMA,在中断期间中断标志未清除前自动返回NAK - UDEV_CTRL |= bUD_PORT_EN; // 允许USB端口 - USB_INT_FG = 0xFF; // 清中断标志 + USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN; // 鍚姩USB璁惧鍙奃MA锛屽湪涓柇鏈熼棿涓柇鏍囧織鏈竻闄ゅ墠鑷姩杩斿洖NAK + UDEV_CTRL |= bUD_PORT_EN; // 鍏佽USB绔彛 + USB_INT_FG = 0xFF; // 娓呬腑鏂爣蹇 USB_INT_EN = bUIE_SUSPEND | bUIE_TRANSFER | bUIE_BUS_RST; IE_USB = 1; } /******************************************************************************* * Function Name : DeviceInterrupt() -* Description : CH559USB中断处理函数 +* Description : CH559USB涓柇澶勭悊鍑芥暟 *******************************************************************************/ -void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB中断服务程序,使用寄存器组1 +void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB涓柇鏈嶅姟绋嬪簭,浣跨敤瀵勫瓨鍣ㄧ粍1 { UINT8 len; - if (UIF_TRANSFER) // USB传输完成标志 + if (UIF_TRANSFER) // USB浼犺緭瀹屾垚鏍囧織 { ////printf("USB_INT_ST:%x\r\n",(USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP))); switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) { - case UIS_TOKEN_OUT | 2: // endpoint 2# 端点批量下传 DAP-CMD - if (U_TOG_OK) // 不同步的数据包将丢弃 + case UIS_TOKEN_OUT | 2: // endpoint 2# 绔偣鎵归噺涓嬩紶 DAP-CMD + if (U_TOG_OK) // 涓嶅悓姝ョ殑鏁版嵁鍖呭皢涓㈠純 { Ep2Oi += 64; UEP2_DMA_L = Ep2Oi; } break; - case UIS_TOKEN_IN | 3: // endpoint 3# 端点批量上传 DAP_ASK + case UIS_TOKEN_IN | 3: // endpoint 3# 绔偣鎵归噺涓婁紶 DAP_ASK Endp3Busy = 0; - UEP3_T_LEN = 0; //预使用发送长度一定要清空 - UEP3_CTRL = UEP3_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK + UEP3_T_LEN = 0; //棰勪娇鐢ㄥ彂閫侀暱搴︿竴瀹氳娓呯┖ + UEP3_CTRL = UEP3_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //榛樿搴旂瓟NAK break; - case UIS_TOKEN_IN | 1: // endpoint 1# 端点批量上传 CDC - UEP1_T_LEN = 0; //预使用发送长度一定要清空 + case UIS_TOKEN_IN | 1: // endpoint 1# 绔偣鎵归噺涓婁紶 CDC + UEP1_T_LEN = 0; //棰勪娇鐢ㄥ彂閫侀暱搴︿竴瀹氳娓呯┖ EP1_TX_BUSY = FALSE; - UEP1_CTRL = UEP1_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK + UEP1_CTRL = UEP1_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; //榛樿搴旂瓟NAK break; - case UIS_TOKEN_OUT | 1: // endpoint 1# 端点批量下传 CDC - if (U_TOG_OK) // 不同步的数据包将丢弃 + case UIS_TOKEN_OUT | 1: // endpoint 1# 绔偣鎵归噺涓嬩紶 CDC + if (U_TOG_OK) // 涓嶅悓姝ョ殑鏁版嵁鍖呭皢涓㈠純 { UART_Get_USB_Data(USB_RX_LEN); } break; - case UIS_TOKEN_SETUP | 0: // SETUP事务 + case UIS_TOKEN_SETUP | 0: // SETUP浜嬪姟 len = USB_RX_LEN; if (len == (sizeof(USB_SETUP_REQ))) { SetupLen = UsbSetupBuf->wLengthL; if (UsbSetupBuf->wLengthH) - SetupLen = 0xFF; // 限制总长度 - len = 0; // 默认为成功并且上传0长度 + SetupLen = 0xFF; // 闄愬埗鎬婚暱搴 + len = 0; // 榛樿涓烘垚鍔熷苟涓斾笂浼0闀垮害 SetupReq = UsbSetupBuf->bRequest; switch (UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK) { case USB_REQ_TYP_STANDARD: - switch (SetupReq) //请求码 + switch (SetupReq) //璇锋眰鐮 { case USB_GET_DESCRIPTOR: switch (UsbSetupBuf->wValueH) { - case 1: //设备描述符 - pDescr = DevDesc; //把设备描述符送到要发送的缓冲区 + case 1: //璁惧鎻忚堪绗 + pDescr = DevDesc; //鎶婅澶囨弿杩扮閫佸埌瑕佸彂閫佺殑缂撳啿鍖 len = sizeof(DevDesc); break; - case 2: //配置描述符 - pDescr = CfgDesc; //把设备描述符送到要发送的缓冲区 + case 2: //閰嶇疆鎻忚堪绗 + pDescr = CfgDesc; //鎶婅澶囨弿杩扮閫佸埌瑕佸彂閫佺殑缂撳啿鍖 len = sizeof(CfgDesc); // printf("CfgDesc len:%d\r\n",(UINT16)len); break; - case 3: // 字符串描述符 + case 3: // 瀛楃涓叉弿杩扮 if (UsbSetupBuf->wValueL < (sizeof(StringDescs)/sizeof(StringDescs[0]))) { pDescr = (UINT8C *)(StringDescs[UsbSetupBuf->wValueL]); @@ -505,24 +505,24 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB } else { - len = 0xFF; //不支持的类型 + len = 0xFF; //涓嶆敮鎸佺殑绫诲瀷 } break; case 15: pDescr = (PUINT8)(&USB_BOSDescriptor[0]); len = sizeof(USB_BOSDescriptor); break; - case 0x22: //报表描述符 GW HID - pDescr = HIDRepDesc; //数据准备上传 + case 0x22: //鎶ヨ〃鎻忚堪绗 GW HID + pDescr = HIDRepDesc; //鏁版嵁鍑嗗涓婁紶 len = sizeof(HIDRepDesc); break; default: - len = 0xff; //不支持的命令或者出错 + len = 0xff; //涓嶆敮鎸佺殑鍛戒护鎴栬呭嚭閿 break; } break; case USB_SET_ADDRESS: - SetupLen = UsbSetupBuf->wValueL; //暂存USB设备地址 + SetupLen = UsbSetupBuf->wValueL; //鏆傚瓨USB璁惧鍦板潃 break; case USB_GET_CONFIGURATION: Ep0Buffer[0] = UsbConfig; @@ -537,7 +537,7 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB case 0x0A: break; case USB_CLEAR_FEATURE: // Clear Feature - if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_ENDP) // 端点 + if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_ENDP) // 绔偣 { switch (UsbSetupBuf->wIndexL) { @@ -551,62 +551,62 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB UEP2_CTRL = UEP2_CTRL & ~(bUEP_R_TOG | MASK_UEP_R_RES) | UEP_R_RES_ACK; break; default: - len = 0xFF; // 不支持的端点 + len = 0xFF; // 涓嶆敮鎸佺殑绔偣 break; } } else { - len = 0xFF; // 不是端点不支持 + len = 0xFF; // 涓嶆槸绔偣涓嶆敮鎸 } break; case USB_SET_FEATURE: /* Set Feature */ - if ((UsbSetupBuf->bRequestType & 0x1F) == 0x00) /* 设置设备 */ + if ((UsbSetupBuf->bRequestType & 0x1F) == 0x00) /* 璁剧疆璁惧 */ { if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x01) { if (CfgDesc[7] & 0x20) { - /* 设置唤醒使能标志 */ + /* 璁剧疆鍞ら啋浣胯兘鏍囧織 */ } else { - len = 0xFF; /* 操作失败 */ + len = 0xFF; /* 鎿嶄綔澶辫触 */ } } else { - len = 0xFF; /* 操作失败 */ + len = 0xFF; /* 鎿嶄綔澶辫触 */ } } - else if ((UsbSetupBuf->bRequestType & 0x1F) == 0x02) /* 设置端点 */ + else if ((UsbSetupBuf->bRequestType & 0x1F) == 0x02) /* 璁剧疆绔偣 */ { if ((((UINT16)UsbSetupBuf->wValueH << 8) | UsbSetupBuf->wValueL) == 0x00) { switch (((UINT16)UsbSetupBuf->wIndexH << 8) | UsbSetupBuf->wIndexL) { case 0x82: - UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点2 IN STALL */ + UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 璁剧疆绔偣2 IN STALL */ break; case 0x02: - UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL; /* 设置端点2 OUT Stall */ + UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL; /* 璁剧疆绔偣2 OUT Stall */ break; case 0x81: - UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 设置端点1 IN STALL */ + UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL; /* 璁剧疆绔偣1 IN STALL */ break; default: - len = 0xFF; /* 操作失败 */ + len = 0xFF; /* 鎿嶄綔澶辫触 */ break; } } else { - len = 0xFF; /* 操作失败 */ + len = 0xFF; /* 鎿嶄綔澶辫触 */ } } else { - len = 0xFF; /* 操作失败 */ + len = 0xFF; /* 鎿嶄綔澶辫触 */ } break; case USB_GET_STATUS: @@ -621,19 +621,19 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB } break; default: - len = 0xff; //操作失败 + len = 0xff; //鎿嶄綔澶辫触 break; } break; - case USB_REQ_TYP_CLASS: /*HID类命令*/ + case USB_REQ_TYP_CLASS: /*HID绫诲懡浠*/ if ((UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK) == USB_REQ_RECIP_INTERF) { switch (SetupReq) { case 0x01: // GetReport - //pDescr = UserEp2Buf; //控制端点上传输据 - if (SetupLen >= THIS_ENDP0_SIZE) //大于端点0大小,需要特殊处理 + //pDescr = UserEp2Buf; //鎺у埗绔偣涓婁紶杈撴嵁 + if (SetupLen >= THIS_ENDP0_SIZE) //澶т簬绔偣0澶у皬锛岄渶瑕佺壒娈婂鐞 { len = THIS_ENDP0_SIZE; } @@ -661,7 +661,7 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB case 0x22://generates RS-232/V.24 style control signals break; default: - len = 0xFF; /*命令不支持*/ + len = 0xFF; /*鍛戒护涓嶆敮鎸*/ break; } } @@ -674,12 +674,12 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB case 0x20: // GetReport if (UsbSetupBuf->wIndexL == 0x07) { - pDescr = WINUSB_Descriptor; //把设备描述符送到要发送的缓冲区 + pDescr = WINUSB_Descriptor; //鎶婅澶囨弿杩扮閫佸埌瑕佸彂閫佺殑缂撳啿鍖 len = sizeof(WINUSB_Descriptor); } break; default: - len = 0xFF; /*命令不支持*/ + len = 0xFF; /*鍛戒护涓嶆敮鎸*/ break; } } @@ -692,32 +692,32 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB { if (SetupLen > len) { - SetupLen = len; //限制总长度 + SetupLen = len; //闄愬埗鎬婚暱搴 } - len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度 - memcpy(Ep0Buffer, pDescr, len); //加载上传数据 + len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //鏈浼犺緭闀垮害 + memcpy(Ep0Buffer, pDescr, len); //鍔犺浇涓婁紶鏁版嵁 SetupLen -= len; pDescr += len; } } else { - len = 0xff; //包长度错误 + len = 0xff; //鍖呴暱搴﹂敊璇 } if (len == 0xff) { SetupReq = 0xFF; UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL; // STALL } - else if (len <= THIS_ENDP0_SIZE) //上传数据或者状态阶段返回0长度包 + else if (len <= THIS_ENDP0_SIZE) //涓婁紶鏁版嵁鎴栬呯姸鎬侀樁娈佃繑鍥0闀垮害鍖 { UEP0_T_LEN = len; - UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK + UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //榛樿鏁版嵁鍖呮槸DATA1锛岃繑鍥炲簲绛擜CK } else { - UEP0_T_LEN = 0; //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段 - UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //默认数据包是DATA1,返回应答ACK + UEP0_T_LEN = 0; //铏界劧灏氭湭鍒扮姸鎬侀樁娈碉紝浣嗘槸鎻愬墠棰勭疆涓婁紶0闀垮害鏁版嵁鍖呬互闃蹭富鏈烘彁鍓嶈繘鍏ョ姸鎬侀樁娈 + UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK; //榛樿鏁版嵁鍖呮槸DATA1,杩斿洖搴旂瓟ACK } break; case UIS_TOKEN_IN | 0: // endpoint0 IN @@ -725,26 +725,26 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB { case USB_GET_DESCRIPTOR: case 0x20: - len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //本次传输长度 - memcpy(Ep0Buffer, pDescr, len); //加载上传数据 + len = SetupLen >= THIS_ENDP0_SIZE ? THIS_ENDP0_SIZE : SetupLen; //鏈浼犺緭闀垮害 + memcpy(Ep0Buffer, pDescr, len); //鍔犺浇涓婁紶鏁版嵁 SetupLen -= len; pDescr += len; UEP0_T_LEN = len; - UEP0_CTRL ^= bUEP_T_TOG; //同步标志位翻转 + UEP0_CTRL ^= bUEP_T_TOG; //鍚屾鏍囧織浣嶇炕杞 break; case USB_SET_ADDRESS: USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen; UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; break; default: - UEP0_T_LEN = 0; //状态阶段完成中断或者是强制上传0长度数据包结束控制传输 + UEP0_T_LEN = 0; //鐘舵侀樁娈靛畬鎴愪腑鏂垨鑰呮槸寮哄埗涓婁紶0闀垮害鏁版嵁鍖呯粨鏉熸帶鍒朵紶杈 UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; break; } break; case UIS_TOKEN_OUT | 0: // endpoint0 OUT len = USB_RX_LEN; - if (SetupReq == 0x20) //设置串口属性 + if (SetupReq == 0x20) //璁剧疆涓插彛灞炴 { if (U_TOG_OK) { @@ -756,7 +756,7 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB } UEP0_T_LEN = 0; - UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_ACK; // 准备上传0包 + UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_ACK; // 鍑嗗涓婁紶0鍖 } } else if (SetupReq == 0x09) @@ -768,14 +768,14 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB { } } - UEP0_CTRL ^= bUEP_R_TOG; //同步标志位翻转 + UEP0_CTRL ^= bUEP_R_TOG; //鍚屾鏍囧織浣嶇炕杞 break; default: break; } - UIF_TRANSFER = 0; //写0清空中断 + UIF_TRANSFER = 0; //鍐0娓呯┖涓柇 } - if (UIF_BUS_RST) //设备模式USB总线复位中断 + if (UIF_BUS_RST) //璁惧妯″紡USB鎬荤嚎澶嶄綅涓柇 { UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; UEP1_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK; @@ -784,19 +784,19 @@ void DeviceInterrupt(void) interrupt INT_NO_USB using 1 // USB UIF_SUSPEND = 0; UIF_TRANSFER = 0; Endp3Busy = 0; - UIF_BUS_RST = 0; //清中断标志 + UIF_BUS_RST = 0; //娓呬腑鏂爣蹇 } - if (UIF_SUSPEND) // USB总线挂起/唤醒完成 + if (UIF_SUSPEND) // USB鎬荤嚎鎸傝捣/鍞ら啋瀹屾垚 { UIF_SUSPEND = 0; - if (USB_MIS_ST & bUMS_SUSPEND) //挂起 + if (USB_MIS_ST & bUMS_SUSPEND) //鎸傝捣 { } } else { - //意外的中断,不可能发生的情况 - USB_INT_FG = 0xFF; //清中断标志 + //鎰忓鐨勪腑鏂,涓嶅彲鑳藉彂鐢熺殑鎯呭喌 + USB_INT_FG = 0xFF; //娓呬腑鏂爣蹇 } } @@ -808,15 +808,15 @@ void main(void) { UINT8 Uart_Timeout = 0; - CfgFsys(); //CH559时钟选择配置 - mDelaymS(5); //修改主频等待内部晶振稳定,必加 + CfgFsys(); //CH559鏃堕挓閫夋嫨閰嶇疆 + mDelaymS(5); //淇敼涓婚绛夊緟鍐呴儴鏅舵尟绋冲畾,蹇呭姞 UART1Init(); - USBDeviceInit(); //USB设备模式初始化 + USBDeviceInit(); //USB璁惧妯″紡鍒濆鍖 // UART_Setup(); - EA = 1; //允许单片机中断 - UEP1_T_LEN = 0; //预使用发送长度一定要清空 - UEP2_T_LEN = 0; //预使用发送长度一定要清空 + EA = 1; //鍏佽鍗曠墖鏈轰腑鏂 + UEP1_T_LEN = 0; //棰勪娇鐢ㄥ彂閫侀暱搴︿竴瀹氳娓呯┖ + UEP2_T_LEN = 0; //棰勪娇鐢ㄥ彂閫侀暱搴︿竴瀹氳娓呯┖ Ep2Oi = 0; Ep2Oo = 0; Ep3Ii = 0; @@ -846,7 +846,7 @@ void main(void) #endif UEP3_DMA_L = Ep3Io; - UEP3_CTRL = UEP3_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_ACK; //有数据时上传数据并应答ACK + UEP3_CTRL = UEP3_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_ACK; //鏈夋暟鎹椂涓婁紶鏁版嵁骞跺簲绛擜CK Ep3Io += 64; } diff --git a/SW_DP.c b/SW_DP.c index a14e3a4..0c10a5f 100644 --- a/SW_DP.c +++ b/SW_DP.c @@ -44,12 +44,12 @@ Configures the DAP Hardware I/O pins for Serial Wire Debug (SWD) mode: void PORT_SWD_SETUP(void) { // Set SWCLK HIGH - //推挽输出 + //鎺ㄦ尳杈撳嚭 P1_MOD_OC = P1_MOD_OC & ~(1 << 7); P1_DIR_PU = P1_DIR_PU | (1 << 7); SWK = 1; // Set SWDIO HIGH - //推挽输出 + //鎺ㄦ尳杈撳嚭 P1_MOD_OC = P1_MOD_OC & ~(1 << 5); P1_DIR_PU = P1_DIR_PU | (1 << 5); SWD = 1; @@ -58,7 +58,7 @@ void PORT_SWD_SETUP(void) P1_DIR_PU = P1_DIR_PU & ~(1 << 6); // Set RESET HIGH - //推挽输出 + //鎺ㄦ尳杈撳嚭 RST = 0; } diff --git a/Uart.c b/Uart.c index c7ee353..fe3658d 100644 --- a/Uart.c +++ b/Uart.c @@ -17,11 +17,11 @@ UINT8X UART_TX_Data_Buff[512]_at_ 0x0300; void UART_Setup(UINT8 *cfg_uart) { // 00 C2 01 00 00 00 08 - // 00 C2 01 00 00 01 08 //old校验 - // 00 C2 01 00 00 02 08 //even校验 - // 00 C2 01 00 00 00 07 //7位数据位 - // 00 C2 01 00 02 00 08 //2个停止位 - // 00 C2 01 00 01 00 08 //1.5个停止位 + // 00 C2 01 00 00 01 08 //old鏍¢獙 + // 00 C2 01 00 00 02 08 //even鏍¢獙 + // 00 C2 01 00 00 00 07 //7浣嶆暟鎹綅 + // 00 C2 01 00 02 00 08 //2涓仠姝綅 + // 00 C2 01 00 01 00 08 //1.5涓仠姝綅 UINT32 uart0_buad = 0; *((UINT8 *)&uart0_buad) = cfg_uart[3]; *((UINT8 *)&uart0_buad + 1) = cfg_uart[2]; @@ -39,28 +39,28 @@ void UART_Setup(UINT8 *cfg_uart) P3_MOD_OC |= 0x03; P3_DIR_PU |= 0x03; - //使用Timer1作为波特率发生器 - RCLK = 0; // UART0接收时钟 - TCLK = 0; // UART0发送时钟 + //浣跨敤Timer1浣滀负娉㈢壒鐜囧彂鐢熷櫒 + RCLK = 0; // UART0鎺ユ敹鏃堕挓 + TCLK = 0; // UART0鍙戦佹椂閽 PCON |= SMOD; - TMOD = TMOD & ~bT1_GATE & ~bT1_CT & ~MASK_T1_MOD | bT1_M1; // 0X20,Timer1作为8位自动重载定时器 - T2MOD = T2MOD | bTMR_CLK | bT1_CLK; // Timer1时钟选择 - TH1 = 0 - ((FREQ_SYS+8*uart0_buad) / 16 / uart0_buad); // 12MHz晶振,buad/12为实际需设置波特率 + TMOD = TMOD & ~bT1_GATE & ~bT1_CT & ~MASK_T1_MOD | bT1_M1; // 0X20锛孴imer1浣滀负8浣嶈嚜鍔ㄩ噸杞藉畾鏃跺櫒 + T2MOD = T2MOD | bTMR_CLK | bT1_CLK; // Timer1鏃堕挓閫夋嫨 + TH1 = 0 - ((FREQ_SYS+8*uart0_buad) / 16 / uart0_buad); // 12MHz鏅舵尟,buad/12涓哄疄闄呴渶璁剧疆娉㈢壒鐜 // TH1 = 0 - (UINT32)(FREQ_SYS + UART_BUAD * 8) / UART_BUAD / 16; - TR1 = 1; //启动定时器1 - SCON = 0x50; //串口0使用模式1 TI = 1; REN = 1; + TR1 = 1; //鍚姩瀹氭椂鍣1 + SCON = 0x50; //涓插彛0浣跨敤妯″紡1 TI = 1; REN = 1; if(0x00 == cfg_uart[5]) SCON &= (~(0x1<<7)); else SCON |= (0x1<<7); ES = 1; #elif USE_UART1 == 1 - P1_MOD_OC |= 0xC0; //开漏 - P1_DIR_PU |= 0xC0; //使能输出上拉电阻 - U1SM0 = 0; // UART1选择8位数据位 - U1SMOD = 1; //快速模式 - U1REN = 1; //使能接收 + P1_MOD_OC |= 0xC0; //寮婕 + P1_DIR_PU |= 0xC0; //浣胯兘杈撳嚭涓婃媺鐢甸樆 + U1SM0 = 0; // UART1閫夋嫨8浣嶆暟鎹綅 + U1SMOD = 1; //蹇熸ā寮 + U1REN = 1; //浣胯兘鎺ユ敹 SBAUD1 = 0 - (FREQ_SYS + UART_BUAD * 8) / 16 / UART_BUAD; IE_UART1 = 1; #else @@ -68,38 +68,38 @@ void UART_Setup(UINT8 *cfg_uart) #endif } -//R7 = 接收数量 +//R7 = 鎺ユ敹鏁伴噺 void UART_Get_USB_Data(UINT8 Nums) { #pragma asm - //MOV A,R0//记录R0的只 怕冲掉 + //MOV A,R0//璁板綍R0鐨勫彧 鎬曞啿鎺 //MOV R6,A MOV DPTR,#0040H CLR C - MOV A,FIFO_Read_Pointer //计算缓存剩余 + MOV A,FIFO_Read_Pointer //璁$畻缂撳瓨鍓╀綑 SUBB A,FIFO_Write_Pointer //CLR C DEC A CLR C SUBB A,R7 - JC ERR_OUT//缓存不够 - //来到这里的 C=0 - //开始搬数据 - //INC DPTR //设置到达源数据开始位置 + JC ERR_OUT//缂撳瓨涓嶅 + //鏉ュ埌杩欓噷鐨 C=0 + //寮濮嬫惉鏁版嵁 + //INC DPTR //璁剧疆鍒拌揪婧愭暟鎹紑濮嬩綅缃 MOV P2,#03H - MOV R0,FIFO_Write_Pointer //写指针就绪 p2在程序开始已经置高地址0x03 因为缓存已经对齐 所以写指针就是缓存地址的低地址 + MOV R0,FIFO_Write_Pointer //鍐欐寚閽堝氨缁 p2鍦ㄧ▼搴忓紑濮嬪凡缁忕疆楂樺湴鍧0x03 鍥犱负缂撳瓨宸茬粡瀵归綈 鎵浠ュ啓鎸囬拡灏辨槸缂撳瓨鍦板潃鐨勪綆鍦板潃 DATA_LOP: - MOVX A,@DPTR //获取数据源 XRAM 1T - MOVX @R0,A //写入 XRAM 1T + MOVX A,@DPTR //鑾峰彇鏁版嵁婧 XRAM 1T + MOVX @R0,A //鍐欏叆 XRAM 1T INC DPTR// 1T INC R0// 1T - DJNZ R7,DATA_LOP//如果剩余数量不为0 继续搬 4-6T - MOV FIFO_Write_Pointer,R0 //结束循环 回写 + DJNZ R7,DATA_LOP//濡傛灉鍓╀綑鏁伴噺涓嶄负0 缁х画鎼 4-6T + MOV FIFO_Write_Pointer,R0 //缁撴潫寰幆 鍥炲啓 - JB UART_TX_BUSY,NEXT_NAK //串口忙 跳走 串口不忙 开始新的发送 - MOV R0,FIFO_Read_Pointer//得到读指针 + JB UART_TX_BUSY,NEXT_NAK //涓插彛蹇 璺宠蛋 涓插彛涓嶅繖 寮濮嬫柊鐨勫彂閫 + MOV R0,FIFO_Read_Pointer//寰楀埌璇绘寚閽 MOVX A,@R0 #if USE_UART0 == 1 MOV C, P @@ -115,15 +115,15 @@ DATA_LOP: SETB UART_TX_BUSY NEXT_NAK: - //处理64->下次缓存是否够问题 + //澶勭悊64->涓嬫缂撳瓨鏄惁澶熼棶棰 CLR C - MOV A,FIFO_Read_Pointer //计算缓存剩余 + MOV A,FIFO_Read_Pointer //璁$畻缂撳瓨鍓╀綑 SUBB A,FIFO_Write_Pointer DEC A CLR C SUBB A,#040H JC ERR_OUT - ANL UEP1_CTRL,#0F3H //设置USB状态为ASK + ANL UEP1_CTRL,#0F3H //璁剧疆USB鐘舵佷负ASK RET ERR_OUT: MOV A,UEP1_CTRL //nak @@ -138,23 +138,23 @@ ERR_OUT: } /* -//获取从USB来的数据 注意 此函数不管能不能搬完 都要硬着头皮说完了 -void UART_Get_USB_Data(uint8_t Nums)//通讯中的收到包数量 +//鑾峰彇浠嶶SB鏉ョ殑鏁版嵁 娉ㄦ剰 姝ゅ嚱鏁颁笉绠¤兘涓嶈兘鎼畬 閮借纭潃澶寸毊璇村畬浜 +void UART_Get_USB_Data(uint8_t Nums)//閫氳涓殑鏀跺埌鍖呮暟閲 { uint8_t i; - uint8_t Buff_Last_nums;//缓存剩余数量 + uint8_t Buff_Last_nums;//缂撳瓨鍓╀綑鏁伴噺 Buff_Last_nums=FIFO_Read_Pointer-FIFO_Write_Pointer; Buff_Last_nums--; - if(Buff_Last_nums>=i)//通讯中的收到包数量 如果缓存足够 + if(Buff_Last_nums>=i)//閫氳涓殑鏀跺埌鍖呮暟閲 濡傛灉缂撳瓨瓒冲 { for(i=0;i ENDP1_SIZE)UART_RX_Data_Pointer = 0;//写入指针 + UART_RX_Data_Pointer++; //褰撳墠缂撳啿鍖哄墿浣欏緟鍙栧瓧鑺傛暟 + if (UART_RX_Data_Pointer > ENDP1_SIZE)UART_RX_Data_Pointer = 0;//鍐欏叆鎸囬拡 RI = 0; if(EP1_TX_BUSY==FALSE)UART_Send_USB_Data(); } - else if(TI)//发送完成 + else if(TI)//鍙戦佸畬鎴 { - if(FIFO_Read_Pointer!=FIFO_Write_Pointer)//如果不等 表示需要发送 + if(FIFO_Read_Pointer!=FIFO_Write_Pointer)//濡傛灉涓嶇瓑 琛ㄧず闇瑕佸彂閫 { // ACC = UART_TX_Data_Buff[FIFO_Read_Pointer]; - // if(P)//偶校验 + // if(P)//鍋舵牎楠 // TB8=1; // else // TB8=0; -#pragma asm //节约寻址方法 加快速度 +#pragma asm //鑺傜害瀵诲潃鏂规硶 鍔犲揩閫熷害 MOV DPH,#03H MOV DPL,FIFO_Read_Pointer MOVX A,@DPTR @@ -282,7 +282,7 @@ void Uart0_ISR(void) interrupt INT_NO_UART0 using 1 //SBUF=UART_TX_Data_Buff[FIFO_Read_Pointer]; //FIFO_Read_Pointer++; } - else//发送完了 最后一次进完成中断 设置串口空闲 + else//鍙戦佸畬浜 鏈鍚庝竴娆¤繘瀹屾垚涓柇 璁剧疆涓插彛绌洪棽 { UART_TX_BUSY=FALSE; } @@ -294,12 +294,12 @@ void Uart0_ISR(void) interrupt INT_NO_UART0 using 1 CLR C SUBB A,#040H JC T_NAK - ANL UEP1_CTRL,#0F3H //设置USB状态为ASK + ANL UEP1_CTRL,#0F3H //璁剧疆USB鐘舵佷负ASK T_NAK: #pragma endasm // if(((UINT8)FIFO_Read_Pointer-FIFO_Write_Pointer-1)>64) // { -// UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK;//缓存空 要 +// UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK;//缂撳瓨绌 瑕 // } TI =0; } @@ -307,19 +307,19 @@ void Uart0_ISR(void) interrupt INT_NO_UART0 using 1 #elif USE_UART1 == 1 void Uart1_ISR(void) interrupt INT_NO_UART1 using 1 { - if(U1RI) //收到数据 + if(U1RI) //鏀跺埌鏁版嵁 { UART_RX_Data_Buff[UART_RX_Data_Pointer] = SBUF1; UART_RX_Data_Pointer++; - if(UART_RX_Data_Pointer > ENDP1_SIZE)UART_RX_Data_Pointer=0;//出现错误 直接丢包 + if(UART_RX_Data_Pointer > ENDP1_SIZE)UART_RX_Data_Pointer=0;//鍑虹幇閿欒 鐩存帴涓㈠寘 U1RI =0; - if(EP1_TX_BUSY==FALSE)UART_Send_USB_Data();//负责第一包的发送 + if(EP1_TX_BUSY==FALSE)UART_Send_USB_Data();//璐熻矗绗竴鍖呯殑鍙戦 } - else if(U1TI)//发送完成 + else if(U1TI)//鍙戦佸畬鎴 { - if(FIFO_Read_Pointer!=FIFO_Write_Pointer)//如果不等 表示需要发送 + if(FIFO_Read_Pointer!=FIFO_Write_Pointer)//濡傛灉涓嶇瓑 琛ㄧず闇瑕佸彂閫 { -#pragma asm //节约寻址方法 加快速度 +#pragma asm //鑺傜害瀵诲潃鏂规硶 鍔犲揩閫熷害 MOV DPH,#03H MOV DPL,FIFO_Read_Pointer MOVX A,@DPTR @@ -329,7 +329,7 @@ void Uart1_ISR(void) interrupt INT_NO_UART1 using 1 //SBUF1=ICP_Write_Buff[FIFO_Read_Pointer]; //FIFO_Read_Pointer++; } - else//发送完了 最后一次进完成中断 设置串口空闲 + else//鍙戦佸畬浜 鏈鍚庝竴娆¤繘瀹屾垚涓柇 璁剧疆涓插彛绌洪棽 { UART_TX_BUSY=FALSE; } @@ -341,12 +341,12 @@ void Uart1_ISR(void) interrupt INT_NO_UART1 using 1 CLR C SUBB A,#040H JC T_NAK - ANL UEP1_CTRL,#0F3H //设置USB状态为ASK + ANL UEP1_CTRL,#0F3H //璁剧疆USB鐘舵佷负ASK T_NAK: #pragma endasm // if(((UINT8)FIFO_Read_Pointer-FIFO_Write_Pointer-1)>64) // { -// UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK;//缓存空 要 +// UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK;//缂撳瓨绌 瑕 // } U1TI =0; } diff --git a/Uart1Dbg.C b/Uart1Dbg.C index 0c8cce8..5cb5d82 100644 --- a/Uart1Dbg.C +++ b/Uart1Dbg.C @@ -1,14 +1,24 @@ +/* + * @Author: Changhai Lan + * @Date: 2026-04-16 12:52:57 + * @LastEditors: Changhai Lan + * @LastEditTime: 2026-04-16 12:58:15 + * @FilePath: /lspiclink/Uart1Dbg.C + * @Description: + * + * Copyright (c) 2026 by Changhai Lan, All Rights Reserved. + */ /********************************** (C) COPYRIGHT ******************************* * File Name : UART1.C * Author : WCH * Version : V1.0 * Date : 2018/07/25 -* Description : CH554 串口1收发 +* Description : CH554 涓插彛1鏀跺彂 *******************************************************************************/ -#define UART1_INTERRUPT 0 //定义是否使用接收中断接收数据 -#define UART1_PINMAP 1 //定义串口1是否开启引脚映射。不开启选择P16(R)、P17(T)。开启选择P34(R)、P32(T) -#define UART1_BUAD 115200 //波特率 +#define UART1_INTERRUPT 0 //瀹氫箟鏄惁浣跨敤鎺ユ敹涓柇鎺ユ敹鏁版嵁 +#define UART1_PINMAP 1 //瀹氫箟涓插彛1鏄惁寮鍚紩鑴氭槧灏勩備笉寮鍚夋嫨P16(R)銆丳17(T)銆傚紑鍚夋嫨P34(R)銆丳32(T) +#define UART1_BUAD 115200 //娉㈢壒鐜 #include "CH552.H" #include "Debug.H" #include "Uart1Dbg.H" @@ -18,56 +28,56 @@ /******************************************************************************* * Function Name : UART1Setup() -* Description : CH554串口1初始化 +* Description : CH554涓插彛1鍒濆鍖 * Input : None * Output : None * Return : None *******************************************************************************/ void UART1Init( ) { - U1SM0 = 0; //UART1选择8位数据位 - U1SMOD = 1; //快速模式 - U1REN = 1; //使能接收 + U1SM0 = 0; //UART1閫夋嫨8浣嶆暟鎹綅 + U1SMOD = 1; //蹇熸ā寮 + U1REN = 1; //浣胯兘鎺ユ敹 SBAUD1 = 0 - FREQ_SYS/16/UART1_BUAD; U1TI = 0; #if UART1_PINMAP - PIN_FUNC |= bUART1_PIN_X; //映射到P34(R)、P32(T) + PIN_FUNC |= bUART1_PIN_X; //鏄犲皠鍒癙34(R)銆丳32(T) #endif -#if UART1_INTERRUPT //开启中断使能 +#if UART1_INTERRUPT //寮鍚腑鏂娇鑳 IE_UART1 = 1; EA = 1; #endif } /******************************************************************************* * Function Name : CH554UART1RcvByte() -* Description : CH554UART1接收一个字节 +* Description : CH554UART1鎺ユ敹涓涓瓧鑺 * Input : None * Output : None * Return : SBUF *******************************************************************************/ UINT8 CH554UART1RcvByte( ) { - while(U1RI == 0); //查询接收,中断方式可不用 + while(U1RI == 0); //鏌ヨ鎺ユ敹锛屼腑鏂柟寮忓彲涓嶇敤 U1RI = 0; return SBUF1; } /******************************************************************************* * Function Name : CH554UART1SendByte(UINT8 SendDat) -* Description : CH554UART1发送一个字节 -* Input : UINT8 SendDat;要发送的数据 +* Description : CH554UART1鍙戦佷竴涓瓧鑺 +* Input : UINT8 SendDat锛涜鍙戦佺殑鏁版嵁 * Output : None * Return : None *******************************************************************************/ void CH554UART1SendByte(UINT8 SendDat) { - SBUF1 = SendDat; //查询发送,中断方式可不用下面2条语句,但发送前需TI=0 + SBUF1 = SendDat; //鏌ヨ鍙戦侊紝涓柇鏂瑰紡鍙笉鐢ㄤ笅闈2鏉¤鍙,浣嗗彂閫佸墠闇TI=0 while(U1TI ==0); U1TI = 0; } -//重映射printf +//閲嶆槧灏刾rintf char putchar(char c) { CH554UART1SendByte(c); @@ -77,9 +87,9 @@ char putchar(char c) #if UART1_INTERRUPT /******************************************************************************* * Function Name : UART1Interrupt(void) -* Description : UART1 中断服务程序 +* Description : UART1 涓柇鏈嶅姟绋嬪簭 *******************************************************************************/ -void UART1Interrupt( void ) interrupt INT_NO_UART1 using 1 //串口1中断服务程序,使用寄存器组1 +void UART1Interrupt( void ) interrupt INT_NO_UART1 using 1 //涓插彛1涓柇鏈嶅姟绋嬪簭,浣跨敤瀵勫瓨鍣ㄧ粍1 { UINT8 dat; if(U1RI) -- Gitee From c9f2465848929d3dadf1ce2690369155751ff77c Mon Sep 17 00:00:00 2001 From: hebiyilaowang <1263939237@qq.com> Date: Thu, 16 Apr 2026 13:02:51 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=E7=AC=A6=E4=BB=A5=E6=94=AF=E6=8C=81Linux=E4=B8=8B=E7=9A=84CDC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Main_Usb.C | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Main_Usb.C b/Main_Usb.C index 7cce7c9..661dfde 100644 --- a/Main_Usb.C +++ b/Main_Usb.C @@ -171,7 +171,7 @@ code const UINT8C CfgDesc[] = // Interface Association Descriptor (CDC) 8, // Length of the descriptor 0x0B, // Type: Interface Association Descriptor (IAD) - 0x02, // First interface: 0 in this case, see following ,gw Interface descriptor (CDC)data and ctrl + 0x01, // First interface: 1 in this case, see following ,gw Interface descriptor (CDC)data and ctrl 0x02, // Total number of grouped interfaces 0x02, // bFunctionClass 0x02, // bFunctionSubClass @@ -181,7 +181,7 @@ code const UINT8C CfgDesc[] = // Interface descriptor (CDC) Control 9, // Length of the descriptor 0x04, // Type: Interface Descriptor - 0x02, // Interface ID + 0x01, // Interface ID 0x00, // Alternate setting 0x01, // Number of Endpoints 0x02, // Interface class code - Communication Interface Class @@ -202,7 +202,7 @@ code const UINT8C CfgDesc[] = 0x00, // bmCapabilities // Bit0: Does not handle call management // Bit1: Call Management over Comm Class interface - 0x00, // Data Interfaces + 0x02, // Data Interfaces // Abstract Control Management (CDC) 4, // Length of the descriptor @@ -220,8 +220,8 @@ code const UINT8C CfgDesc[] = 5, // Length of the descriptor 0x24, // bDescriptortype, CS_INTERFACE 0x06, // bDescriptorSubtype: Union func desc - 0x00, // bMasterInterface: Communication class interface - 0x01, // bSlaveInterface0: Data Class Interface + 0x01, // bMasterInterface: Communication class interface + 0x02, // bSlaveInterface0: Data Class Interface // EndPoint descriptor (CDC Upload, Interrupt) 7, // Length of the descriptor @@ -239,7 +239,7 @@ code const UINT8C CfgDesc[] = // Interface descriptor (CDC) Data 9, // Length of the descriptor 0x04, // Type: Interface Descriptor - 0x03, // Interface ID + 0x02, // Interface ID 0x00, // Alternate setting 0x02, // Number of Endpoints 0x0a, // Interface class code -- Gitee