liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1597回复:14

周功D12讨论区

楼主#
更多 发布于:2004-03-22 10:22
我是一个新手谁对周功的熟讨论讨论.
我问第一个问题: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地址.和如何理解这一句.
什么也不懂
tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-22 10:53
后面7位是主机给设备分配的地址,最高位1,好像是确认有效吧,
具体你再查看d12的datasheet
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-22 11:02
那最初的初始化地址是0了吗?以后我好象知道是计算机分配地址给USB吗?
如果理解是MCU分配给外围器件的一个地址.我这样理解对吗?
什么也不懂
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-03-22 12:44
是的 ,计算机发送设置地址命令给D12,MCU处理这个命令的时候把这个值写入D12的地址寄存器中
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
lsn_061
驱动老牛
驱动老牛
  • 注册日期2002-05-09
  • 最后登录2006-10-06
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望261点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-22 13:01
这些都是固件里的程序吧,在主机usb驱动程序里面用的是哪个函数实现发送的功能的?能否说明,楼上??谢谢
[img]http://bbs.zndev.com/image/medal/5.gif[/img]
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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就可以了.谁能解释一下.
什么也不懂
lsn_061
驱动老牛
驱动老牛
  • 注册日期2002-05-09
  • 最后登录2006-10-06
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望261点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-03-22 15:49
是这样的,因为中断控制器是四个字节的寄存器,所以先读出高位,再读低位,让后在把他们合起来,明白了么?
[img]http://bbs.zndev.com/image/medal/5.gif[/img]
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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 到那里了。或说如何解释
什么也不懂
songqian
驱动牛犊
驱动牛犊
  • 注册日期2004-03-10
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-03-22 17:02
|=ox80是和16进制数80进行或操作,并将所的值赋给原变量!!

[编辑 -  3/22/04 by  songqian]
sirenfox
驱动牛犊
驱动牛犊
  • 注册日期2004-02-13
  • 最后登录2004-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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就可以了.谁能解释一下.
lsn_061
驱动老牛
驱动老牛
  • 注册日期2002-05-09
  • 最后登录2006-10-06
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望261点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-22 17:08
因为当前的缓冲区为空,所以返回零到  unsigned char * buf
中了,好像是,我是这么理解的
[img]http://bbs.zndev.com/image/medal/5.gif[/img]
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-03-23 13:24
我再问一个问题:
在控制端点处理程序中有如下几句:
"举一个主机请求的例子:GET DESCRIPOR() 的标准设备请求.
当USB器件D12收到的建立包,将产生一个中断通知MCU,MCU响应中断,通过读D12中断寄存器决定是发到控制端点还是普通端点,如果发向控制端点,MCU需要通过读D12最后处理状态寄存器进一步确定数据是否是一个建立包,第一个包必须是建立包"
我不懂的是主机是指的PC吗?标准设备请求只是PC请求D12吗?
标准设备请求达到什么目的?
什么也不懂
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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 出错.
什么也不懂
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-03-23 17:49
上面的问题我理解为是PC 的请求和标准请求的8个字节比较.不对就出错是吗?如何没有人回答呀!郁闷呀!
什么也不懂
liyousen701118
驱动牛犊
驱动牛犊
  • 注册日期2003-12-09
  • 最后登录2013-05-30
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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个决定的吗?我不敢确定问了?
什么也不懂
游客

返回顶部