打印

菜农NUC100学习笔记2(USB红杏是怎样出墙的?)

[复制链接]
3238|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2010-12-6 03:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*-------------------------------------------------------------------------------
文 件 名 : NUC1xxcfg.h
创 建 人 : Cortex-M0菜鸟HotPower@163.com,HotPower@126.com,QQ:1270688699
个 人 网 站 : www.hotpower.org,www.hotpower.net,www.hotpage.net.cn(合作及导航)
创 建 日 期 : 2010.10.18 18:18
最近修改日期 : 2010.12.6 3:18
创 建 地 点 : 西安大雁塔村队部
版 本 号 : V1.05 (红杏版)
修 改 原 因 : 规范并使寄存器模式也能控制到所有位
说 明 : 菜农掌握本版本的解释权利。
由于本头文件为开源,出现问题恕不承担一切责任。
备 注 : 本头文件风格归属于菜农的《红杏出墙》系列,堪称“红杏级别”
将本文件拷贝到...\CMSIS\CM0\DeviceSupport\Nuvoton\NUC1xx内。
-------------------------------------------------------------------------------*/

//----------------------------------------------------//
typedef enum
{
USBD_INTEN_BUS = 0,//1/0使能/禁止BUS事件中断
USBD_INTEN_USB = 1,//1/0 使能/禁止USB事件中断
USBD_INTEN_FLD = 2,//1/0使能/禁止 浮动检测中断
USBD_INTEN_WAKEUP = 3,//1/0 使能/禁止 唤醒功能
USBD_INTEN_WAKEUP_EN = 8,//1/0 使能/禁止USB 唤醒功能
USBD_INTEN_INNAK_EN = 15,//1/0 在接到IN标志后,设备响应NAK,使能/禁止中断
}NU_USBD_INTEN_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_INTEN_T Bits;
}NU_USBD_INTEN_T;
//----------------------------------------------------//
typedef enum
{
USBD_INTSTS_BUS = 0,//Bus 事件发生,通过ATTR[3:0]可知是哪类Bus事件发生,向EVF[0]写1清标志
USBD_INTSTS_USB = 1,//USB 事件发生,通过STS[6:4]可知是哪类USB事件发生
USBD_INTSTS_FLD = 2,//浮动检测事件发生,向EVF[2]写1 清标志
USBD_INTSTS_WAKEUP = 3,//唤醒事件发生,向EVF[3]写1 清标志
USBD_INTSTS_EPTF = 16,//1 = USB事件发生,通过STS[xxxx]可知是哪类USB事件发生
USBD_INTSTS_SETUP = 31,//1 = Setup事件发生,向EVF[31]写1清标志
}NU_USBD_INTSTS_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_INTSTS_T Bits;
}NU_USBD_INTSTS_T;
//----------------------------------------------------//
typedef enum
{
USBD_FADDR_FADDR = 0//USB设备的功能地址
}NU_USBD_FADDR_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_FADDR_T Bits;
}NU_USBD_FADDR_T;
//----------------------------------------------------//
typedef enum
{
USBD_EPSTS_OVERRUN = 7,//输出数据超过最大有效载荷或安装数据超过8字节
USBD_EPSTS_EPSTS0 = 8,//端点0的系统状态(000=In ACK~111=同步传输结束)
USBD_EPSTS_EPSTS1 = 11,//端点1的系统状态(000=In ACK~111=同步传输结束)
USBD_EPSTS_EPSTS2 = 14,//端点2的系统状态(000=In ACK~111=同步传输结束)
USBD_EPSTS_EPSTS3 = 17,//端点3的系统状态(000=In ACK~111=同步传输结束)
USBD_EPSTS_EPSTS4 = 20,//端点4的系统状态(000=In ACK~111=同步传输结束)
USBD_EPSTS_EPSTS5 = 23,//端点5的系统状态(000=In ACK~111=同步传输结束)
}NU_USBD_EPSTS_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_EPSTS_T Bits;
}NU_USBD_EPSTS_T;
//----------------------------------------------------//
typedef enum
{
USBD_ATTR_USBRST = 0,//SE0(single-ended 0) 超过2.5uS,总线复位.
USBD_ATTR_SUSPEND = 1,//Bus空闲超过3mS,表示 要么电缆没连接,要么主机正在休眠.
USBD_ATTR_RESUME = 2,//从暂停中恢复
USBD_ATTR_TIMEOUT = 3,//无响应超过18位时间
USBD_ATTR_PHY_EN = 4,//使能 PHY
USBD_ATTR_RWAKEUP = 5,//使USB总线处于K状态,以便远程唤醒.
USBD_ATTR_USB_EN = 7,//使能 USB
USBD_ATTR_DPPU_EN = 8,//使能 DP上拉电阻
USBD_ATTR_PDB = 9,//掉电 PHY, 低电平有效
}NU_USBD_ATTR_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_ATTR_T Bits;
}NU_USBD_ATTR_T;
//----------------------------------------------------//
typedef enum
{
USBD_FLDET_FLDET = 0//1/0: 连接/悬空
}NU_USBD_FLDET_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_FLDET_T Bits;
}NU_USBD_FLDET_T;
//----------------------------------------------------//
typedef enum
{
USBD_BUFSEG_BUFSEG = 3//仅用于标记设置(总线缓冲有效的开始地址= {BUFSEG[8:3], 3’b000})
}NU_USBD_BUFSEG_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_BUFSEG_T Bits;
}NU_USBD_BUFSEG_T;
//----------------------------------------------------//
typedef enum
{
USBD_EP_BUFSEG_BUFSEG = 0//USB缓冲有效的开始地址
}NU_USBD_EP_BUFSEG_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_BUFSEG_T Bits;
}NU_USBD_EP_BUFSEG_T;
//----------------------------------------------------//
typedef enum
{
USBD_EP_MXPLD_MXPLD = 0//Read:(IN : 发送到主机的数据长度,OUT : 从主机接收到数据的实际长度.)
//Write:(IN : 发送到主机的数据长度,OUT : 从主机接收到数据的最大长度
//注:一旦MXPLD被写,数据包将在IN/OUT标志到达之后立即发送/接收.
}NU_USBD_EP_MXPLD_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_MXPLD_T Bits;
}NU_USBD_EP_MXPLD_T;
//----------------------------------------------------//
typedef enum
{
USBD_EP_CFG_EPT = 0,//端点号
USBD_EP_CFG_ISOCH = 4,//同步,无握手
USBD_EP_CFG_STATE = 5,//状态(00 = 禁止端点01 = Out 端点10 = IN 端点11 = 无定义)
USBD_EP_CFG_DSQ = 7,//主机应答之后,IN标记自动指定为数据0或1.
USBD_EP_CFG_STALL_CTL = 9,//1 = 在setup阶段允许自动清stall
}NU_USBD_EP_CFG_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_CFG_T Bits;
}NU_USBD_EP_CFG_T;
//----------------------------------------------------//
typedef enum
{
USBD_EP_CFGP_CFGP = 0,//IN: 写 ‘1’ 清in ready (由MXPLD置1).OUT: 写 ‘1’清out ready(由MXPLD置1)
USBD_EP_CFGP_STALL = 1,//置1, 使设备响应STALL
}NU_USBD_EP_CFGP_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_CFGP_T Bits;
}NU_USBD_EP_CFGP_T;
//----------------------------------------------------//
typedef struct
{
__IO NU_USBD_EP_BUFSEG_T BUFSEG;//端点0~5的缓冲分割寄存器
__IO NU_USBD_EP_MXPLD_T MXPLD;//端点0~5的最大有效载荷寄存器
__IO NU_USBD_EP_CFG_T CFG;//端点0~5的配置寄存器
__IO NU_USBD_EP_CFGP_T CFGP;//端点0~5的额外配置寄存器
}NU_USBD_EP_T;
//----------------------------------------------------//
typedef enum
{
USBD_DRVSE0_DRVSE0 = 0//1/0: 驱动 se0/无
}NU_USBD_DRVSE0_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_DRVSE0_T Bits;
}NU_USBD_DRVSE0_T;
//----------------------------------------------------//
typedef enum
{
USBD_PDMA_PDMA_RW = 0,//0 = 从内存读数据到USB缓存,1 = 从USB缓存读数据到内存
USBD_PDMA_PDMA_EN = 0//0 = 禁止PDMA,1 = 使能PDMA,该位在PDMA传输完毕后自动清零.
}NU_USBD_PDMA_ENUM;

