lhj_83
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1629回复:8

在阅读D12固件代码时的问题,请交流

楼主#
更多 发布于:2004-02-25 21:35
1 大家请看这个函数:
/*模式设置*/
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;

outportb(D12_COMMAND, 0xF3);//设置模式
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);

if(bEPPflags.bits.in_isr == 0)
ENABLE;
}

这里,#define D12_DATA 0xff02,D12_DATA 是单片机的扩展ROM地址,将bConfig送到单片机的0xff02处,这样就做了D12的配置吗?D12怎么取得这个配置的呢?两个语句outportb(D12_DATA, bConfig); outportb(D12_DATA, bClkDiv);写到一起,前一个数据不被后一个数据给冲掉吗?D12能立即取走吗?

2 有这么一句:“USB主机会每隔1ms在USB总线上产生一个SOF的USB帧同步信号,SOF数据包包含了这个脉冲序列的实际内容(图2),它由SOF格式的PID字段、帧数量字段和5bit的CRC校验码组成。主机利用SOF数据包来同步数据的传送和接收。”
1ms发送一次SOF包,表示频率是1HZ,而USB的频率至少是1.5M,怎么能起到同步作用呢?是在SETUP的时候才发SOF包吗?还是在数据传输过程中发送呢?

whmjack
驱动小牛
驱动小牛
  • 注册日期2003-09-17
  • 最后登录2007-04-26
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望29点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-26 09:00
先回答第一个问题吧!outportb(D12_COMMAND, 0xFB)这句话怎么理解呢,实际上看看其实质,就相当于movx 0xff03,0xfb,把0xfb输出到单片机的片外ram里,但是单片机执行这句指令要有两个输出,首先是p0口输出地址位低位,然后是p2口输出地址位高位,由于你的d12是与p0口相连,所以d12开始得到的是0x03,由于d12得到的是一个奇数,它认为下面将有一个命令要从单片机里发送过来,而假如得到的是一个偶数,就认为下面有数据要从单片机里发送,这步执行完了,单片机就开始发送0xfb了,d12就接受了,因为开始它接受的是一个奇数地址,它认为0xfb是一个命令,于是就处理了!
不知对不?
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2004-02-26 09:13
看看芯片资料
有这个命令的具体介绍的
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
dragon_hn
驱动中牛
驱动中牛
  • 注册日期2002-05-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分297分
  • 威望40点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-26 09:28
1 大家请看这个函数:
/*模式设置*/
void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv)
{
if(bEPPflags.bits.in_isr == 0)
DISABLE;

outportb(D12_COMMAND, 0xF3);//设置模式
outportb(D12_DATA, bConfig);
outportb(D12_DATA, bClkDiv);

if(bEPPflags.bits.in_isr == 0)
ENABLE;
}

这里,#define D12_DATA 0xff02,D12_DATA 是单片机的扩展ROM地址,将bConfig送到单片机的0xff02处,这样就做了D12的配置吗?D12怎么取得这个配置的呢?两个语句outportb(D12_DATA, bConfig); outportb(D12_DATA, bClkDiv);写到一起,前一个数据不被后一个数据给冲掉吗?D12能立即取走吗?

2 有这么一句:“USB主机会每隔1ms在USB总线上产生一个SOF的USB帧同步信号,SOF数据包包含了这个脉冲序列的实际内容(图2),它由SOF格式的PID字段、帧数量字段和5bit的CRC校验码组成。主机利用SOF数据包来同步数据的传送和接收。”
1ms发送一次SOF包,表示频率是1HZ,而USB的频率至少是1.5M,怎么能起到同步作用呢?是在SETUP的时候才发SOF包吗?还是在数据传输过程中发送呢?

 


1ms发送一次SOF包,表示频率是1HZ ??????????????????????????
应该是1000Hz吧!

实际上,它是把芯片的命令端口(或称命令码或称命令寄存器)作为单片机的一个RAM地址,把数据端口作为单片机的另一个RAM地址。而单片机在读写RAM数据的时候会发出ALE信号和RD、WR信号,中间有WR或RD信号隔开,当然不会冲掉数据。
建议多看看单片机资料。8051单片机的书我看了不下十本,共看了不下100遍,每看一遍我都有不同的收获。
www.dragon-2008.com 欢迎交流
lhj_83
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-26 10:08
同意whmjack的说法,因为D12只和89C52的P0接,P2口没有用,故只用了片内的8K,ALE根本没有用……是不是这样说也对:

