📄 pdiusbd12biancheng.txt
字号:
在
MAINLOOP.H中有如下
CPU和编译器预定义
#ifdef__C51__
#define SWAP(x) ((((x)&0xFF)<<8)|(((x)>>8)&0xFF))
#else
#define SWAP(x) (x)
#define code
#define idata
SWAP对于微控制器是必要的它是一个格式例如
8031 ”code”和”idata”仅在使用
8031和
Keil
C编译器时才需要
在轮询模式中使用固件
在轮询模式中使用固件是十分方便的在主循环中增加如下代码
if(interrupt_pin_low)
fn_usb_isr();
通常
ISR由硬件初始化在轮询模式中主循环检测中断引脚状态并在需要的时候调用
ISR
硬件提取层
该层包含最底层的函数这些函数在不同的
CPU平台上需要进行改变
void outportb(unsigned char port,unsigned char val);
void inportb(unsigned char port);
void dma_start(PIO_REQUSET pio)
对
PDIUSBD12所有的
I/O访问都可由前两个函数
outportb和
inportb实现对于最后一个函数
它用于实现
EPP DMA功能后一个用于设定
EPP页地址和
CPLD计数器这种类型的实现允许系统脱
离平台这意味着这种应用结构适用于
8051或
PC以外的平台
对于
USB_EPP评估板
dma_start()函数调用以下
2个函数这
2个函数在实现目标应用中不是必需的
void eppAwrite(unsigned char A_data);
void program_cpld(unsigned short uSize,unsigned char bCommand);
PDIUSBD12命令接口
下面的函数定义成PDIUSBD12的命令接口以简化器件的编程它们是由数据手册简化的PDIUSBD12
命令集
void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable);
void D12_SetEndpointEnable(unsigned char bEnable);
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv);
void D12_SetDMA(unsigned char bMode);
unsigned short D12_ReadInterruptRegister(void);
unsigned char D12_SelectEndpoint(unsigned char bEndp);
unsigned char D12_ReadLastTransactionStatus(unsigned char bEndp);
void D12_SetEndpointStatus(unsigned char bEndp, unsigned char bStalled);
void D12_SendResume(void);
unsigned short D12_ReadCurrentFrameNumber(void);
unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char * buf, unsigned char len);
unsigned char D12_WriteEndpoint(unsigned char endp, unsigned char * buf, unsigned char len);
void D12_AcknowledgeEndpoint(unsigned char endp);
中断服务程序
PDIUSBD12的固件完全由中断驱动
ISR的流程图如下所示
43
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
44
在ISR 的入口固件使用D12_ReadInterruptRegiste()来决定中断源然后将进入相应的子程序进行处理
ISR
ISR Entry
Read D12 Interrupt Register
Reset Idle Timer
Bus Reset?
Suspend Change?
DMA EOT?
Control In Done?
Control Out Done?
Generic In Done?
Generic Out Done?
Main In Done?
Main Out Done?
Send EOI to Interrupt Controller
End of ISR
No
No
No
No
No
No
No
No
No
Set Bus Reset Flag Yes
Set Suspend Changed Flag
DMA EOT handler Subroutine
Control RX handler Subroutine
Control TX handler Subroutine
Generic RX handler Subroutine
Generic TX handler Subroutine
Main RX handler
Subroutine
Main TX handler
Subroutine
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
ISR与前台主循环通过事件标志
EPPFLAGS和数据缓冲区
CONROL_XFER进行通信
typedef union_epp_flags
{
struct_flags
{
unsigned char timer :1;
unsigned char bus_reset :1;
unsigned char suspend :1;
unsigned char setup_packet :1;
unsigned char remote_wakeup :1;
unsigned char in_isr :1;
unsigned char control_state :2;
unsigned char configuration :1;
unsigned char verbose :1;
unsigned char ep1_rxdone :1;
unsigned char setup_dma :1;
unsigned char dma_state :2;
}bits;
unsigned short value
}EPPFLAGS;
typedef struct_device_request
{
unsigned char bmRequesetType;
unsigned char bRequest;
unsigned short wValue;
unsigned short windex;
unsigned short wLength;
}DEVICE_REQUEST;
typedef struct_control_xfer
{
DEVICE_REQUSET DeviceRequest;
unsigned short wLength
unsigned short wCount;
unsigned char * pData;
unsigned char dataBuffer[MAX_CONTROLDATA_SIZE];
}CONTROL_XFER;
主循环和
ISR之间的任务分配是这样的
ISR从
D12收集数据而主循环对数据进行处理当
ISR收
集了足够的数据时它只通知主循环已经准备好等待处理例如在
OUT数据阶段的建立包时
ISR将建
立包和
OUT数据都存入
CONTROL_XFER缓冲区中然后将
setup_packer标志送到主循环这将减
少主循环不必要的服务时间并且简化了主循环的编程
总线复位和挂起改变
总线复位和挂起并不要求在
ISR中进行特殊的处理
ISR只需在
EPPFLAGS中设置
bus_reset或
45
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
46
suspends 标志位然后退出即可
控制端点处理程序
控制传输总是在 SETUP 阶段开始之后为可选的的DATA阶段然后在STATUS 阶段结束上图所
示为控制端点不同状态的转变固件使用这3 种状态来正确地处理控制传输
如下所示为控制输出处理程序为了说明它举一个主机请求的例子叫做Get Descriptor() 的标准
设备请求
Control Out Handler
Setup Packet?
Select Control Out Endpoint
Read Buffer, save to DeviceRequest
Clear Buffer
Valid Device
Request?
Acknowledge Setup on
Control In and Control Out
Control Read?
Control Write with
Data?
Data length
Acceptable?
Control State <- USB_RECEIVE
End of Handler
Yes
Yes
No
Yes
Yes
Stall Control
Endpoints
No
No
State
USB_RECEIVE?
Control State <- USB_TRANSMIT
Set Event: Setup Packet
Control State <- USB_IDLE
No Set Event: Setup Packet
Yes
Select Control Out Endpoint
Read Buffer, save to Control Data Buffer
Clear Buffer
All Data Received?
Control State <- USB_IDLE
Set Event: Setup Packet
Yes
Yes
No
No
Control State <- USB_IDLE
No
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
47
当USB 器件D12 接收到建立包将产生一个中断通知MCU 微控制器响应中断通过读D12 中断
寄存器决定包是发到控制端点还是普通端点如果包是送往控制端点MCU 需要通过读D12 的最后处理
状态寄存器进一步确定数据是否是一个建立包第一个包必须是建立包
从上面的流程图中MCU 需要通过选择控制输出端点提取建立包的内容来决定端点是为满还是空
如果控制端点为满MCU 将从缓冲区读出内容并将其存入存储区之后它将从存储区使主设备请求生效
如果是一个有效的请求MCU 必须向控制输出端点发送应答建立命令以重新使能下一个建立阶段
接下来MCU 需要证实控制传输是控制读还是写这可以通过读建立包中bmRequestType 的第8 位
来实现如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向主机发回数据包MCU
需要设置一个标志以指示USB 设备现在正处于传输模式即准备在主机发送请求时发送数据
建立阶段结束之后主机会执行数据阶段D12 等待接收Control_In 包过程如下面的流程图
Control_In 处理程序所示MCU 首先需要通过读D12 的最后处理状态寄存器清零Control_In 中断标志
位接着MCU 在确认D12 处于传输模式后进行数据包的发送
由于 D12 的控制端点只有16字节FIFO 如果传输的长度大于16 字节MCU 在传输阶段就必须控制
数据的数量如流程图所示MCU 必须检查要发送到主机的当前和剩余的数据大小如果剩下的字节数大
于16 MCU 将先发送16 字节并用减去参考长度要求的长度16
当下一个Control_In 标志来到时MCU 将确定剩余的字节是否为零如果已经没有数据要发送MCU
需要发送一个空的包以指示主机数据已经发送完毕
如果建立包为Set_Descriptor()请求那么建立包中的控制传输将指示此包为控制写类型在执行完
Set_Descriptor 请求过程后MCU 等待数据阶段主机发送一个Control_Out 标志MCU 从D12 缓冲区中
减去数据流程现在处于Control_Out 处理程序的右端MCU首先确认D12 是否处于USB_Receive模式
然后MCU 通过检查选择控制输出端点确认缓冲区是否已满并将数据从缓冲区读出
上面所示为控制输入处理流程图
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
普通端点处理程序
普通输出端点配置为从主机接收数据包将其解释为
LED控制数据当
MCU从主机接收
Generic_Out
标志通过读中断寄存器识别时
D12中断位必须清零选择端点将清零
Generic_Out缓冲区接下来
MCU需要确认数据的长度并解释数据
对于
Generic_In端点该端点配置为向主机发送一个字节按钮激活信息
Generic Out Handler
Clear Generic Out Interrupt Bit
Read and Clear Generic Out Buffer
Data Length = 0?
No
Save the Data and Set bEPPFlag Bit Yes
Generic In Handler
Clear Generic In Interrupt Bit
End of Generic In Handler
End of Generic Out Handler
主端点处理程序
由于主输入/输出端点配置为
DMA模式而对这些端点的中断是禁止的对这些端点没有通常所要求的
中断服务但是为了让代码更安全地执行在此处放入清零中断子程序
Main Out Handler
Clear Main Out Interrupt Bit
End of Main Out Handler
Main In Handler
Clear Main In Interrupt Bit
End of Main In Handler
EOT处理程序
关于
EOT处理程序更详细的信息请参阅
DMA支持一章
主循环
MCU一旦上电就需要初始化其所有端口存储区定时器和中断服务程序之后
MCU将重新连接
USB包括将
Soft_Connect寄存器设置为
ON这些过程是很重要的因为它确保了在
MCU准备好服务
D12之前
D12不会进行操作
在主循环程序中
MCU对键盘进行轮询如果任何一个特定的按键被按下键处理命令将执行子程
序并返回主循环增加该子程序的目的仅仅是为了调试
1ms定时器用于激活该子程序以检测在评估板上
的任何按键
当轮询到了检测建立包时它确认建立标志在之前是否被中断服务程序所置位如果建立标志置位
它将向协议层发送一个器件请求进行处理下面所示的流程图是主程序在前台执行的流程
48
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
Main Loop
initialize Ports, Memory and Timer
Setup ISR and Program Interrupt Controller
Reconnect USB
Program Exit?
Keyboard Pressed?
Timer Signal?
Bus Reset?
Suspend Change?
Setup Packet?
Loop
Restore ISR vectors
Reset Interrupt Controller
End
Read Key Code
Handle Key Commands
No
Yes
Update Test LEDs and Check Test Keys
On Evaluation Board
Display Bus Reset Event Detected
Read Suspend State
Display Suspend Changed Event
Dispatch Device Request to
Protocol Layer for Processing
Yes
Yes
Yes
Yes
No
No
No
No
Yes
No
协议层
清除特征请求
在清除特征请求中
MCU需要清除或禁止器件的一个具体特征
MCU决定请求是否对器件接口或
端点有意义如果接收器是一个接口那么将不会有任何支持当使能或设置器件或端点的具体特征例
如远程唤醒时使用特征选择器如果接收器是一个器件而远程唤醒功能已经使能
MCU需要禁止该功
能如果接收器是端点
MCU必须通过设置端点状态命令恢复指定的端点
49
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
Is recipient a device?
Is recipient an
Interface?
Is recipient an
endpoint?
Clear device feature
according to
"Feature Selector"
Yes
No
Yes
No
Yes
Unsupported
Command
No
Clear endpoint feature
according to
"Feature Selector"
Sent zero length
packet to Host
Clear Feature
End Clear
Feature
获得状态请求
在获得状态请求中
MCU必须向指定的接收器返回状态
MCU需要再次确定请求的接收器如果请
求是对器件
MCU必须向主机返回器件状态对于具有远程遥控和自供电能力的系统返回数据应该是
0x0003如果接收器是一个接口
MCU应向主机返回
0x0000
50
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
Get_Status
Return Device
status to host
Is recipient a
device?
Is recipient an
interface?
Return Interface
status to host
Is recipient an
endpoint?
Return Endpoint
status to host
End of Get_Status
Yes
No
No
Unsupported
Command
Yes
No
Yes
设置地址请求
在设置地址请求中器件会从建立包的内容中得到新的地址请注意此设置地址请求不含数据阶段
因此
MCU需要向主机写一个零长度的数据包作为应答阶段
Write new address
to device_addr register
Sent zero length
packet to Host.
Set Address
End Set Address
获得配置请求
在获得配置请求中
MCU必须返回当前的配置值首先
MCU将确定是否已配置好如果器件尚未
配置将向主机返回一个
0如果已配置则返回
1
51
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
Has Device been
"Configuration"?
Sent " 1" to host Sent " 0 " to host
Get Config
End Get
Config
获得描述符请求
对于获得描述符请求如果存在描述符
MCU必须返回指定的描述符首先
MCU将确定描述符类
型请求是用于器件还是配置如果是器件那么发送器件描述符的前
16字节控制返回字节的长度是因为
控制缓冲区只有
16字节的存储区
MCU需要设置一个寄存器以指示传输规格的位置
设置配置请求
Did host send
"0" to Device?
Clear Device
configuration flag
Yes
No
Set Device
configuration flag
Sent zero packet
to host
Set Config
End Set Config
对于设置配置请求
MCU将从建立包中确定配置值如果配置值为
0 MCU必须清除存储区中的配
置标志并禁止端点如果该值为
1 MCU需要将配置标志置位该标志一旦置位
MCU还需要向主机发
送零数据包作为应答阶段
获得/设置接口请求
52
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
获得接口请求中
MCU需要向主机发送一个零数据包作为评估板所唯一支持的接口对于评估板的
设置接口请求
MCU除了向主机发送一个零数据包作为应答阶段之外不需要做任何事
设置特征请求
设置特征请求和清除特征请求正好相反如果接收器是一个器件那么
MCU需要根据建立包中的特
征选择器设置器件特征再次说明的是不支持接口的接收例如如果特征选择器是
0意味着对端点的
使能
D12指定的端点必须通过
D12 设置端点状态命令停止
Is recipient a device?
Is recipient an
Interface?
Is recipient an
endpoint?
Set device feature
according to
"Feature Selector"
Yes
No
Yes
No
Yes
Unsupported
Command
No
Set endpoint feature
according to
"Feature Selector"
Sent zero length
packet to Host
Set Feature
End Set Feature
DMA支持
基于协议的
DMA操作简介
PDIUSBD12有
6个端点其中
2个控制端点
2个普通端点和
2个主端点主端点支持
DMA传输
在基于协议的
DMA操作中主机应用程序询问器件的固件以通过由控制端点发送的厂商请求建立
DMA传输然后在主端点上执行实际的批量数据传输在
DMA控制器建立之后主机可向器件传输最多为
64k字节的数据而不需要任何固件的干预
一个完整的
DMA传输要求以下两个步骤
1 通过主管道发送一个请求并允许器件用
DMA传输方向起始地址和传输规格对
DMAC进
行编程
2 在主端点上发送或接收数据包
53
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 http://www.zlgmcu.com
54
器件DMA 状态
建立DMA请求通过控制管道作为厂商请求从主机发出器件的响应和动作依赖于DMA 操作的状态
上图所示为器件中DMA 的3 种状态IDLE RUNNING 和PENDING 如果没有运行或推迟DMA
操作器件处于IDLE 状态那么建立DMA 请求由ACK 进行响应如果器件在DMA 传输的过程中就是
RUNNING状态建立DMA 请求由NAK 进行响应并导致器件进入PENDING状态这表示有一个推迟的
建立DMA请求如果器件在PENDING状态中接收到另一个建立DMA请求新的请求将覆盖旧的请求
下图为固件处理建立DMA请求和EOT的程序流程图
DMA 配置寄存器
D12 的DMA操作由其DMA配置寄存器进行控制该寄存器由设
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -