阅读:1597回复:14
周功D12讨论区
我是一个新手谁对周功的熟讨论讨论.
我问第一个问题:D12CI.C 中有设置地址使能命令: //设置地址使能 void D12_SetAddressEnable(unsigned char bAddress, unsigned char bEnable) { if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, 0xD0);//输出指令 if(bEnable) bAddress |= 0x80; outportb(D12_DATA, bAddress);//设置地址 if(bEPPflags.bits.in_isr == 0) ENABLE; } 其中如果if(bEnable)则 bAddress |= 0x80有 我不明白的是为什么给80地址.和如何理解这一句. |
|
|
沙发#
发布于:2004-03-22 10:53
后面7位是主机给设备分配的地址,最高位1,好像是确认有效吧,
具体你再查看d12的datasheet |
|
板凳#
发布于:2004-03-22 11:02
那最初的初始化地址是0了吗?以后我好象知道是计算机分配地址给USB吗?
如果理解是MCU分配给外围器件的一个地址.我这样理解对吗? |
|
|
地板#
发布于:2004-03-22 12:44
是的 ,计算机发送设置地址命令给D12,MCU处理这个命令的时候把这个值写入D12的地址寄存器中
|
|
|
地下室#
发布于:2004-03-22 13:01
这些都是固件里的程序吧,在主机usb驱动程序里面用的是哪个函数实现发送的功能的?能否说明,楼上??谢谢
|
|
|
5楼#
发布于:2004-03-22 14:26
我再问两个很菜的问题这两个问题都关于C51:
1.bAddress |= 0x80;中|=是什么意思. 2.程序://读取中断寄存器 unsigned short D12_ReadInterruptRegister(void) { unsigned char b1; unsigned int j; outportb(D12_COMMAND, 0xF4);//读取中断寄存器 b1 = inportb(D12_DATA); j = inportb(D12_DATA); j <<= 8; j += b1; return j; } 在读中断寄存器中连读两个数据b1和j ,我不明白的是j <<= 8; j += b1; return j; } 什么原因.要这样做.左移,两个字节的标志位为什么只返回一个J就可以了.谁能解释一下. |
|
|
6楼#
发布于:2004-03-22 15:49
是这样的,因为中断控制器是四个字节的寄存器,所以先读出高位,再读低位,让后在把他们合起来,明白了么?
|
|
|
7楼#
发布于:2004-03-22 17:00
哦 我明白了,谢谢您了。我再问一个问题:程序
//读取端点数据 unsigned char D12_ReadEndpoint(unsigned char endp, unsigned char len, unsigned char * buf) { unsigned char i, j; if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND, endp); if((inportb(D12_DATA) & D12_FULLEMPTY) == 0) { if(bEPPflags.bits.in_isr == 0) ENABLE; return 0; } outportb(D12_COMMAND, 0xF0); j = inportb(D12_DATA); j = inportb(D12_DATA); if(j > len) j = len; for(i=0; i<j; i++) *(buf+i) = inportb(D12_DATA); outportb(D12_COMMAND, 0xF2); if(bEPPflags.bits.in_isr == 0) ENABLE; return j; } 其中return 0;解释说明端点缓存空。我不明白的是RETURN 到那里了。或说如何解释 |
|
|
8楼#
发布于:2004-03-22 17:02
|=ox80是和16进制数80进行或操作,并将所的值赋给原变量!!
[编辑 - 3/22/04 by songqian] |
|
9楼#
发布于:2004-03-22 17:04
我不知到回答的对不对bAddress |= 0x80 |=是位运算的或运算目的应该是屏蔽高四位将低四位地址取出,
j <<= 8;<<=同样是位运算是左移8位,读取中断寄存器的第二个字节它只有最后一位有定义而且sighed int是16位,左移8位就是将最低位移到第九位,j += b1;再加上读取中断寄存器的第1字节的后八位进行判断. 我再问两个很菜的问题这两个问题都关于C51: 1.bAddress |= 0x80;中|=是什么意思. 2.程序://读取中断寄存器 unsigned short D12_ReadInterruptRegister(void) { unsigned char b1; unsigned int j; outportb(D12_COMMAND, 0xF4);//读取中断寄存器 b1 = inportb(D12_DATA); j = inportb(D12_DATA); j <<= 8; j += b1; return j; } 在读中断寄存器中连读两个数据b1和j ,我不明白的是j <<= 8; j += b1; return j; } 什么原因.要这样做.左移,两个字节的标志位为什么只返回一个J就可以了.谁能解释一下. |
|
10楼#
发布于:2004-03-22 17:08
因为当前的缓冲区为空,所以返回零到 unsigned char * buf
中了,好像是,我是这么理解的 |
|
|
11楼#
发布于:2004-03-23 13:24
我再问一个问题:
在控制端点处理程序中有如下几句: "举一个主机请求的例子:GET DESCRIPOR() 的标准设备请求. 当USB器件D12收到的建立包,将产生一个中断通知MCU,MCU响应中断,通过读D12中断寄存器决定是发到控制端点还是普通端点,如果发向控制端点,MCU需要通过读D12最后处理状态寄存器进一步确定数据是否是一个建立包,第一个包必须是建立包" 我不懂的是主机是指的PC吗?标准设备请求只是PC请求D12吗? 标准设备请求达到什么目的? |
|
|
12楼#
发布于:2004-03-23 16:26
上面的问题我明白了,我再问一个问题:
对于端点0的OUT中断 程序: /端点0OUT中断 void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); //清中断标志 if (ep_last & D12_SETUPPACKET) { //接收到SETUP包 ControlData.wLength = 0; ControlData.wCount = 0; if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { //SETUP包出错,返回 D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); 谁解释一下上面的程序SETUP 出错. |
|
|
13楼#
发布于:2004-03-23 17:49
上面的问题我理解为是PC 的请求和标准请求的8个字节比较.不对就出错是吗?如何没有人回答呀!郁闷呀!
|
|
|
14楼#
发布于:2004-03-23 18:25
我继续问问题相信有朋友帮助的>
#define MAX_CONTROLDATA_SIZE 8 typedef struct _control_xfer { DEVICE_REQUEST DeviceRequest; unsigned short wLength; unsigned short wCount; unsigned char * pData; unsigned char dataBuffer[MAX_CONTROLDATA_SIZE]; } CONTROL_XFER; STEP的包中为什么define MAX_CONTROLDATA_SIZE=8,难道说标准请求是8个字节,端口的缓冲区标准是16个决定的吗?我不敢确定问了? |
|
|