typedef volatile union
{
NU_REG Regs;
USBD_PDMA_T Bits;
}NU_USBD_PDMA_T;
//----------------------------------------------------//
typedef struct
{
__IO NU_USBD_INTEN_T INTEN;//中断使能寄存器
__IO NU_USBD_INTSTS_T INTSTS;//中断事件标志寄存器
__IO NU_USBD_FADDR_T FADDR;//功能地址寄存器
__IO NU_USBD_EPSTS_T EPSTS;//系统状态寄存器
__IO NU_USBD_ATTR_T ATTR;//总线状态&归属寄存器
__I NU_USBD_FLDET_T FLDET;//悬空检测寄存器
__IO NU_USBD_BUFSEG_T BUFSEG;//缓冲分割寄存器
__I NU_REG RESERVE0;
union{
__IO NU_USBD_EP_T EP[6];//端点数组0~5
struct{
__IO NU_USBD_EP_T EP0;//端点0
__IO NU_USBD_EP_T EP1;//端点1
__IO NU_USBD_EP_T EP2;//端点2
__IO NU_USBD_EP_T EP3;//端点3
__IO NU_USBD_EP_T EP4;//端点4
__IO NU_USBD_EP_T EP5;//端点5
};
};
__I NU_REG RESERVE1[4];
__IO NU_USBD_DRVSE0_T DRVSE0;//驱动SE0寄存器(1/0: 驱动 se0/无)
__I NU_REG RESERVE2[4];
__IO NU_USBD_PDMA_T PDMA;//PDMA 控制寄存器
}NU_USBD_T;

