opt: usb macros
This commit is contained in:
parent
27790cc05b
commit
78a88edd0c
@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
FwLib_STC8 是面向 STC8G/STC8H 系列 MCU 的C语言封装库
|
FwLib_STC8 是面向 STC8G/STC8H 系列 MCU 的C语言封装库
|
||||||
|
|
||||||
|
## 芯片用户手册
|
||||||
|
|
||||||
|
* STC8A/8F: [中文](http://www.stcmcudata.com/STC8F-DATASHEET/STC8A-STC8F.pdf), [英文](http://www.stcmcudata.com/STC8F-DATASHEET/STC8-english-20180320.pdf)
|
||||||
|
* STC8G: [中文](http://www.stcmcudata.com/STC8F-DATASHEET/STC8G.pdf), [英文](https://www.stcmcudata.com/STC8F-DATASHEET/STC8G-EN.pdf)
|
||||||
|
* STC8H: [中文](http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf), [英文](https://www.stcmcudata.com/STC8F-DATASHEET/STC8H-EN.pdf)
|
||||||
|
|
||||||
|
|
||||||
# 特性
|
# 特性
|
||||||
|
|
||||||
* 与 SDCC 和 Keil C51 兼容
|
* 与 SDCC 和 Keil C51 兼容
|
||||||
@ -15,7 +22,7 @@ FwLib_STC8 是面向 STC8G/STC8H 系列 MCU 的C语言封装库
|
|||||||
```bash
|
```bash
|
||||||
# GitHub
|
# GitHub
|
||||||
git clone https://github.com/IOsetting/FwLib_STC8.git FwLib_STC8
|
git clone https://github.com/IOsetting/FwLib_STC8.git FwLib_STC8
|
||||||
# or Giteee (for Chinese users)
|
# or Giteee (内网用户)
|
||||||
git clone https://gitee.com/iosetting/fw-lib_-stc8.git FwLib_STC8
|
git clone https://gitee.com/iosetting/fw-lib_-stc8.git FwLib_STC8
|
||||||
```
|
```
|
||||||
2. 复制(或移动)到 PlatformIO 项目的lib目录下
|
2. 复制(或移动)到 PlatformIO 项目的lib目录下
|
||||||
|
@ -2,6 +2,12 @@
|
|||||||
|
|
||||||
FwLib_STC8 is a lite firmware library for STC8G/STC8H series MCU.
|
FwLib_STC8 is a lite firmware library for STC8G/STC8H series MCU.
|
||||||
|
|
||||||
|
## Official Datasheets, User Manuals
|
||||||
|
|
||||||
|
* STC8A/8F: [Chinese](http://www.stcmcudata.com/STC8F-DATASHEET/STC8A-STC8F.pdf), [English](http://www.stcmcudata.com/STC8F-DATASHEET/STC8-english-20180320.pdf)
|
||||||
|
* STC8G: [Chinese](http://www.stcmcudata.com/STC8F-DATASHEET/STC8G.pdf), [English](https://www.stcmcudata.com/STC8F-DATASHEET/STC8G-EN.pdf)
|
||||||
|
* STC8H: [Chinese](http://www.stcmcudata.com/STC8F-DATASHEET/STC8H.pdf), [English](https://www.stcmcudata.com/STC8F-DATASHEET/STC8H-EN.pdf)
|
||||||
|
|
||||||
# Features
|
# Features
|
||||||
|
|
||||||
* Compatible with SDCC and Keil C51
|
* Compatible with SDCC and Keil C51
|
||||||
|
@ -23,7 +23,7 @@ __CODE uint8_t PRODUCTDESC[30];
|
|||||||
__XDATA uint8_t HidFreature[64];
|
__XDATA uint8_t HidFreature[64];
|
||||||
__XDATA uint8_t HidInput[64];
|
__XDATA uint8_t HidInput[64];
|
||||||
__XDATA uint8_t HidOutput[64];
|
__XDATA uint8_t HidOutput[64];
|
||||||
SETUP Setup;
|
usb_request_t usb_request;
|
||||||
EP0STAGE Ep0Stage;
|
EP0STAGE Ep0Stage;
|
||||||
|
|
||||||
void USB_Init();
|
void USB_Init();
|
||||||
@ -52,10 +52,11 @@ void main()
|
|||||||
void USB_Init()
|
void USB_Init()
|
||||||
{
|
{
|
||||||
SYS_EnableOscillator48M();
|
SYS_EnableOscillator48M();
|
||||||
USBCLK = 0x00;
|
USB_SetClockSource(USB_ClockSource_6M);
|
||||||
USBCON = 0x90;
|
USB_SetEnabled(HAL_State_ON);
|
||||||
IP2H |= 0x80; // highest priority
|
USB_SetDpDmPullUp(HAL_State_ON);
|
||||||
IP2 |= 0x80;
|
EXTI_USB_SetIntPriority(EXTI_IntPriority_Highest);
|
||||||
|
|
||||||
USB_WriteReg(FADDR, 0x00);
|
USB_WriteReg(FADDR, 0x00);
|
||||||
USB_WriteReg(POWER, 0x08);
|
USB_WriteReg(POWER, 0x08);
|
||||||
USB_WriteReg(INTRIN1E, 0x3f);
|
USB_WriteReg(INTRIN1E, 0x3f);
|
||||||
@ -104,16 +105,16 @@ INTERRUPT(USB_Routine, EXTI_VectUSB)
|
|||||||
if (csr & OPRDY)
|
if (csr & OPRDY)
|
||||||
{
|
{
|
||||||
Ep0Stage.bStage = EPSTATUS;
|
Ep0Stage.bStage = EPSTATUS;
|
||||||
USB_ReadFIFO(FIFO0, (uint8_t *)&Setup);
|
USB_ReadFIFO(FIFO0, (uint8_t *)&usb_request);
|
||||||
((uint8_t *)&Ep0Stage.wResidue)[0] = Setup.wLengthH;
|
((uint8_t *)&Ep0Stage.wResidue)[0] = usb_request.wLength.bb.bh;
|
||||||
((uint8_t *)&Ep0Stage.wResidue)[1]= Setup.wLengthL;
|
((uint8_t *)&Ep0Stage.wResidue)[1] = usb_request.wLength.bb.bl;
|
||||||
switch (Setup.bmRequestType & REQUEST_MASK)
|
switch (usb_request.bmRequestType & REQUEST_MASK)
|
||||||
{
|
{
|
||||||
case STANDARD_REQUEST:
|
case STANDARD_REQUEST:
|
||||||
switch (Setup.bRequest)
|
switch (usb_request.bRequest)
|
||||||
{
|
{
|
||||||
case SET_ADDRESS:
|
case SET_ADDRESS:
|
||||||
USB_WriteReg(FADDR, Setup.wValueL);
|
USB_WriteReg(FADDR, usb_request.wValue.bb.bl);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SET_CONFIG:
|
case SET_CONFIG:
|
||||||
@ -128,7 +129,7 @@ INTERRUPT(USB_Routine, EXTI_VectUSB)
|
|||||||
|
|
||||||
case GET_DESCRIPTOR:
|
case GET_DESCRIPTOR:
|
||||||
Ep0Stage.bStage = EPDATAIN;
|
Ep0Stage.bStage = EPDATAIN;
|
||||||
switch (Setup.wValueH)
|
switch (usb_request.wValue.bb.bh)
|
||||||
{
|
{
|
||||||
case DESC_DEVICE:
|
case DESC_DEVICE:
|
||||||
Ep0Stage.pData = DEVICEDESC;
|
Ep0Stage.pData = DEVICEDESC;
|
||||||
@ -141,7 +142,7 @@ INTERRUPT(USB_Routine, EXTI_VectUSB)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DESC_STRING:
|
case DESC_STRING:
|
||||||
switch (Setup.wValueL)
|
switch (usb_request.wValue.bb.bl)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
Ep0Stage.pData = LANGIDDESC;
|
Ep0Stage.pData = LANGIDDESC;
|
||||||
@ -186,7 +187,7 @@ INTERRUPT(USB_Routine, EXTI_VectUSB)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CLASS_REQUEST:
|
case CLASS_REQUEST:
|
||||||
switch (Setup.bRequest)
|
switch (usb_request.bRequest)
|
||||||
{
|
{
|
||||||
case GET_REPORT:
|
case GET_REPORT:
|
||||||
Ep0Stage.pData = HidFreature;
|
Ep0Stage.pData = HidFreature;
|
||||||
|
@ -147,17 +147,79 @@
|
|||||||
#define VENDOR_REQUEST 0x40
|
#define VENDOR_REQUEST 0x40
|
||||||
#define REQUEST_MASK 0x60
|
#define REQUEST_MASK 0x60
|
||||||
|
|
||||||
typedef struct
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_ClockSource_6M = 0x00,
|
||||||
|
USB_ClockSource_12M = 0x01, // default value
|
||||||
|
USB_ClockSource_24M = 0x02,
|
||||||
|
USB_ClockSource_IRCDiv2 = 0x03,
|
||||||
|
} USB_ClockSource_t;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
USB_PHYTest_Method_Normal = 0x00,
|
||||||
|
USB_PHYTest_Method_Force1 = 0x01,
|
||||||
|
USB_PHYTest_Method_Force0 = 0x02,
|
||||||
|
USB_PHYTest_Method_ForceOneEnd0 = 0x03,
|
||||||
|
} USB_PHYTest_Method_t;
|
||||||
|
|
||||||
|
#define USB_SetClockPPL(__STATE__) SFR_ASSIGN(USBCLK, 7, __STATE__)
|
||||||
|
#define USB_SetClockSource(__SOURCE__) SFR_ASSIGN2BIT(USBCLK, 5, __SOURCE__)
|
||||||
|
#define USB_SetClockCRE(__STATE__) SFR_ASSIGN(USBCLK, 4, __STATE__)
|
||||||
|
#define USB_SetUSBTestMode(__STATE__) SFR_ASSIGN(USBCLK, 3, __STATE__)
|
||||||
|
#define USB_SetPHYTestMode(__STATE__) SFR_ASSIGN(USBCLK, 2, __STATE__)
|
||||||
|
#define USB_SetPHYTestMethod(__TEST_METHOD__) SFR_ASSIGN2BIT(USBCLK, 0, __TEST_METHOD__)
|
||||||
|
|
||||||
|
#define USB_SetEnabled(__STATE__) SFR_ASSIGN(USBCON, 7, __STATE__)
|
||||||
|
#define USB_TurnOnReset() SFR_SET(USBCON, 6)
|
||||||
|
#define USB_TurnOffReset() SFR_RESET(USBCON, 6)
|
||||||
|
#define USB_SetPS2Mode(__STATE__) SFR_ASSIGN(USBCON, 5, __STATE__)
|
||||||
|
/**
|
||||||
|
* Enable/Disable 1.5KR pull up resistance on D+ and D-
|
||||||
|
*/
|
||||||
|
#define USB_SetDpDmPullUp(__STATE__) SFR_ASSIGN(USBCON, 4, __STATE__)
|
||||||
|
/**
|
||||||
|
* Enable/Disable 500KR pull down resistance on D+ and D-
|
||||||
|
*/
|
||||||
|
#define USB_SetDpDmPullDown(__STATE__) SFR_ASSIGN(USBCON, 3, __STATE__)
|
||||||
|
#define USB_GetDiffRecvMode() (USBCON & 0x04)
|
||||||
|
/**
|
||||||
|
* Read D+ level
|
||||||
|
*/
|
||||||
|
#define USB_GetDp() (USBCON & 0x02)
|
||||||
|
/**
|
||||||
|
* Write D+ level, writable when PS2 mode is 1
|
||||||
|
*/
|
||||||
|
#define USB_SetDp(__STATE__) SFR_ASSIGN(USBCON, 1, __STATE__)
|
||||||
|
/**
|
||||||
|
* Read D- level
|
||||||
|
*/
|
||||||
|
#define USB_GetDm() (USBCON & 0x01)
|
||||||
|
/**
|
||||||
|
* Write D- level, writable when PS2 mode is 1
|
||||||
|
*/
|
||||||
|
#define USB_SetDm(__STATE__) SFR_ASSIGN(USBCON, 0, __STATE__)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
uint16_t w;
|
||||||
|
struct _bb
|
||||||
|
{
|
||||||
|
uint8_t bl;
|
||||||
|
uint8_t bh;
|
||||||
|
} bb;
|
||||||
|
} uint16_2uint8_t;
|
||||||
|
|
||||||
|
typedef struct _usb_request_t
|
||||||
{
|
{
|
||||||
uint8_t bmRequestType;
|
uint8_t bmRequestType;
|
||||||
uint8_t bRequest;
|
uint8_t bRequest;
|
||||||
uint8_t wValueL;
|
uint16_2uint8_t wValue;
|
||||||
uint8_t wValueH;
|
uint16_2uint8_t wIndex;
|
||||||
uint8_t wIndexL;
|
uint16_2uint8_t wLength;
|
||||||
uint8_t wIndexH;
|
} usb_request_t;
|
||||||
uint8_t wLengthL;
|
|
||||||
uint8_t wLengthH;
|
|
||||||
} SETUP;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user