outportb(D12_COMMAND, 0xF3);//设置模式

D12_COMMAND=0xff13h,只要后面的是奇数,就表示下一个数据是命令?

另外,感觉dragon_hn的说法有问题,既然89c52用的只是片内的8K,没有其他扩展,那么ff03已经不在存储范围之内,根本不是“把芯片的命令端口(或称命令码或称命令寄存器)作为单片机的一个RAM地址,把数据端口作为单片机的另一个RAM地址。”

这里只是使用了一个大于8K的地址,来提取P0口的信号,不知道这样理解对不对?
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-26 15:59
问题一之回答:
51系列单片机与外围设备有多种接口方式:
1。存储器接口:用于RAM,ROM,EEROM,FLASH,以及拥有存储器接口的外围芯片;
2。IO接口:主要用于比较特殊的不一定符合规范的芯片,如三极管,74系列逻辑芯片等;
3。串行接口:UART,SPI,I2C等,其中除了UART,其他可能要用固件实现-相当于IO接口的扩展功能。

Philips很喜欢存储器接口方式,它的D12以及Mifare系列芯片都是这样的接口。
对于存储器接口,51的P0是地址和数据复用的(multiplex)。这就使得你得利用ALE完成地址锁存。例如你接外部RAM时,需要用到74LS573之类的东西,就是要做这件事情。但是D12内部集成了锁存器,你可以理解为它片内包含了573。所以你给它ALE就可以了。当然它也支持不用ALE,而是使用A0来完成。

至于你提到的冲掉了数据之类的说法,则完全是一种误解。虽然D12只有两个端口:数据和命令。但每个端口都是流端口。想象一下串口吧!你可以不停地写数据进去,另一端可以不停地接受,只要处理速度足够!这就是流的概念。
A strong man can save himself. A great man can save another.
zmwk
驱动中牛
驱动中牛
  • 注册日期2001-05-15
  • 最后登录2009-04-05
  • 粉丝0
  • 关注0
  • 积分59分
  • 威望51点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-26 16:31
回答问题之二:
首先,1Hz应该说是1kHz,1ms也是目前PC Windows操作系统的基本时间片。我想建议你看一看OSI的网络七层定义。应该说你说的1ms与USB的bit时钟不是一回事,也就是说不在一层上面。关于USB的基本协议,可以去看一看书,这里只举一个常见的例子:

我们人类发声的频率一般在200-4000Hz.
但是,假如两个人在对话,则两个人通话转换的频率就低得多:可能一分钟才几次。相当于0.0几Hz.
为什么会这样呢? 语音是底层协议,它被封装成了一句一句的话(相当于一帧一帧的数据),这时就会使得帧速率变低,且需要同步了。
道理非常简单,多想想,多看看,也就是那么一回事了。
USB在1ms之上还有更高层的协议封装,你开发USB实际上就是对它的更进一步封装。
另:关于问题一:内存映射设备是一种非常常见的外设方式。PC上面的绝大多数外设都采用这种方式。基本上都是占用的都是:地址空间+中断号 这样的资源了。
A strong man can save himself. A great man can save another.
lhj_83
驱动牛犊
驱动牛犊
  • 注册日期2003-02-21
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-26 16:32
由于d12得到的是一个奇数,它认为下面将有一个命令要从单片机里发送过来,而假如得到的是一个偶数,就认为下面有数据要从单片机里发送

请问,这个是在1。1协议上看到的吗? 在D12的DATASHEET上看到的吗?

我找不到:)气我也
yyouking
驱动老牛
驱动老牛
  • 注册日期2003-12-18
  • 最后登录2020-04-28
  • 粉丝0
  • 关注0
  • 积分967分
  • 威望114点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-02-26 17:34
是这样的意思的,不用找 了,没有的
但是枚举成功后,修改那个地址值是这样的结果
所以D12就是有这样的性能而已,不要钻牛角会更方便的
提供: AT89S52+D12开发套件 W78E54+Sl811HST单片机读写U盘套件 PL2303HX-串口转USB 网站http://www.devking.cn 联系 sl811hs@yahoo.com.cn QQ:14441292
游客

返回顶部