//----------------------------------------------------//
#define USBDs (*((NU_USBD_T *) USBD_BASE))//定位全局结构变量USBDs
//----------------------------------------------------//
#define USBDx ((NU_USBD_T *) USBD_BASE)
//----------------------------------------------------//

相关帖子

沙发
Jerric| | 2010-12-6 15:36 | 只看该作者
很强大!MP

使用特权

评论回复
板凳
火箭球迷| | 2010-12-6 16:54 | 只看该作者
笔记似乎简洁了一点,哪里有更详细的:lol

使用特权

评论回复
地板
mtwumtwu| | 2010-12-6 17:40 | 只看该作者
雖不中亦不遠矣

使用特权

评论回复
5
hotpower|  楼主 | 2010-12-7 20:21 | 只看该作者
休眠之中

使用特权

评论回复
6
crestxa| | 2010-12-7 21:35 | 只看该作者
如果什么时候能把这句去掉,就强大了
“由于本头文件为开源,出现问题恕不承担一切责任。”

使用特权

评论回复
7
ouxueguo| | 2010-12-8 22:14 | 只看该作者
:)哪天我到达如此书写风格就很好了

使用特权

评论回复
8
秋天落叶| | 2010-12-9 21:33 | 只看该作者
很不错的笔记,虽然看的很辛苦:lol

使用特权

评论回复
9
hotpower|  楼主 | 2012-1-6 09:24 | 只看该作者
看看

使用特权

评论回复
10
martinshen| | 2012-1-9 22:19 | 只看该作者
看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