├── .gitignore ├── .gitmodules ├── README.md └── src ├── Makefile └── main.c /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.tmp 3 | *.bin 4 | *.ihx 5 | *.hex 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "ch554_sdcc"] 2 | path = ch554_sdcc 3 | url = https://github.com/Blinkinlabs/ch554_sdcc 4 | 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Features 2 | ====== 3 | 4 | An USB to Serial Converter firmware running on CH552T. 5 | 6 | It also can automatically detect ESP32 & K210 bootloader message, force it enter ISP mode without help from FLOW CONTROL PINs (DTR/RTS). 7 | 8 | Issues 9 | -------------- 10 | 11 | Baudrate range: 1200bps - 1.5Mbps 12 | 13 | USB endpoints are not configured as ping-pong mode, it makes it even slower. The real performance of this dongle is about 978Kbps, measured by esptool. 14 | 15 | This usb to serial converter does not contains any hardware flow control feature and it can only works with 8N1 line coding. 16 | 17 | Warning: High baudrate is not accurate at all, 115200 is the last traditional baudrate that it supports. For higher baudrate, please use 250Kbps, 500Kbps, 750Kbps. 18 | 19 | So, my advice is... Don't use this puppy to make USB to Serial Bridge? CH330, CH340, HT42B534 and GD32F150/STM32F103're better choice than CH55x series MCU. Optimizing this code (by rewritten it in assembly) is just like real hell working. 20 | 21 | 22 | Boards 23 | -------------- 24 | 25 | Sipeed Maixduino 26 | 27 | Build 28 | -------------- 29 | 30 | It requires make, sdcc and binutils. 31 | 32 | If you got all of them, enter the src directory, and type "make" to generate binary file. 33 | 34 | Programming 35 | -------------- 36 | 37 | By WinchipHead's official WCHISPTOOL or LibreCH551 from rgwan. 38 | 39 | License 40 | -------------- 41 | 42 | MIT 43 | 44 | Authors 45 | -------------- 46 | 47 | Kongou Hikari 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/Makefile: -------------------------------------------------------------------------------- 1 | TARGET = usb_dualser 2 | 3 | # Adjust the XRAM location and size to leave space for the USB DMA buffers 4 | # Buffer layout in XRAM: 5 | # 0x0000 Ep0Buffer[8] 6 | # 0x0040 Ep1Buffer[8] 7 | # 0x0080 EP2Buffer[2*64] 8 | # 9 | # This takes a total of 256bytes, so there are 768 bytes left. 10 | XRAM_SIZE = 0x0300 11 | XRAM_LOC = 0x0100 12 | 13 | FREQ_SYS = 24000000 14 | 15 | EXTRA_FLAGS = --opt-code-speed 16 | 17 | C_FILES = \ 18 | main.c \ 19 | ../ch554_sdcc/include/debug.c 20 | 21 | include ../ch554_sdcc/examples/Makefile.include 22 | 23 | -------------------------------------------------------------------------------- /src/main.c: -------------------------------------------------------------------------------- 1 | /********************************** (C) COPYRIGHT ******************************* 2 | * File Name : CDC.C 3 | * Author : Kongou Hikari 4 | * Version : V1.0 5 | * Date : 2019/02/16 6 | * Description : CH552 USB to Serial with FTDI Protocol 7 | *******************************************************************************/ 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | /* 17 | * Use T0 to count the SOF_Count every 1ms 18 | * If you doesn't like this feature, define SOF_NO_TIMER 19 | * Background: The usb host must to send SOF every 1ms, but some USB host don't really do that 20 | * FTDI's driver has some bug, if it doesn't received empty packet with modem status, 21 | * it will causes BSoD, so highly recommended use T0 instead of SOF packet to generate empty packet report. 22 | */ 23 | //#define SOF_NO_TIMER 24 | 25 | /* 26 | Memory map: 27 | EP0 Buf 00 - 3f 28 | EP4 Buf 40 - 7f 29 | EP1 Buf 80 - bf 30 | RingBuf1 100 - 1ff 31 | RingBuf2 200 - 2ff 32 | EP2 Buf 300 - 33f 33 | EP3 Buf 380 - 3bf 34 | */ 35 | 36 | __xdata __at (0x0000) uint8_t Ep0Buffer[DEFAULT_ENDP0_SIZE]; //端点0 OUT&IN缓冲区,必须是偶地址 37 | __xdata __at (0x0040) uint8_t Ep4Buffer[MAX_PACKET_SIZE]; //端点4 OUT接收缓冲区 38 | __xdata __at (0x0080) uint8_t Ep1Buffer[MAX_PACKET_SIZE]; //端点1 IN 发送缓冲区 39 | __xdata __at (0x0300) uint8_t Ep2Buffer[MAX_PACKET_SIZE * 2]; //端点2 OUT接收缓冲区 40 | 41 | __xdata __at (0x0380) uint8_t Ep3Buffer[MAX_PACKET_SIZE]; //端点3 IN 发送缓冲区 42 | 43 | 44 | __xdata __at (0x0100) uint8_t RingBuf[128]; 45 | __xdata __at (0x0200) uint8_t RingBuf_1[128]; 46 | 47 | 48 | uint16_t SetupLen; 49 | uint8_t SetupReq, Count, UsbConfig; 50 | uint8_t VendorControl; 51 | 52 | __code uint8_t * pDescr; //USB配置标志 53 | uint8_t pDescr_Index = 0; 54 | USB_SETUP_REQ SetupReqBuf; //暂存Setup包 55 | #define UsbSetupBuf ((PUSB_SETUP_REQ)Ep0Buffer) 56 | 57 | 58 | /*设备描述符*/ 59 | __code uint8_t DevDesc[] = {0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, DEFAULT_ENDP0_SIZE, 60 | 0x03, 0x04, 0x10, 0x60, 0x00, 0x05, 0x01, 0x02, 61 | 0x03, 0x01 62 | }; 63 | __code uint8_t CfgDesc[] = 64 | { 65 | 0x09, 0x02, sizeof(CfgDesc) & 0xff, sizeof(CfgDesc) >> 8, 66 | 0x02, 0x01, 0x00, 0x80, 0x32, //配置描述符(1个接口) 67 | //以下为接口0(数据接口)描述符 68 | 0x09, 0x04, 0x00, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00, //数据接口描述符 69 | 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00, //端点描述符 EP1 BULK IN 70 | 0x07, 0x05, 0x02, 0x02, 0x40, 0x00, 0x00, //端点描述符 EP2 BULK OUT 71 | //以下为接口01(数据接口)描述符 72 | 0x09, 0x04, 0x01, 0x00, 0x02, 0xff, 0xff, 0xff, 0x00, //数据接口描述符 73 | 0x07, 0x05, 0x83, 0x02, 0x40, 0x00, 0x00, //端点描述符 EP3 BULK IN 74 | 0x07, 0x05, 0x04, 0x02, 0x40, 0x00, 0x00, //端点描述符 EP4 BULK OUT 75 | }; 76 | /*字符串描述符*/ 77 | unsigned char __code LangDes[] = {0x04, 0x03, 0x09, 0x04}; //语言描述符 78 | 79 | unsigned char __code Prod_Des[] = //产品字符串描述符 80 | { 81 | sizeof(Prod_Des), 0x03, 82 | 'S', 0x00, 'i', 0x00, 'p', 0x00, 'e', 0x00, 'e', 0x00, 'd', 0x00, 83 | '-', 0x00, 'D', 0x00, 'e', 0x00, 'b', 0x00, 'u', 0x00, 'g', 0x00 84 | }; 85 | unsigned char __code Manuf_Des[] = 86 | { 87 | sizeof(Manuf_Des), 0x03, 88 | 'K', 0x00, 'o', 0x00, 'n', 0x00, 'g', 0x00, 'o', 0x00, 'u', 0x00, 89 | ' ', 0x00, 'H', 0x00, 'i', 0x00, 'k', 0x00, 'a', 0x00, 'r', 0x00, 'i', 0x00 90 | }; 91 | 92 | /* 下载控制 */ 93 | volatile __idata uint8_t USBOutLength = 0; 94 | volatile __idata uint8_t USBOutPtr = 0; 95 | volatile __idata uint8_t USBReceived = 0; 96 | 97 | volatile __idata uint8_t USBRecvLen_A = 0; 98 | volatile __idata uint8_t USBRecvLen_B = 0; 99 | volatile __idata uint8_t USBRecvBuf = 0; 100 | volatile __idata uint8_t Serial_Done = 0; 101 | volatile __idata uint8_t USBBufState = 0; 102 | volatile __idata uint8_t SerialSendBuf = 0; 103 | volatile __idata uint8_t USB_Require_Data = 0; 104 | 105 | volatile __idata uint8_t USBOutLength_1 = 0; 106 | volatile __idata uint8_t USBOutPtr_1 = 0; 107 | volatile __idata uint8_t USBReceived_1 = 0; 108 | /* 上传控制 */ 109 | volatile __idata uint8_t UpPoint1_Busy = 0; //上传端点是否忙标志 110 | volatile __idata uint8_t UpPoint1_LenA = 2; 111 | volatile __idata uint8_t UpPoint1_LenB = 2; 112 | 113 | volatile __idata uint8_t UpPoint3_Busy = 0; //上传端点是否忙标志 114 | 115 | /* 杂项 */ 116 | volatile __idata uint16_t SOF_Count = 0; 117 | volatile __idata uint8_t Latency_Timer = 4; //Latency Timer 118 | volatile __idata uint8_t Latency_Timer1 = 4; 119 | volatile __idata uint8_t Require_DFU = 0; 120 | 121 | /* 流控 */ 122 | volatile __idata uint8_t soft_dtr = 0; 123 | volatile __idata uint8_t soft_rts = 0; 124 | 125 | volatile __idata uint8_t soft_dtr_1 = 0; 126 | volatile __idata uint8_t soft_rts_1 = 0; 127 | 128 | #define HARD_ESP_CTRL 1 129 | 130 | #ifndef HARD_ESP_CTRL 131 | volatile __idata uint8_t Esp_Boot_Chk = 0; 132 | volatile __idata uint8_t Esp_Require_Reset = 0; 133 | #endif 134 | 135 | /******************************************************************************* 136 | * Function Name : USBDeviceCfg() 137 | * Description : USB设备模式配置 138 | * Input : None 139 | * Output : None 140 | * Return : None 141 | *******************************************************************************/ 142 | void USBDeviceCfg() 143 | { 144 | USB_CTRL = 0x00; //清空USB控制寄存器 145 | USB_CTRL &= ~bUC_HOST_MODE; //该位为选择设备模式 146 | USB_CTRL |= bUC_DEV_PU_EN | bUC_INT_BUSY | bUC_DMA_EN; //USB设备和内部上拉使能,在中断期间中断标志未清除前自动返回NAK 147 | USB_DEV_AD = 0x00; //设备地址初始化 148 | // USB_CTRL |= bUC_LOW_SPEED; 149 | // UDEV_CTRL |= bUD_LOW_SPEED; //选择低速1.5M模式 150 | USB_CTRL &= ~bUC_LOW_SPEED; 151 | UDEV_CTRL &= ~bUD_LOW_SPEED; //选择全速12M模式,默认方式 152 | UDEV_CTRL = bUD_PD_DIS; // 禁止DP/DM下拉电阻 153 | UDEV_CTRL |= bUD_PORT_EN; //使能物理端口 154 | } 155 | 156 | void Jump_to_BL() 157 | { 158 | ES = 0; 159 | PS = 0; 160 | 161 | USB_INT_EN = 0; 162 | USB_CTRL = 0x06; 163 | //UDEV_CTRL = 0x80; 164 | 165 | mDelaymS(100); 166 | 167 | EA = 0; 168 | 169 | while(1) 170 | { 171 | __asm 172 | LJMP 0x3800 173 | __endasm; 174 | } 175 | } 176 | /******************************************************************************* 177 | * Function Name : USBDeviceIntCfg() 178 | * Description : USB设备模式中断初始化 179 | * Input : None 180 | * Output : None 181 | * Return : None 182 | *******************************************************************************/ 183 | void USBDeviceIntCfg() 184 | { 185 | USB_INT_EN |= bUIE_SUSPEND; //使能设备挂起中断 186 | USB_INT_EN |= bUIE_TRANSFER; //使能USB传输完成中断 187 | USB_INT_EN |= bUIE_BUS_RST; //使能设备模式USB总线复位中断 188 | USB_INT_EN |= bUIE_DEV_SOF; //打开SOF中断 189 | USB_INT_FG |= 0x1F; //清中断标志 190 | IE_USB = 1; //使能USB中断 191 | EA = 1; //允许单片机中断 192 | } 193 | /******************************************************************************* 194 | * Function Name : USBDeviceEndPointCfg() 195 | * Description : USB设备模式端点配置,模拟兼容HID设备,除了端点0的控制传输,还包括端点2批量上下传 196 | * Input : None 197 | * Output : None 198 | * Return : None 199 | *******************************************************************************/ 200 | void USBDeviceEndPointCfg() 201 | { 202 | // TODO: Is casting the right thing here? What about endianness? 203 | UEP2_DMA = (uint16_t) Ep2Buffer; //端点2 OUT接收数据传输地址 204 | UEP3_DMA = (uint16_t) Ep3Buffer; 205 | //UEP2_3_MOD = 0x48; //端点2 单缓冲接收, 端点3单缓冲发送 206 | UEP2_3_MOD = 0x49; //端点3单缓冲发送,端点2双缓冲接收 207 | 208 | UEP2_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK; //端点2 自动翻转同步标志位,OUT返回ACK 209 | UEP3_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK; //端点3发送返回NAK 210 | 211 | //UEP4_DMA = (uint16_t) Ep4Buffer; //Ep4Buffer = Ep0Buffer + 64 212 | UEP1_DMA = (uint16_t) Ep1Buffer; //端点1 IN 发送数据传输地址 213 | UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK; //端点1 自动翻转同步标志位,IN事务返回NAK 214 | UEP4_CTRL = bUEP_AUTO_TOG | UEP_R_RES_ACK; //端点4接收返回ACK, 无法自动翻转 215 | UEP4_1_MOD = 0x48; //端点1 单缓冲发送, 端点4单缓冲接收 216 | 217 | UEP0_DMA = (uint16_t) Ep0Buffer; //端点0数据传输地址 218 | UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; //手动翻转,OUT事务返回ACK,IN事务返回NAK 219 | } 220 | 221 | __code uint8_t HexToAscTab[] = "0123456789ABCDEF"; 222 | 223 | void uuidcpy(__xdata uint8_t *dest, uint8_t index, uint8_t len) /* 使用UUID生成USB Serial Number */ 224 | { 225 | uint8_t i; 226 | uint8_t p = 0; /* UUID格式, 十位十六进制数 */ 227 | __code uint8_t *puuid; 228 | for(i = index; i < (index + len); i++) 229 | { 230 | if(i == 0) 231 | dest[p++] = 22; //10 * 2 + 2 232 | else if(i == 1) 233 | dest[p++] = 0x03; 234 | else 235 | { 236 | if(i & 0x01) //奇数 237 | { 238 | dest[p++] = 0x00; 239 | } 240 | else 241 | { 242 | puuid = (__code uint8_t *) (0x3ffa + (i - 2) / 4); 243 | if(i & 0x02) 244 | dest[p++] = HexToAscTab[(*puuid) >> 4]; 245 | else 246 | dest[p++] = HexToAscTab[(*puuid) & 0x0f]; 247 | } 248 | } 249 | } 250 | } 251 | 252 | #define INTF1_DTR TIN1 253 | #define INTF1_RTS TIN0 254 | 255 | #define INTF2_DTR TIN3 256 | #define INTF2_RTS TIN2 257 | 258 | volatile __idata uint8_t DTR_State = 0; 259 | volatile __idata uint8_t Modem_Count = 0; 260 | 261 | /******************************************************************************* 262 | * Function Name : DeviceInterrupt() 263 | * Description : CH559USB中断处理函数 264 | *******************************************************************************/ 265 | void DeviceInterrupt(void) __interrupt (INT_NO_USB) //USB中断服务程序,使用寄存器组1 266 | { 267 | uint16_t len; 268 | uint16_t divisor; 269 | if ((USB_INT_ST & MASK_UIS_TOKEN) == UIS_TOKEN_SOF) 270 | { 271 | #ifdef SOF_NO_TIMER 272 | SOF_Count ++; 273 | if(Modem_Count) 274 | Modem_Count --; 275 | if(Modem_Count == 1) 276 | { 277 | if(soft_dtr == 0 && soft_rts == 1) 278 | { 279 | INTF1_RTS = 1; 280 | INTF1_DTR = 0; 281 | } 282 | if(soft_dtr == 1 && soft_rts == 0) 283 | { 284 | INTF1_RTS = 0; 285 | INTF1_DTR = 1; 286 | } 287 | if(soft_dtr == soft_rts) 288 | { 289 | INTF1_DTR = 1; 290 | INTF1_RTS = 0; 291 | INTF1_RTS = 1; 292 | } 293 | } 294 | #endif /* SOF_NO_TIMER */ 295 | } 296 | if(UIF_TRANSFER) //USB传输完成标志 297 | { 298 | switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) 299 | { 300 | case UIS_TOKEN_IN | 1: //endpoint 1# 端点批量上传 301 | UEP1_T_LEN = 0; 302 | UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK 303 | UpPoint1_Busy = 0; //清除忙标志 304 | break; 305 | case UIS_TOKEN_OUT | 2: //endpoint 2# 端点批量下传 306 | if ( U_TOG_OK ) // 不同步的数据包将丢弃 307 | { 308 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_NAK; //收到一包数据就NAK,主函数处理完,由主函数修改响应方式 309 | USBReceived = 1; 310 | if(UEP2_CTRL & bUEP_R_TOG) 311 | { 312 | USBRecvBuf = 0; //缓冲2 313 | USBRecvLen_A = USB_RX_LEN; 314 | } 315 | else 316 | { 317 | USBRecvBuf = 1; //缓冲1 318 | USBRecvLen_B = USB_RX_LEN; 319 | } 320 | USB_Require_Data = 0; 321 | } 322 | break; 323 | case UIS_TOKEN_IN | 3: //endpoint 3# 端点批量上传 324 | UEP3_T_LEN = 0; 325 | UEP3_CTRL = UEP3_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK; //默认应答NAK 326 | UpPoint3_Busy = 0; //清除忙标志 327 | break; 328 | case UIS_TOKEN_OUT | 4: //endpoint 4# 端点批量下传 329 | if ( U_TOG_OK ) // 不同步的数据包将丢弃 330 | { 331 | UEP4_CTRL ^= bUEP_R_TOG; //同步标志位翻转 332 | UEP4_CTRL = UEP4_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_NAK; //收到一包数据就NAK,主函数处理完,由主函数修改响应方式 333 | USBOutPtr_1 = 64; //TODO: Nasty Solution 334 | USBOutLength_1 = USB_RX_LEN + 64; 335 | USBReceived_1 = 1; 336 | } 337 | break; 338 | case UIS_TOKEN_SETUP | 0: //SETUP事务 339 | len = USB_RX_LEN; 340 | if(len == (sizeof(USB_SETUP_REQ))) 341 | { 342 | SetupLen = ((uint16_t)UsbSetupBuf->wLengthH << 8) | (UsbSetupBuf->wLengthL); 343 | len = 0; // 默认为成功并且上传0长度 344 | VendorControl = 0; 345 | SetupReq = UsbSetupBuf->bRequest; 346 | if ( ( UsbSetupBuf->bRequestType & USB_REQ_TYP_MASK ) != USB_REQ_TYP_STANDARD )//非标准请求 347 | { 348 | //TODO: 重写 349 | VendorControl = 1; 350 | if(UsbSetupBuf->bRequestType & USB_REQ_TYP_READ) 351 | { 352 | //读 353 | switch( SetupReq ) 354 | { 355 | case 0x90: //READ EEPROM 356 | Ep0Buffer[0] = 0xff; 357 | Ep0Buffer[1] = 0xff; 358 | len = 2; 359 | break; 360 | case 0x0a: 361 | if(UsbSetupBuf->wIndexL == 2) 362 | Ep0Buffer[0] = Latency_Timer1; 363 | else 364 | Ep0Buffer[0] = Latency_Timer; 365 | len = 1; 366 | break; 367 | case 0x05: 368 | Ep0Buffer[0] = 0x01; 369 | Ep0Buffer[1] = 0x60; 370 | len = 2; 371 | break; 372 | default: 373 | len = 0xFF; /*命令不支持*/ 374 | break; 375 | } 376 | } 377 | else 378 | { 379 | //写 380 | switch( SetupReq ) 381 | { 382 | case 0x02: 383 | case 0x04: 384 | case 0x06: 385 | case 0x07: 386 | case 0x0b: 387 | case 0x92: 388 | len = 0; 389 | break; 390 | case 0x91: //WRITE EEPROM, FT_PROG动作,直接跳转BL 391 | Require_DFU = 1; 392 | len = 0; 393 | break; 394 | case 0x00: 395 | if(UsbSetupBuf->wIndexL == 1) 396 | UpPoint1_Busy = 0; 397 | if(UsbSetupBuf->wIndexL == 2) 398 | { 399 | UpPoint3_Busy = 0; 400 | UEP4_CTRL &= ~(bUEP_R_TOG); 401 | } 402 | len = 0; 403 | break; 404 | case 0x09: //SET LATENCY TIMER 405 | if(UsbSetupBuf->wIndexL == 1) 406 | Latency_Timer = UsbSetupBuf->wValueL; 407 | else 408 | Latency_Timer1 = UsbSetupBuf->wValueL; 409 | len = 0; 410 | break; 411 | case 0x03: 412 | //divisor = wValue 413 | U1SMOD = 1; 414 | PCON |= SMOD; //波特率加倍 415 | T2MOD |= bTMR_CLK; //最高计数时钟 416 | 417 | divisor = UsbSetupBuf->wValueL | 418 | (UsbSetupBuf->wValueH << 8); 419 | divisor &= 0x3fff; //没法发生小数取整数部分,baudrate = 48M/16/divisor 420 | 421 | 422 | if(divisor == 0 || divisor == 1) 423 | { 424 | if(UsbSetupBuf->wIndexL == 1) 425 | TH1 = 0xff; //实在憋不出来1.5M 426 | else 427 | SBAUD1 = 0xff; 428 | } 429 | else 430 | { 431 | divisor = divisor / 2; //24M CPU时钟 432 | if(divisor > 256) 433 | { 434 | //TH1 = 0 - 13; //统统115200 435 | if(UsbSetupBuf->wIndexL == 1) 436 | { 437 | divisor /= 8; 438 | if(divisor > 256) 439 | { 440 | TH1 = 0 - 13; 441 | } 442 | else 443 | { 444 | PCON &= ~(SMOD); 445 | T2MOD &= ~(bTMR_CLK); //低波特率 446 | TH1 = 0 - divisor; 447 | } 448 | } 449 | else //intf2 450 | { 451 | divisor /= 2; 452 | if(divisor > 256) 453 | { 454 | SBAUD1 = 0 - 13; 455 | } 456 | else 457 | { 458 | U1SMOD = 0; 459 | SBAUD1 = 0 - divisor; 460 | } 461 | } 462 | } 463 | else 464 | { 465 | if(UsbSetupBuf->wIndexL == 1) 466 | TH1 = 0 - divisor; 467 | else //intf2 468 | SBAUD1 = 0 - divisor; 469 | } 470 | } 471 | len = 0; 472 | break; 473 | case 0x01: //MODEM Control 474 | #if HARD_ESP_CTRL 475 | if(UsbSetupBuf->wIndexL == 1) 476 | { 477 | if(UsbSetupBuf->wValueH & 0x01) 478 | { 479 | if(UsbSetupBuf->wValueL & 0x01) //DTR 480 | { 481 | soft_dtr = 1; 482 | //INTF1_DTR = 0; 483 | } 484 | else 485 | { 486 | soft_dtr = 0; 487 | //INTF1_DTR = 1; 488 | } 489 | } 490 | if(UsbSetupBuf->wValueH & 0x02) 491 | { 492 | if(UsbSetupBuf->wValueL & 0x02) //RTS 493 | { 494 | soft_rts = 1; 495 | //INTF1_RTS = 0; 496 | } 497 | else 498 | { 499 | soft_rts = 0; 500 | //INTF1_RTS = 1; 501 | } 502 | } 503 | Modem_Count = 20; 504 | /* 505 | if(soft_dtr == soft_rts) // Taken from Open-EC 506 | { 507 | INTF1_DTR = 1; 508 | INTF1_RTS = 1; 509 | } 510 | if(soft_dtr == 1 && soft_rts == 0) 511 | { 512 | INTF1_RTS = 1; 513 | INTF1_DTR = 0; 514 | } 515 | if(soft_dtr == 0 && soft_rts == 1) 516 | { 517 | INTF1_RTS = 0; 518 | INTF1_DTR = 1; 519 | }*/ 520 | } 521 | else //intf2 522 | { 523 | if(UsbSetupBuf->wValueH & 0x01) 524 | { 525 | if(UsbSetupBuf->wValueL & 0x01) //DTR 526 | { 527 | soft_dtr_1 = 1; 528 | //INTF2_DTR = 0; 529 | } 530 | else 531 | { 532 | soft_dtr_1 = 0; 533 | //INTF2_DTR = 1; 534 | } 535 | } 536 | if(UsbSetupBuf->wValueH & 0x02) 537 | { 538 | if(UsbSetupBuf->wValueL & 0x02) //RTS 539 | { 540 | soft_rts_1 = 1; 541 | //INTF2_RTS = 0; 542 | } 543 | else 544 | { 545 | soft_rts_1 = 0; 546 | //INTF2_RTS = 1; 547 | } 548 | 549 | if(soft_dtr_1 == 1 && soft_rts_1 == 1) 550 | { 551 | INTF2_DTR = 1; 552 | INTF2_RTS = 1; 553 | } 554 | if(soft_dtr_1 == 0 && soft_rts_1 == 0) 555 | { 556 | INTF2_DTR = 1; 557 | INTF2_RTS = 1; 558 | } 559 | if(soft_dtr_1 == 0 && soft_rts_1 == 1) 560 | { 561 | INTF2_DTR = 1; 562 | INTF2_RTS = 0; 563 | } 564 | if(soft_dtr_1 == 1 && soft_rts_1 == 0) 565 | { 566 | INTF2_DTR = 0; 567 | INTF2_RTS = 1; 568 | } 569 | 570 | } 571 | } 572 | #else 573 | if(Esp_Require_Reset == 3) 574 | { 575 | CAP1 = 0; 576 | Esp_Require_Reset = 4; 577 | } 578 | #endif 579 | len = 0; 580 | break; 581 | default: 582 | len = 0xFF; /*命令不支持*/ 583 | break; 584 | } 585 | } 586 | 587 | } 588 | else //标准请求 589 | { 590 | switch(SetupReq) //请求码 591 | { 592 | case USB_GET_DESCRIPTOR: 593 | switch(UsbSetupBuf->wValueH) 594 | { 595 | case 1: //设备描述符 596 | pDescr = DevDesc; //把设备描述符送到要发送的缓冲区 597 | len = sizeof(DevDesc); 598 | break; 599 | case 2: //配置描述符 600 | pDescr = CfgDesc; //把设备描述符送到要发送的缓冲区 601 | len = sizeof(CfgDesc); 602 | break; 603 | case 3: 604 | if(UsbSetupBuf->wValueL == 0) 605 | { 606 | pDescr = LangDes; 607 | len = sizeof(LangDes); 608 | } 609 | else if(UsbSetupBuf->wValueL == 1) 610 | { 611 | pDescr = Manuf_Des; 612 | len = sizeof(Manuf_Des); 613 | } 614 | else if(UsbSetupBuf->wValueL == 2) 615 | { 616 | pDescr = Prod_Des; 617 | len = sizeof(Prod_Des); 618 | } 619 | else 620 | { 621 | pDescr = (__code uint8_t *)0xffff; 622 | len = 22; /* 10位ASCII序列号 */ 623 | } 624 | break; 625 | default: 626 | len = 0xff; //不支持的命令或者出错 627 | break; 628 | } 629 | 630 | if ( SetupLen > len ) 631 | { 632 | SetupLen = len; //限制总长度 633 | } 634 | len = SetupLen >= DEFAULT_ENDP0_SIZE ? DEFAULT_ENDP0_SIZE : SetupLen; //本次传输长度 635 | if(pDescr == (__code uint8_t *) 0xffff) /* 取序列号的话 */ 636 | { 637 | uuidcpy(Ep0Buffer, 0, len); 638 | } 639 | else 640 | { 641 | memcpy(Ep0Buffer, pDescr, len); //加载上传数据 642 | } 643 | SetupLen -= len; 644 | pDescr_Index = len; 645 | break; 646 | case USB_SET_ADDRESS: 647 | SetupLen = UsbSetupBuf->wValueL; //暂存USB设备地址 648 | break; 649 | case USB_GET_CONFIGURATION: 650 | Ep0Buffer[0] = UsbConfig; 651 | if ( SetupLen >= 1 ) 652 | { 653 | len = 1; 654 | } 655 | break; 656 | case USB_SET_CONFIGURATION: 657 | UsbConfig = UsbSetupBuf->wValueL; 658 | break; 659 | case USB_GET_INTERFACE: 660 | break; 661 | case USB_CLEAR_FEATURE: //Clear Feature 662 | if( ( UsbSetupBuf->bRequestType & 0x1F ) == USB_REQ_RECIP_DEVICE ) /* 清除设备 */ 663 | { 664 | if( ( ( ( uint16_t )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 ) 665 | { 666 | if( CfgDesc[ 7 ] & 0x20 ) 667 | { 668 | /* 唤醒 */ 669 | } 670 | else 671 | { 672 | len = 0xFF; /* 操作失败 */ 673 | } 674 | } 675 | else 676 | { 677 | len = 0xFF; /* 操作失败 */ 678 | } 679 | } 680 | else if ( ( UsbSetupBuf->bRequestType & USB_REQ_RECIP_MASK ) == USB_REQ_RECIP_ENDP )// 端点 681 | { 682 | switch( UsbSetupBuf->wIndexL ) 683 | { 684 | case 0x83: 685 | UEP3_CTRL = UEP3_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK; 686 | break; 687 | case 0x03: 688 | UEP3_CTRL = UEP3_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK; 689 | break; 690 | case 0x82: 691 | UEP2_CTRL = UEP2_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK; 692 | break; 693 | case 0x02: 694 | UEP2_CTRL = UEP2_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK; 695 | break; 696 | case 0x81: 697 | UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_T_TOG | MASK_UEP_T_RES ) | UEP_T_RES_NAK; 698 | break; 699 | case 0x01: 700 | UEP1_CTRL = UEP1_CTRL & ~ ( bUEP_R_TOG | MASK_UEP_R_RES ) | UEP_R_RES_ACK; 701 | break; 702 | default: 703 | len = 0xFF; // 不支持的端点 704 | break; 705 | } 706 | UpPoint1_Busy = 0; 707 | UpPoint3_Busy = 0; 708 | } 709 | else 710 | { 711 | len = 0xFF; // 不是端点不支持 712 | } 713 | break; 714 | case USB_SET_FEATURE: /* Set Feature */ 715 | if( ( UsbSetupBuf->bRequestType & 0x1F ) == USB_REQ_RECIP_DEVICE ) /* 设置设备 */ 716 | { 717 | if( ( ( ( uint16_t )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x01 ) 718 | { 719 | if( CfgDesc[ 7 ] & 0x20 ) 720 | { 721 | /* 休眠 */ 722 | #ifdef DE_PRINTF 723 | printf( "suspend\n" ); //睡眠状态 724 | 725 | while ( XBUS_AUX & bUART0_TX ) 726 | { 727 | ; //等待发送完成 728 | } 729 | #endif 730 | SAFE_MOD = 0x55; 731 | SAFE_MOD = 0xAA; 732 | WAKE_CTRL = bWAK_BY_USB | bWAK_RXD0_LO | bWAK_RXD1_LO; //USB或者RXD0/1有信号时可被唤醒 733 | PCON |= PD; //睡眠 734 | SAFE_MOD = 0x55; 735 | SAFE_MOD = 0xAA; 736 | WAKE_CTRL = 0x00; 737 | } 738 | else 739 | { 740 | len = 0xFF; /* 操作失败 */ 741 | } 742 | } 743 | else 744 | { 745 | len = 0xFF; /* 操作失败 */ 746 | } 747 | } 748 | else if( ( UsbSetupBuf->bRequestType & 0x1F ) == USB_REQ_RECIP_ENDP ) /* 设置端点 */ 749 | { 750 | if( ( ( ( uint16_t )UsbSetupBuf->wValueH << 8 ) | UsbSetupBuf->wValueL ) == 0x00 ) 751 | { 752 | switch( ( ( uint16_t )UsbSetupBuf->wIndexH << 8 ) | UsbSetupBuf->wIndexL ) 753 | { 754 | case 0x83: 755 | UEP3_CTRL = UEP3_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 设置端点3 IN STALL */ 756 | break; 757 | case 0x03: 758 | UEP3_CTRL = UEP3_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 设置端点3 OUT Stall */ 759 | break; 760 | case 0x82: 761 | UEP2_CTRL = UEP2_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 设置端点2 IN STALL */ 762 | break; 763 | case 0x02: 764 | UEP2_CTRL = UEP2_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 设置端点2 OUT Stall */ 765 | break; 766 | case 0x81: 767 | UEP1_CTRL = UEP1_CTRL & (~bUEP_T_TOG) | UEP_T_RES_STALL;/* 设置端点1 IN STALL */ 768 | break; 769 | case 0x01: 770 | UEP1_CTRL = UEP1_CTRL & (~bUEP_R_TOG) | UEP_R_RES_STALL;/* 设置端点1 OUT Stall */ 771 | default: 772 | len = 0xFF; /* 操作失败 */ 773 | break; 774 | } 775 | } 776 | else 777 | { 778 | len = 0xFF; /* 操作失败 */ 779 | } 780 | } 781 | else 782 | { 783 | len = 0xFF; /* 操作失败 */ 784 | } 785 | break; 786 | case USB_GET_STATUS: 787 | Ep0Buffer[0] = 0x00; 788 | Ep0Buffer[1] = 0x00; 789 | if ( SetupLen >= 2 ) 790 | { 791 | len = 2; 792 | } 793 | else 794 | { 795 | len = SetupLen; 796 | } 797 | break; 798 | default: 799 | len = 0xff; //操作失败 800 | break; 801 | } 802 | } 803 | } 804 | else 805 | { 806 | len = 0xff; //包长度错误 807 | } 808 | if(len == 0xff) 809 | { 810 | SetupReq = 0xFF; 811 | UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_STALL | UEP_T_RES_STALL;//STALL 812 | } 813 | else if(len <= DEFAULT_ENDP0_SIZE) //上传数据或者状态阶段返回0长度包 814 | { 815 | UEP0_T_LEN = len; 816 | UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答ACK 817 | } 818 | else 819 | { 820 | UEP0_T_LEN = 0; //虽然尚未到状态阶段,但是提前预置上传0长度数据包以防主机提前进入状态阶段 821 | UEP0_CTRL = bUEP_R_TOG | bUEP_T_TOG | UEP_R_RES_ACK | UEP_T_RES_ACK;//默认数据包是DATA1,返回应答ACK 822 | } 823 | break; 824 | case UIS_TOKEN_IN | 0: //endpoint0 IN 825 | switch(SetupReq) 826 | { 827 | case USB_GET_DESCRIPTOR: 828 | len = SetupLen >= DEFAULT_ENDP0_SIZE ? DEFAULT_ENDP0_SIZE : SetupLen; //本次传输长度 829 | if(pDescr == (__code uint8_t *)0xffff) 830 | { 831 | uuidcpy(Ep0Buffer, pDescr_Index, len); 832 | } 833 | else 834 | { 835 | memcpy( Ep0Buffer, pDescr + pDescr_Index, len ); //加载上传数据 836 | } 837 | SetupLen -= len; 838 | pDescr_Index += len; 839 | UEP0_T_LEN = len; 840 | UEP0_CTRL ^= bUEP_T_TOG; //同步标志位翻转 841 | break; 842 | case USB_SET_ADDRESS: 843 | if(VendorControl == 0) 844 | { 845 | USB_DEV_AD = USB_DEV_AD & bUDA_GP_BIT | SetupLen; 846 | UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; 847 | } 848 | break; 849 | default: 850 | UEP0_T_LEN = 0; //状态阶段完成中断或者是强制上传0长度数据包结束控制传输 851 | UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; 852 | break; 853 | } 854 | break; 855 | case UIS_TOKEN_OUT | 0: // endpoint0 OUT 856 | if(SetupReq == 0x22) //设置串口属性 857 | { 858 | 859 | } 860 | else 861 | { 862 | UEP0_T_LEN = 0; 863 | UEP0_CTRL |= UEP_R_RES_ACK | UEP_T_RES_NAK; //状态阶段,对IN响应NAK 864 | } 865 | break; 866 | 867 | default: 868 | break; 869 | } 870 | UIF_TRANSFER = 0; //写0清空中断 871 | } 872 | if(UIF_BUS_RST) //设备模式USB总线复位中断 873 | { 874 | #ifdef DE_PRINTF 875 | printf( "reset\n" ); //睡眠状态 876 | #endif 877 | UEP0_CTRL = UEP_R_RES_ACK | UEP_T_RES_NAK; 878 | UEP1_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK; 879 | UEP2_CTRL = bUEP_AUTO_TOG | UEP_T_RES_NAK | UEP_R_RES_ACK; 880 | USB_DEV_AD = 0x00; 881 | UIF_SUSPEND = 0; 882 | UIF_TRANSFER = 0; 883 | UIF_BUS_RST = 0; //清中断标志 884 | UsbConfig = 0; //清除配置值 885 | UpPoint1_Busy = 0; 886 | UpPoint3_Busy = 0; 887 | 888 | USBOutLength = 0; 889 | USBOutPtr = 0; 890 | USBReceived = 0; 891 | 892 | USBOutLength_1 = 0; 893 | USBOutPtr_1 = 0; 894 | USBReceived_1 = 0; 895 | 896 | UpPoint1_LenA = 2; 897 | UpPoint1_LenB = 2; 898 | 899 | USBRecvLen_A = 0; 900 | USBRecvLen_B = 0; 901 | USBRecvBuf = 0; 902 | SerialSendBuf = 0; 903 | USBBufState = 0; 904 | Serial_Done = 0; 905 | USB_Require_Data = 0; 906 | } 907 | if (UIF_SUSPEND) //USB总线挂起/唤醒完成 908 | { 909 | UIF_SUSPEND = 0; 910 | if ( USB_MIS_ST & bUMS_SUSPEND ) //挂起 911 | { 912 | #ifdef DE_PRINTF 913 | printf( "suspend\n" ); //睡眠状态 914 | #endif 915 | while ( XBUS_AUX & bUART0_TX ) 916 | { 917 | ; //等待发送完成 918 | } 919 | SAFE_MOD = 0x55; 920 | SAFE_MOD = 0xAA; 921 | WAKE_CTRL = bWAK_BY_USB | bWAK_RXD0_LO | bWAK_RXD1_LO; //USB或者RXD0/1有信号时可被唤醒 922 | PCON |= PD; //睡眠 923 | SAFE_MOD = 0x55; 924 | SAFE_MOD = 0xAA; 925 | WAKE_CTRL = 0x00; 926 | } 927 | } 928 | else //意外的中断,不可能发生的情况 929 | { 930 | USB_INT_FG = 0xFF; //清中断标志 931 | 932 | } 933 | } 934 | 935 | void SerialPort_Config() 936 | { 937 | volatile uint32_t x; 938 | volatile uint8_t x2; 939 | 940 | P1_MOD_OC = 0x7f; 941 | P1_DIR_PU = 0xcc; //P1.4 P1.5 P1.0 P1.1开漏 942 | P3_MOD_OC = 0xfd; 943 | 944 | SM0 = 0; 945 | SM1 = 1; 946 | SM2 = 0; //串口0使用模式1 947 | //使用Timer1作为波特率发生器 948 | RCLK = 0; //UART0接收时钟 949 | TCLK = 0; //UART0发送时钟 950 | PCON |= SMOD; 951 | x = 10 * FREQ_SYS / 115200 / 16; //如果更改主频,注意x的值不要溢出 952 | x2 = x % 10; 953 | x /= 10; 954 | if ( x2 >= 5 ) x ++; //四舍五入 955 | 956 | TMOD = TMOD & ~ bT1_GATE & ~ bT1_CT & ~ MASK_T1_MOD | bT1_M1; //0X20,Timer1作为8位自动重载定时器 957 | T2MOD = T2MOD | bTMR_CLK | bT1_CLK; //Timer1时钟选择 958 | TH1 = 0 - x; //12MHz晶振,buad/12为实际需设置波特率 959 | TR1 = 1; //启动定时器1 960 | TI = 0; 961 | REN = 1; //串口0接收使能 962 | ES = 1; //开串口中断 963 | PS = 1; //中断优先级最高 964 | 965 | //串口2配置 966 | SCON1 = 0x70; //8bit, fast, receive enable 967 | SBAUD1 = 0 - x; 968 | IE_UART1 = 1; 969 | IP_EX |= bIP_UART1; 970 | } 971 | 972 | 973 | /******************************************************************************* 974 | * Function Name : Uart0_ISR() 975 | * Description : 串口接收中断函数,实现循环缓冲接收 976 | *******************************************************************************/ 977 | 978 | //Ring Buf 979 | 980 | volatile __data uint8_t WritePtr = 0; 981 | volatile __data uint8_t ReadPtr = 0; 982 | 983 | volatile __data uint8_t WritePtr_1 = 0; 984 | volatile __data uint8_t ReadPtr_1 = 0; 985 | #ifndef HARD_ESP_CTRL 986 | __code uint8_t ESP_Boot_Sequence[] = 987 | { 988 | 0x07, 0x07, 0x12, 0x20, 989 | 0x55, 0x55, 0x55, 0x55, 990 | 0x55, 0x55, 0x55, 0x55, 991 | 0x55, 0x55, 0x55, 0x55, 992 | 0x55, 0x55, 0x55, 0x55 993 | }; 994 | #endif 995 | 996 | #define FAST_RECEIVE 997 | 998 | #ifndef FAST_RECEIVE /* 年久失修的代码,不要维护了 */ 999 | void Uart0_ISR(void) __interrupt (INT_NO_UART0) __using 1 1000 | { 1001 | if(RI) //收到数据 1002 | { 1003 | if((WritePtr + 1) % sizeof(RingBuf) != ReadPtr) 1004 | { 1005 | //环形缓冲写 1006 | RingBuf[WritePtr++] = SBUF; 1007 | WritePtr %= sizeof(RingBuf); 1008 | } 1009 | RI = 0; 1010 | } 1011 | if (TI) 1012 | { 1013 | if(USBOutPtr >= USBOutLength) 1014 | { 1015 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1016 | TI = 0; 1017 | } 1018 | else 1019 | { 1020 | uint8_t ch = Ep2Buffer[USBOutPtr]; 1021 | SBUF = ch; 1022 | TI = 0; 1023 | #ifndef HARD_ESP_CTRL 1024 | if(ESP_Boot_Sequence[Esp_Boot_Chk] == ch) 1025 | Esp_Boot_Chk ++; 1026 | else 1027 | Esp_Boot_Chk = 0; 1028 | 1029 | if(Esp_Boot_Chk >= (sizeof(ESP_Boot_Sequence) - 1)) 1030 | { 1031 | if(Esp_Require_Reset == 0) 1032 | Esp_Require_Reset = 1; 1033 | Esp_Boot_Chk = 0; 1034 | } 1035 | #endif 1036 | USBOutPtr++; 1037 | } 1038 | } 1039 | 1040 | } 1041 | #else 1042 | //汇编接收数据,选择寄存器组1,DPTR1 1.5M~150kHz~160 cycles 1043 | 1044 | void Uart0_ISR(void) __interrupt (INT_NO_UART0) __using 1 __naked 1045 | { 1046 | __asm 1047 | push psw ;2 1048 | push a 1049 | push dph 1050 | push dpl 1051 | 1052 | ReadFromSerial: 1053 | jnb _RI, SendToSerial ;7 1054 | 1055 | mov a, _WritePtr ;2 1056 | mov dpl, _ReadPtr 1057 | 1058 | inc a ;1 1059 | anl dpl, #0x7f 1060 | anl a, #0x7f ;2 1061 | 1062 | xrl a, dpl 1063 | jz SendToSerial 1064 | 1065 | mov dph, #(_RingBuf >> 8) ;3 1066 | mov dpl, _WritePtr ;3 1067 | mov a, _SBUF ;2 1068 | movx @dptr, a ;1 1069 | 1070 | inc _WritePtr ;1 1071 | anl _WritePtr, #0x7f ;2 1072 | 1073 | 1074 | SendToSerial: 1075 | clr _RI ;2 1076 | 1077 | jnb _TI, ISR_End 1078 | 1079 | clr c 1080 | mov a, _USBOutPtr 1081 | subb a, _USBOutLength 1082 | jc SerialTx 1083 | 1084 | UsbEpAck: 1085 | mov _Serial_Done, #1 1086 | sjmp Tx_End 1087 | SerialTx: 1088 | mov dph, #(_Ep2Buffer >> 8) 1089 | mov dpl, _USBOutPtr 1090 | movx a, @dptr 1091 | mov _SBUF, a 1092 | inc _USBOutPtr 1093 | 1094 | Tx_End: 1095 | clr _TI 1096 | 1097 | ISR_End: 1098 | 1099 | pop dpl 1100 | pop dph 1101 | pop a 1102 | pop psw 1103 | reti 1104 | __endasm; 1105 | } 1106 | 1107 | //汇编接收数据,选择寄存器组1,DPTR1 1.5M~150kHz~160 cycles 1108 | void Uart1_ISR(void) __interrupt (INT_NO_UART1) __using 1 __naked 1109 | { 1110 | __asm 1111 | push psw ;2 1112 | push a 1113 | push dph 1114 | push dpl 1115 | 1116 | ReadFromSerial_1: 1117 | jnb _U1RI, SendToSerial_1 ;7 1118 | 1119 | mov a, _WritePtr_1 ;2 1120 | mov dpl, _ReadPtr_1 1121 | 1122 | inc a ;1 1123 | anl dpl, #0x7f 1124 | anl a, #0x7f ;2 1125 | 1126 | xrl a, dpl 1127 | jz SendToSerial_1 1128 | 1129 | mov dph, #(_RingBuf_1 >> 8) ;3 1130 | mov dpl, _WritePtr_1 ;3 1131 | mov a, _SBUF1 ;2 1132 | movx @dptr, a ;1 1133 | 1134 | inc _WritePtr_1 ;1 1135 | anl _WritePtr_1, #0x7f ;2 1136 | 1137 | 1138 | SendToSerial_1: 1139 | clr _U1RI ;2 1140 | 1141 | jnb _U1TI, ISR_End_1 1142 | 1143 | clr c 1144 | mov a, _USBOutPtr_1 1145 | subb a, _USBOutLength_1 1146 | jc SerialTx_1 1147 | 1148 | UsbEpAck_1: 1149 | anl _UEP4_CTRL, #0xf3 1150 | sjmp Tx_End_1 1151 | SerialTx_1: 1152 | mov dph, #(_Ep4Buffer >> 8) 1153 | mov dpl, _USBOutPtr_1 1154 | movx a, @dptr 1155 | mov _SBUF1, a 1156 | inc _USBOutPtr_1 1157 | 1158 | Tx_End_1: 1159 | clr _U1TI 1160 | 1161 | ISR_End_1: 1162 | 1163 | pop dpl 1164 | pop dph 1165 | pop a 1166 | pop psw 1167 | reti 1168 | __endasm; 1169 | } 1170 | #endif 1171 | 1172 | //#define FAST_COPY_2 1173 | //#define FAST_COPY_1 1174 | void CLKO_Enable(void) //打开T2输出 1175 | { 1176 | #if 0 1177 | ET2 = 0; 1178 | T2CON = 0; 1179 | T2MOD = 0; 1180 | T2MOD |= bTMR_CLK | bT2_CLK | T2OE; 1181 | RCAP2H = 0xff; 1182 | RCAP2L = 0xfe; 1183 | TH2 = 0xff; 1184 | TL2 = 0xfe; 1185 | TR2 = 1; 1186 | 1187 | P1_MOD_OC &= ~(0x01 << 4); //P1.4推挽输出 1188 | P1_DIR_PU |= (0x01 << 4); 1189 | 1190 | P3_MOD_OC &= ~(0x01 << 2); //P3.2高阻 1191 | P3_DIR_PU &= ~(0x01 << 2); 1192 | 1193 | P3_MOD_OC &= ~(0x01 << 5); //P1.4高阻 1194 | P3_DIR_PU &= ~(0x01 << 5); 1195 | 1196 | PIN_FUNC |= bT2_PIN_X; 1197 | #endif 1198 | P3_MOD_OC &= ~(0x01 << 3); 1199 | P3_DIR_PU &= ~(0x01 << 3); 1200 | P3_MOD_OC &= ~(0x01 << 5); 1201 | P3_DIR_PU &= ~(0x01 << 5); 1202 | 1203 | P3_MOD_OC &= ~(0x01 << 4); //P3.4推挽输出 1204 | P3_DIR_PU |= (0x01 << 4); 1205 | 1206 | PWM_CK_SE = 1; 1207 | PWM_CTRL |= bPWM_CLR_ALL; 1208 | PWM_CTRL &= ~bPWM_CLR_ALL; 1209 | 1210 | PIN_FUNC &= ~bPWM2_PIN_X; 1211 | PWM_DATA2 = 128; 1212 | PWM_CTRL |= bPWM2_OUT_EN; 1213 | 1214 | } 1215 | 1216 | //定义函数返回值 1217 | #ifndef SUCCESS 1218 | #define SUCCESS 0 1219 | #endif 1220 | #ifndef FAIL 1221 | #define FAIL 0xFF 1222 | #endif 1223 | 1224 | //定义定时器起始 1225 | #ifndef START 1226 | #define START 1 1227 | #endif 1228 | #ifndef STOP 1229 | #define STOP 0 1230 | #endif 1231 | 1232 | //CH554 Timer0时钟选择 1233 | //bTMR_CLK同时影响Timer0&1&2,使用时要注意 (除定时使用标准时钟) 1234 | #define mTimer0Clk12DivFsys( ) (T2MOD &= ~bT0_CLK) //定时器,时钟=Fsys/12 T0标准时钟 1235 | #define mTimer0ClkFsys( ) (T2MOD |= bTMR_CLK | bT0_CLK) //定时器,时钟=Fsys 1236 | #define mTimer0Clk4DivFsys( ) (T2MOD &= ~bTMR_CLK;T2MOD |= bT0_CLK) //定时器,时钟=Fsys/4 1237 | #define mTimer0CountClk( ) (TMOD |= bT0_CT) //计数器,T0引脚的下降沿有效 1238 | 1239 | //CH554 Timer0 开始(SS=1)/结束(SS=0) 1240 | #define mTimer0RunCTL( SS ) (TR0 = SS ? START : STOP) 1241 | 1242 | 1243 | #define mTimer1Clk12DivFsys( ) (T2MOD &= ~bT1_CLK) //定时器,时钟=Fsys/12 T1标准时钟 1244 | #define mTimer1ClkFsys( ) (T2MOD |= bTMR_CLK | bT1_CLK) //定时器,时钟=Fsys 1245 | #define mTimer1Clk4DivFsys( ) (T2MOD &= ~bTMR_CLK;T2MOD |= bT1_CLK) //定时器,时钟=Fsys/4 1246 | #define mTimer1CountClk( ) (TMOD |= bT1_CT) //计数器,T0引脚的下降沿有效 1247 | 1248 | //CH554 Timer1 开始(SS=1)/结束(SS=0) 1249 | #define mTimer1RunCTL( SS ) (TR1 = SS ? START : STOP) 1250 | 1251 | 1252 | #define mTimer2Clk12DivFsys( ) {T2MOD &= ~ bT2_CLK;C_T2 = 0;} //定时器,时钟=Fsys/12 T2标准时钟 1253 | #define mTimer2ClkFsys( ) {T2MOD |= (bTMR_CLK | bT2_CLK);C_T2=0;} //定时器,时钟=Fsys 1254 | #define mTimer2Clk4DivFsys( ) {T2MOD &= ~bTMR_CLK;T2MOD |= bT2_CLK;C_T2 = 0;}//定时器,时钟=Fsys/4 1255 | #define mTimer2CountClk( ) {C_T2 = 1;} //计数器,T2引脚的下降沿有效 1256 | 1257 | //CH554 Timer2 开始(SS=1)/结束(SS=0) 1258 | #define mTimer2RunCTL( SS ) {TR2 = SS ? START : STOP;} 1259 | #define mTimer2OutCTL( ) (T2MOD |= T2OE) //T2输出 频率TF2/2 1260 | #define CAP1Alter( ) (PIN_FUNC |= bT2_PIN_X;) //CAP1由P10 映射到P14 1261 | #define CAP2Alter( ) (PIN_FUNC |= bT2EX_PIN_X;) //CAP2由P11 映射RST 1262 | 1263 | /******************************************************************************* 1264 | * Function Name : mTimer_x_ModInit(uint8_t x ,uint8_t mode) 1265 | * Description : CH554定时计数器x模式设置 1266 | * Input : uint8_t mode,Timer模式选择 1267 | 0:模式0,13位定时器,TLn的高3位无效 1268 | 1:模式1,16位定时器 1269 | 2:模式2,8位自动重装定时器 1270 | 3:模式3,两个8位定时器 Timer0 1271 | 3:模式3,Timer1停止 1272 | uint8_t x 定时器 0 1 2 1273 | * Output : None 1274 | * Return : 成功 SUCCESS 1275 | 失败 FAIL 1276 | *******************************************************************************/ 1277 | uint8_t mTimer_x_ModInit(uint8_t x ,uint8_t mode); 1278 | 1279 | /******************************************************************************* 1280 | * Function Name : mTimer_x_SetData(uint8_t x,uint16_t dat) 1281 | * Description : CH554Timer 1282 | * Input : uint16_t dat;定时器赋值 1283 | uint8_t x 定时器 0 1 2 1284 | * Output : None 1285 | * Return : None 1286 | *******************************************************************************/ 1287 | void mTimer_x_SetData(uint8_t x,uint16_t dat); 1288 | 1289 | /******************************************************************************* 1290 | * Function Name : CAP2Init(uint8_t mode) 1291 | * Description : CH554定时计数器2 T2EX引脚捕捉功能初始化 1292 | uint8_t mode,边沿捕捉模式选择 1293 | 0:T2ex从下降沿到下一个下降沿 1294 | 1:T2ex任意边沿之间 1295 | 3:T2ex从上升沿到下一个上升沿 1296 | * Input : None 1297 | * Output : None 1298 | * Return : None 1299 | *******************************************************************************/ 1300 | void CAP2Init(uint8_t mode); 1301 | 1302 | /******************************************************************************* 1303 | * Function Name : CAP1Init(uint8_t mode) 1304 | * Description : CH554定时计数器2 T2引脚捕捉功能初始化T2 1305 | uint8_t mode,边沿捕捉模式选择 1306 | 0:T2ex从下降沿到下一个下降沿 1307 | 1:T2ex任意边沿之间 1308 | 3:T2ex从上升沿到下一个上升沿 1309 | * Input : None 1310 | * Output : None 1311 | * Return : None 1312 | *******************************************************************************/ 1313 | void CAP1Init(uint8_t mode); 1314 | 1315 | /******************************************************************************* 1316 | * Function Name : mTimer_x_ModInit(uint8_t x ,uint8_t mode) 1317 | * Description : CH554定时计数器x模式设置 1318 | * Input : uint8_t mode,Timer模式选择 1319 | 0:模式0,13位定时器,TLn的高3位无效 1320 | 1:模式1,16位定时器 1321 | 2:模式2,8位自动重装定时器 1322 | 3:模式3,两个8位定时器 Timer0 1323 | 3:模式3,Timer1停止 1324 | * Output : None 1325 | * Return : 成功 SUCCESS 1326 | 失败 FAIL 1327 | *******************************************************************************/ 1328 | uint8_t mTimer_x_ModInit(uint8_t x ,uint8_t mode) 1329 | { 1330 | if(x == 0){TMOD = TMOD & 0xf0 | mode;} 1331 | else if(x == 1){TMOD = TMOD & 0x0f | (mode<<4);} 1332 | else if(x == 2){RCLK = 0;TCLK = 0;CP_RL2 = 0;} //16位自动重载定时器 1333 | else return FAIL; 1334 | return SUCCESS; 1335 | } 1336 | 1337 | /******************************************************************************* 1338 | * Function Name : mTimer_x_SetData(uint8_t x,uint16_t dat) 1339 | * Description : CH554Timer0 TH0和TL0赋值 1340 | * Input : uint16_t dat;定时器赋值 1341 | * Output : None 1342 | * Return : None 1343 | *******************************************************************************/ 1344 | void mTimer_x_SetData(uint8_t x,uint16_t dat) 1345 | { 1346 | uint16_t tmp; 1347 | tmp = 65536 - dat; 1348 | if(x == 0){TL0 = tmp & 0xff;TH0 = (tmp>>8) & 0xff;} 1349 | else if(x == 1){TL1 = tmp & 0xff;TH1 = (tmp>>8) & 0xff;} 1350 | else if(x == 2){ 1351 | RCAP2L = TL2 = tmp & 0xff; //16位自动重载定时器 1352 | RCAP2H = TH2 = (tmp>>8) & 0xff; 1353 | } 1354 | } 1355 | 1356 | /******************************************************************************* 1357 | * Function Name : CAP2Init(uint8_t mode) 1358 | * Description : CH554定时计数器2 T2EX引脚捕捉功能初始化 1359 | uint8_t mode,边沿捕捉模式选择 1360 | 0:T2ex从下降沿到下一个下降沿 1361 | 1:T2ex任意边沿之间 1362 | 3:T2ex从上升沿到下一个上升沿 1363 | * Input : None 1364 | * Output : None 1365 | * Return : None 1366 | *******************************************************************************/ 1367 | void CAP2Init(uint8_t mode) 1368 | { 1369 | RCLK = 0; 1370 | TCLK = 0; 1371 | C_T2 = 0; 1372 | EXEN2 = 1; 1373 | CP_RL2 = 1; //启动T2ex的捕捉功能 1374 | T2MOD |= mode << 2; //边沿捕捉模式选择 1375 | } 1376 | 1377 | /******************************************************************************* 1378 | * Function Name : CAP1Init(uint8_t mode) 1379 | * Description : CH554定时计数器2 T2引脚捕捉功能初始化T2 1380 | uint8_t mode,边沿捕捉模式选择 1381 | 0:T2ex从下降沿到下一个下降沿 1382 | 1:T2ex任意边沿之间 1383 | 3:T2ex从上升沿到下一个上升沿 1384 | * Input : None 1385 | * Output : None 1386 | * Return : None 1387 | *******************************************************************************/ 1388 | void CAP1Init(uint8_t mode) 1389 | { 1390 | RCLK = 0; 1391 | TCLK = 0; 1392 | CP_RL2 = 1; 1393 | C_T2 = 0; 1394 | T2MOD = T2MOD & ~T2OE | (mode << 2) | bT2_CAP1_EN; //使能T2引脚捕捉功能,边沿捕捉模式选择 1395 | } 1396 | 1397 | /******************************************************************************* 1398 | * Function Name : mTimer0Interrupt() 1399 | * Description : CH554定时计数器0定时计数器中断处理函数 1400 | *******************************************************************************/ 1401 | void mTimer0Interrupt(void) __interrupt (INT_NO_TMR0) //timer0中断服务程序 1402 | { 1403 | mTimer_x_SetData(0,1000); //非自动重载方式需重新给TH0和TL0赋值,1MHz/1000=1000Hz, 1ms 1404 | SOF_Count ++; 1405 | if(Modem_Count) 1406 | Modem_Count --; 1407 | if(Modem_Count == 1) 1408 | { 1409 | if(soft_dtr == 0 && soft_rts == 1) 1410 | { 1411 | INTF1_RTS = 1; 1412 | INTF1_DTR = 0; 1413 | } 1414 | if(soft_dtr == 1 && soft_rts == 0) 1415 | { 1416 | INTF1_RTS = 0; 1417 | INTF1_DTR = 1; 1418 | } 1419 | if(soft_dtr == soft_rts) 1420 | { 1421 | INTF1_DTR = 1; 1422 | INTF1_RTS = 0; 1423 | INTF1_RTS = 1; 1424 | } 1425 | } 1426 | } 1427 | 1428 | void init_timer() { 1429 | mTimer0Clk12DivFsys(); //T0定时器时钟设置,12MHz/12=1MHz 1430 | mTimer_x_ModInit(0,1); //T0 定时器模式设置 1431 | mTimer_x_SetData(0,1000); //T0定时器赋值,1MHz/1000=1000Hz, 1ms 1432 | mTimer0RunCTL(1); //T0定时器启动 1433 | ET0 = 1; //T0定时器中断开启 1434 | EA = 1; 1435 | 1436 | SOF_Count = 0; 1437 | } 1438 | 1439 | //主函数 1440 | void main() 1441 | { 1442 | uint8_t i; 1443 | volatile uint16_t Uart_Timeout = 0; 1444 | volatile uint16_t Uart_Timeout1 = 0; 1445 | uint16_t Esp_Stage = 0; 1446 | int8_t size; 1447 | 1448 | CfgFsys( ); //CH559时钟选择配置 1449 | mDelaymS(5); //修改主频等待内部晶振稳定,必加 1450 | SerialPort_Config(); 1451 | #ifdef DE_PRINTF 1452 | printf("start ...\n"); 1453 | #endif 1454 | USBDeviceCfg(); 1455 | USBDeviceEndPointCfg(); //端点配置 1456 | USBDeviceIntCfg(); //中断初始化 1457 | UEP0_T_LEN = 0; 1458 | UEP1_T_LEN = 0; //预使用发送长度一定要清空 1459 | UEP2_T_LEN = 0; //预使用发送长度一定要清空 1460 | CLKO_Enable(); 1461 | /* 预先填充 Modem Status */ 1462 | Ep1Buffer[0] = 0x01; 1463 | Ep1Buffer[1] = 0x60; 1464 | Ep3Buffer[0] = 0x01; 1465 | Ep3Buffer[1] = 0x60; 1466 | XBUS_AUX = 0; 1467 | #ifndef SOF_NO_TIMER 1468 | init_timer(); // 每1ms SOF_Count加1 1469 | #endif 1470 | while(1) 1471 | { 1472 | if(UsbConfig) 1473 | { 1474 | if(UpPoint1_Busy == 0) 1475 | { 1476 | size = WritePtr - ReadPtr; 1477 | if(size < 0) size = size + sizeof(RingBuf); //求余数 1478 | 1479 | if(size >= 62) 1480 | { 1481 | //i ~ r6, size ~ r7 1482 | #ifndef FAST_COPY_1 1483 | for(i = 0; i < 62; i++) 1484 | { 1485 | Ep1Buffer[2 + i] = RingBuf[ReadPtr++]; 1486 | ReadPtr %= sizeof(RingBuf); 1487 | } 1488 | #else 1489 | __asm 1490 | mov _XBUS_AUX, #1 1491 | mov dph, #0x00 1492 | mov dpl, #0x82 1493 | dec _XBUS_AUX 1494 | mov dph, #(_RingBuf >> 8) 1495 | mov dpl, _ReadPtr 1496 | 1497 | mov r6, #62 1498 | 114514$: 1499 | 1500 | movx a, @dptr 1501 | inc _ReadPtr 1502 | anl _ReadPtr, #0x7f 1503 | mov dpl, _ReadPtr 1504 | 1505 | inc _XBUS_AUX 1506 | movx @dptr, a 1507 | inc dpl 1508 | dec _XBUS_AUX 1509 | 1510 | djnz r6, 114514$ 1511 | __endasm; 1512 | #endif 1513 | UpPoint1_Busy = 1; 1514 | UEP1_T_LEN = 64; 1515 | UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; 1516 | 1517 | 1518 | } 1519 | else if((uint16_t) (SOF_Count - Uart_Timeout) >= Latency_Timer) //超时 1520 | { 1521 | Uart_Timeout = SOF_Count; 1522 | if(size > 62) size = 62; 1523 | #ifndef FAST_COPY_1 1524 | for(i = 0; i < (uint8_t)size; i++) 1525 | { 1526 | Ep1Buffer[2 + i] = RingBuf[ReadPtr++]; 1527 | ReadPtr %= sizeof(RingBuf); 1528 | } 1529 | #else 1530 | __asm 1531 | mov _XBUS_AUX, #1 1532 | mov dph, #0x00 1533 | mov dpl, #0x82 1534 | dec _XBUS_AUX 1535 | mov dph, #(_RingBuf >> 8) 1536 | mov dpl, _ReadPtr 1537 | 1538 | mov a, r7 1539 | mov r6, a 1540 | 1919810$: 1541 | 1542 | movx a, @dptr 1543 | inc _ReadPtr 1544 | anl _ReadPtr, #0x7f 1545 | mov dpl, _ReadPtr 1546 | 1547 | inc _XBUS_AUX 1548 | movx @dptr, a 1549 | inc dpl 1550 | dec _XBUS_AUX 1551 | 1552 | djnz r6, 1919810$ 1553 | __endasm; 1554 | #endif 1555 | UpPoint1_Busy = 1; 1556 | UEP1_T_LEN = 2 + size; 1557 | UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; //应答ACK 1558 | } 1559 | } 1560 | #if 1 //IF2 1561 | if(UpPoint3_Busy == 0) 1562 | { 1563 | size = WritePtr_1 - ReadPtr_1; 1564 | if(size < 0) size = size + sizeof(RingBuf_1); //求余数 1565 | 1566 | if(size >= 62) 1567 | { 1568 | #ifndef FAST_COPY_2 1569 | for(i = 0; i < 62; i++) 1570 | { 1571 | Ep3Buffer[2 + i] = RingBuf_1[ReadPtr_1++]; 1572 | ReadPtr_1 %= sizeof(RingBuf_1); 1573 | } 1574 | #else 1575 | __asm 1576 | mov _XBUS_AUX, #1 1577 | mov dph, #0x03 1578 | mov dpl, #0x82 1579 | dec _XBUS_AUX 1580 | mov dph, #(_RingBuf_1 >> 8) 1581 | mov dpl, _ReadPtr_1 1582 | 1583 | mov r6, #62 1584 | 8101919$: 1585 | 1586 | movx a, @dptr 1587 | inc _ReadPtr_1 1588 | anl _ReadPtr_1, #0x7f 1589 | mov dpl, _ReadPtr_1 1590 | 1591 | inc _XBUS_AUX 1592 | movx @dptr, a 1593 | inc dpl 1594 | dec _XBUS_AUX 1595 | 1596 | djnz r6, 8101919$ 1597 | __endasm; 1598 | #endif 1599 | UpPoint3_Busy = 1; 1600 | UEP3_T_LEN = 64; 1601 | UEP3_CTRL = UEP3_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; 1602 | 1603 | 1604 | } 1605 | else if((uint16_t) (SOF_Count - Uart_Timeout1) >= Latency_Timer1) //超时 1606 | { 1607 | Uart_Timeout1 = SOF_Count; 1608 | if(size > 62) size = 62; 1609 | #ifndef FAST_COPY_2 1610 | for(i = 0; i < (uint8_t)size; i++) 1611 | { 1612 | Ep3Buffer[2 + i] = RingBuf_1[ReadPtr_1++]; 1613 | ReadPtr_1 %= sizeof(RingBuf_1); 1614 | } 1615 | 1616 | #else 1617 | __asm 1618 | mov _XBUS_AUX, #1 1619 | mov dph, #0x03 1620 | mov dpl, #0x82 1621 | dec _XBUS_AUX 1622 | mov dph, #(_RingBuf_1 >> 8) 1623 | mov dpl, _ReadPtr_1 1624 | 1625 | mov a, r7 1626 | mov r6, a 1627 | 114810$: 1628 | 1629 | movx a, @dptr 1630 | inc _ReadPtr_1 1631 | anl _ReadPtr_1, #0x7f 1632 | mov dpl, _ReadPtr_1 1633 | 1634 | inc _XBUS_AUX 1635 | movx @dptr, a 1636 | inc dpl 1637 | dec _XBUS_AUXUSBBufState 1638 | 1639 | djnz r6, 114810$ 1640 | __endasm; 1641 | /* 1642 | 1643 | inc _XBUS_AUX 1644 | movx @dptr, a 1645 | inc dpl 1646 | dec _XBUS_AUX 1647 | 1648 | .db #0xa5 1649 | */ 1650 | #endif 1651 | UpPoint3_Busy = 1; 1652 | UEP3_T_LEN = 2 + size; 1653 | UEP3_CTRL = UEP3_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; //应答ACK 1654 | } 1655 | } 1656 | #endif 1657 | if(USBReceived) //IDLE状态 1658 | { 1659 | if(USBRecvBuf == 0) 1660 | { 1661 | USBBufState |= 0x01; 1662 | if(Serial_Done == 0) //串口IDLE 1663 | { 1664 | Serial_Done = 2; //串口发送中 1665 | SerialSendBuf = 0; 1666 | EA = 0; 1667 | USBOutPtr = 0; 1668 | USBOutLength = USBRecvLen_A; 1669 | EA = 1; 1670 | TI = 1; 1671 | } 1672 | if((USBBufState & 0x02) == 0) 1673 | { 1674 | if(UEP2_CTRL & MASK_UEP_R_RES != UEP_R_RES_ACK) 1675 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1676 | } 1677 | } 1678 | if(USBRecvBuf == 1) 1679 | { 1680 | USBBufState |= 0x02; 1681 | if(Serial_Done == 0) //串口IDLE 1682 | { 1683 | Serial_Done = 2; //串口发送中 1684 | SerialSendBuf = 1; 1685 | EA = 0; 1686 | USBOutPtr = 64; 1687 | USBOutLength = USBRecvLen_B + 64; 1688 | EA = 1; 1689 | TI = 1; 1690 | } 1691 | if((USBBufState & 0x01) == 0) 1692 | { 1693 | if(UEP2_CTRL & MASK_UEP_R_RES != UEP_R_RES_ACK) 1694 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1695 | } 1696 | } 1697 | USBReceived = 0; 1698 | } 1699 | if(Serial_Done == 1) 1700 | { 1701 | if(SerialSendBuf == 0) 1702 | { 1703 | if((USBBufState & 0x02) != 0) //B缓冲区有数据 1704 | { 1705 | Serial_Done = 2; //串口发送中 1706 | SerialSendBuf = 1; 1707 | EA = 0; 1708 | USBOutPtr = 64; 1709 | USBOutLength = USBRecvLen_B + 64; 1710 | EA = 1; 1711 | TI = 1; 1712 | } 1713 | USBBufState &= ~(0x01); //A缓冲区数据清除 1714 | } 1715 | if(SerialSendBuf == 1) 1716 | { 1717 | if((USBBufState & 0x01) != 0) //A缓冲区有数据 1718 | { 1719 | Serial_Done = 2; //串口发送中 1720 | SerialSendBuf = 0; 1721 | EA = 0; 1722 | USBOutPtr = 0; 1723 | USBOutLength = USBRecvLen_A; 1724 | EA = 1; 1725 | TI = 1; 1726 | } 1727 | USBBufState &= ~(0x02); 1728 | } 1729 | Serial_Done = 0; 1730 | //if(UEP2_CTRL & MASK_UEP_R_RES != UEP_R_RES_ACK) 1731 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1732 | // 1733 | } 1734 | /* 1735 | if(Serial_Done == 2 && USB_Require_Data == 0) 1736 | { 1737 | if(SerialSendBuf == 0) 1738 | { 1739 | if((USBBufState & 0x02) == 0) 1740 | { 1741 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1742 | } 1743 | } 1744 | if(SerialSendBuf == 1) 1745 | { 1746 | if((USBBufState & 0x01) == 0) 1747 | { 1748 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_R_RES | UEP_R_RES_ACK; 1749 | } 1750 | } 1751 | } 1752 | */ 1753 | if(USBReceived_1) 1754 | { 1755 | USBReceived_1 = 0; 1756 | U1TI = 1; 1757 | } 1758 | 1759 | if(Require_DFU) 1760 | { 1761 | Require_DFU = 0; 1762 | Jump_to_BL(); 1763 | } 1764 | #ifndef HARD_ESP_CTRL 1765 | if(Esp_Require_Reset == 1) 1766 | { 1767 | //if(TH1 == 13) 1768 | //{ 1769 | Esp_Require_Reset = 2; 1770 | Esp_Stage = SOF_Count; 1771 | //} 1772 | //else 1773 | //{ 1774 | // Esp_Require_Reset = 0; 1775 | //} 1776 | } 1777 | 1778 | if(Esp_Require_Reset == 2) 1779 | { 1780 | if((uint16_t)(SOF_Count - Esp_Stage) == 1) 1781 | { 1782 | TXD1 = 1; //IO0 1783 | CAP1 = 0; 1784 | } 1785 | if((uint16_t)(SOF_Count - Esp_Stage) == 2) 1786 | { 1787 | TXD1 = 0; 1788 | CAP1 = 1; //EN high 1789 | } 1790 | if((uint16_t)(SOF_Count - Esp_Stage) >= 3) 1791 | { 1792 | TXD1 = 1; 1793 | } 1794 | if((uint16_t)(SOF_Count - Esp_Stage) >= 1000) 1795 | { 1796 | Esp_Require_Reset = 3; 1797 | } 1798 | } 1799 | if(Esp_Require_Reset == 4) 1800 | {RingBuf 1801 | Esp_Require_Reset = 0; 1802 | CAP1 = 1; 1803 | } 1804 | #endif 1805 | 1806 | 1807 | 1808 | } 1809 | 1810 | #if 0 1811 | if(UartByteCount) 1812 | Uart_Timeout++; 1813 | if(!UpPoint2_Busy) //端点不繁忙(空闲后的第一包数据,只用作触发上传) 1814 | { 1815 | length = UartByteCount; 1816 | if(length > 0) 1817 | { 1818 | if(length > 39 || Uart_Timeout > 100) 1819 | { 1820 | Uart_Timeout = 0; 1821 | if(Uart_Output_Point + length > UART_REV_LEN) 1822 | length = UART_REV_LEN - Uart_Output_Point; 1823 | UartByteCount -= length; 1824 | //写上传端点 1825 | memcpy(Ep2Buffer + MAX_PACKET_SIZE, &Receive_Uart_Buf[Uart_Output_Point], length); 1826 | Uart_Output_Point += length; 1827 | if(Uart_Output_Point >= UART_REV_LEN) 1828 | Uart_Output_Point = 0; 1829 | UEP2_T_LEN = length; //预使用发送长度一定要清空 1830 | UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; //应答ACK 1831 | UpPoint2_Busy = 1; 1832 | } 1833 | } 1834 | } 1835 | #endif 1836 | } 1837 | } 1838 | 1839 | --------------------------------------------------------------------------------