⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdiusbd12biancheng.txt

📁 PDIUSBD12固件编程例子
💻 TXT
📖 第 1 页 / 共 5 页
字号:

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 + -