OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 411|回复: 6

原子例程中,DM9000地址的问题

[复制链接]

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-8-3
在线时间
49 小时
发表于 2018-3-13 15:02:15 | 显示全部楼层 |阅读模式
2金钱
最近在学STM32与DM9000的内容(用FSMC),看到原子战舰V3的例程里,对于DM9000地址的定义是如下

//DM9000地址结构体
typedef struct
{
        vu16 REG;
        vu16 DATA;
}DM9000_TypeDef;

//使用NOR/SRAM的 Bank1.sector2,地址位HADDR[27,26]=01 A7作为数据命令区分线
//注意设置时STM32内部会右移一位对其!                             
#define DM9000_BASE        ((u32)(0x64000000|0x000000FE))
#define DM9000             ((DM9000_TypeDef *) DM9000_BASE)

我不明白的的是,为什么要地址0x64000000要|上0x000000FE,我明白A7作为数据命令区分线接到DM9000的CMD上,CMD通过置1/0来区别数据还是命令,那这样命令地址(CMD=0) 0x64000000,数据地址(CMD=1)不是直接0x64000080来表示为数据地址就行吗?

最佳答案

查看完整内容[请看2#楼]

可以直接用0X64000000和0X64000080来表示CMD0 和CMD1。同样也可以用0x64000000|0x000000FE来表示,结果都是一样的。都是控制CMD为0或1。
回复

使用道具 举报

  离线 

74

主题

6644

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
13286
金钱
13286
注册时间
2013-11-13
在线时间
1566 小时
发表于 2018-3-13 15:02:16 | 显示全部楼层
可以直接用0X64000000和0X64000080来表示CMD0 和CMD1。同样也可以用0x64000000|0x000000FE来表示,结果都是一样的。都是控制CMD为0或1。
回复

使用道具 举报

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-8-3
在线时间
49 小时
 楼主| 发表于 2018-3-13 16:56:14 | 显示全部楼层
zuozhongkai 发表于 2018-3-13 16:41
可以直接用0X64000000和0X64000080来表示CMD0 和CMD1。同样也可以用0x64000000|0x000000FE来表示,结果都是 ...

0x64000000|0x000000FE含义是什么,一直搞不懂。。。我明白CMD接的脚1、0是判断数据和命令,但是不明白这里为什么是FE(1111 1110)
回复

使用道具 举报

  离线 

74

主题

6644

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
13286
金钱
13286
注册时间
2013-11-13
在线时间
1566 小时
发表于 2018-3-13 18:05:50 | 显示全部楼层
277522260 发表于 2018-3-13 16:56
0x64000000|0x000000FE含义是什么,一直搞不懂。。。我明白CMD接的脚1、0是判断数据和命令,但是不明白这 ...

看结构体!DM9000是DM9000_TypeDef类型的,地址是0X64000000|0X000000FE=0X640000FE。那么就相当于REG=0X640000FE,那么DATA就定于0X640000FE+2=0X64000100。比较REG和DATA的bit8是不是一个是0,一个是1!
开往春天的手扶拖拉机
回复

使用道具 举报

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-8-3
在线时间
49 小时
 楼主| 发表于 2018-3-14 10:57:26 | 显示全部楼层
zuozhongkai 发表于 2018-3-13 18:05
看结构体!DM9000是DM9000_TypeDef类型的,地址是0X64000000|0X000000FE=0X640000FE。那么就相当于REG=0X ...

也就是说,FE仅仅是在结构体这种模式下,为了能够满足+2使得传输数据地址为0x64000100 而得出的FE是吧?
回复

使用道具 举报

  离线 

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-8-3
在线时间
49 小时
 楼主| 发表于 2018-3-14 11:11:42 | 显示全部楼层
zuozhongkai 发表于 2018-3-13 18:05
看结构体!DM9000是DM9000_TypeDef类型的,地址是0X64000000|0X000000FE=0X640000FE。那么就相当于REG=0X ...

再请假下,我的实际接线是FSMC_19、20接到139译码器的A0/A1,NE3接139片选。DM9000的CMD接在A2。这样我自己算出的DM9000地址是0x68200000H,数据地址是0X68200008。我想利用原子的结构体例程,这样要算结构体地址的话,我直接用68200008-2得出来吗?
回复

使用道具 举报

  离线 

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2015-8-13
在线时间
17 小时
发表于 2018-4-24 10:16:46 | 显示全部楼层
本帖最后由 照海倚天 于 2018-4-24 10:18 编辑

想必楼主早就明白了  一开始看到也是很晕 现在感觉明白了 把自己程序中的备注写一下 希望能给遇到这个问题的人一些提示
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=01  其中A7作为数据与命令区分线(DM9000A数据命令选择,高数据,低命令)
//注意设置时STM32内部会右移一位对其!                             
#define DM9000_BASE        ((u32)(0x6C000000|0x000000FE))
//640000FE   1100100000000000000000011111110    A7 为 0(即 CMD=0)
//64000100   1100100000000000000000100000000    A7 为 1(即 CMD=1)
//当A6作为数据地址区分线时
//A7的偏移量为0X000000FE  FE:1111 1110
//A6的偏移量为0X0000007E  7E:0111 1110
//7E 转换成二进制就是:1111110,而16位数据时,地址右移一位对齐,
//那么实际对应到地址引脚的时候,就是:A6:A0=0111111,此时A6是0
//,但是如果 16 位地址再加 1(注意:对应到8位地址是加2,即 7E+0X02),那么:A6:A0=1000000,
//此时 A6 就是 1 了,即实现了对 RS 的 0 和 1 的控制。
//按照此原则本系统中用的为A2  则加一后应为  A2-A0:100  减一为011  右补零后为0110 则其值为06
//验证A7 加一后A7-A0:为1000 0000   减一后为0111 1111 右补0后为 1111 1110 故为FE


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

必看,必学:"原子哥”力荐上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-9-19 07:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */