阅读:1629回复:8
在阅读D12固件代码时的问题,请交流
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包吗?还是在数据传输过程中发送呢? |
|
沙发#
发布于:2004-02-26 09:00
先回答第一个问题吧!outportb(D12_COMMAND, 0xFB)这句话怎么理解呢,实际上看看其实质,就相当于movx 0xff03,0xfb,把0xfb输出到单片机的片外ram里,但是单片机执行这句指令要有两个输出,首先是p0口输出地址位低位,然后是p2口输出地址位高位,由于你的d12是与p0口相连,所以d12开始得到的是0x03,由于d12得到的是一个奇数,它认为下面将有一个命令要从单片机里发送过来,而假如得到的是一个偶数,就认为下面有数据要从单片机里发送,这步执行完了,单片机就开始发送0xfb了,d12就接受了,因为开始它接受的是一个奇数地址,它认为0xfb是一个命令,于是就处理了!
不知对不? |
|
板凳#
发布于:2004-02-26 09:13
看看芯片资料
有这个命令的具体介绍的 |
|
|
地板#
发布于:2004-02-26 09:28
1 大家请看这个函数: 1ms发送一次SOF包,表示频率是1HZ ?????????????????????????? 应该是1000Hz吧! 实际上,它是把芯片的命令端口(或称命令码或称命令寄存器)作为单片机的一个RAM地址,把数据端口作为单片机的另一个RAM地址。而单片机在读写RAM数据的时候会发出ALE信号和RD、WR信号,中间有WR或RD信号隔开,当然不会冲掉数据。 建议多看看单片机资料。8051单片机的书我看了不下十本,共看了不下100遍,每看一遍我都有不同的收获。 |
|
|
地下室#
发布于: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口的信号,不知道这样理解对不对? |
|
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只有两个端口:数据和命令。但每个端口都是流端口。想象一下串口吧!你可以不停地写数据进去,另一端可以不停地接受,只要处理速度足够!这就是流的概念。 |
|
|
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上面的绝大多数外设都采用这种方式。基本上都是占用的都是:地址空间+中断号 这样的资源了。 |
|
|
7楼#
发布于:2004-02-26 16:32
由于d12得到的是一个奇数,它认为下面将有一个命令要从单片机里发送过来,而假如得到的是一个偶数,就认为下面有数据要从单片机里发送
请问,这个是在1。1协议上看到的吗? 在D12的DATASHEET上看到的吗? 我找不到:)气我也 |
|
8楼#
发布于:2004-02-26 17:34
是这样的意思的,不用找 了,没有的
但是枚举成功后,修改那个地址值是这样的结果 所以D12就是有这样的性能而已,不要钻牛角会更方便的 |
|
|