问一个片选的问题

jackydi 2015-04-28 08:29:13
p1021子卡,LOCAL BUS总线上外挂了一个设备。然后对分配给这个设备的地址进行读操作时,一个读操作会同时产生多次片选信号,读取的数据也不对,这是怎么回事?可能是什么问题呢?

系统是VxWorks 6.9,子卡 freescale p1021.
...全文
560 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiwusuoyou2008 2015-05-21
  • 打赏
  • 举报
回复
有可能是uboot下设置了这个地址空间映射在其他片选或者MMU里面映射和vxworks重复映射了,检查下!
jackydi 2015-05-21
  • 打赏
  • 举报
回复
引用 7 楼 yiwusuoyou2008 的回复:
有可能是uboot下设置了这个地址空间映射在其他片选或者MMU里面映射和vxworks重复映射了,检查下!
在我修改地址映射之前,我在shell下使用d命令查看AC491_BASE_ADDR这个地址,显示访问了非法地址,应该可以确定这个地址在u-boot中没有被映射吧? 但我设置地址映射后再使用d命令查看这个地址就可以读取数据,但是读取的数据应该是错误的,片选信号也有多次。
jackydi 2015-05-19
  • 打赏
  • 举报
回复
引用 3 楼 liyongjun1124 的回复:
片选位宽没有对应
应该不是这个问题,如果光是读取的话,应该不用考虑是多少位的。如果没有其他问题的话,先不管读到的数据是否正确,至少每次读取的数据应该是一样的,但现在每次读一个地址的数据都可能不一样。所以这个原因的可能性比较小。
jackydi 2015-05-19
  • 打赏
  • 举报
回复
引用 1 楼 zhenghn2010 的回复:
不了解这个接口是啥洋的,操作逻辑是砂样的。有的可能需要特定命令几次操作才能完成的。 如果是普通内存地址访问方式,依次片选就能完成。
使用一个片选引脚3连接到这个设备上,数据读写是通过HPI接口方式完成的。这个连接方式是硬件设计人员从其他子卡上抄过来的,在其他子卡上可以正常读写,使用普通内存访问方式也可以获取正确的数据(就是读取HPIC寄存器的值)。但是在p1021子卡上就不行了,p1021子卡是通过U-BOOT启动后再引导VxWorks的,地址空间和片选在u-boot阶段就初始化完成了,我想在VxWorks中重新添加一个片选和地址空间,按照4楼的修改方式修改后,读取数据的时候就这样了。
jackydi 2015-05-19
  • 打赏
  • 举报
回复
引用 2 楼 puniaoren119 的回复:
所谓的的片选信号其实就是高位地址线,看看地址空间分配对不对吧,有没有可能读到地址空间以外的地方去了
我估计可能是这个问题,但是修改了地址空间分配以后还是有这个问题,下面是我修改的方法,不知道是否正确,还需要修改哪个地方? 下面是我修改的地方: 在p1021mds.h文件中添加如下宏定义: #define AC491_BASE_ADDR 0xf9000000 #define AC491_SIZE 0x10000 在sysLib.c文件中: 修改sysPhysMemDesc数组,添加如下内容, { (VIRT_ADDR) AC491_BASE_ADDR, (PHYS_ADDR) AC491_BASE_ADDR, AC491_SIZE, VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | \ VM_STATE_MASK_GUARDED, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT | \ VM_STATE_GUARDED }, 在sysHwInit()函数中的mmuE500TlbStaticInit(sysStaticTlbDescNumEnt, &sysStaticTlbDesc[0], TRUE); 语句之后添加如下内容, * (VINT32 *) M85XX_LAWBAR6(CCSBAR) = (AC491_BASE_ADDR>>12) & LAWBAR_MASK; * (VINT32 *) M85XX_LAWAR6(CCSBAR) = LAWAR_ENABLE | (LAWAR_TRGT_ELBC << LAWAR_TRGT_ELBC_SHIFT) | LAWAR_SIZE_64KB; WRS_ASM("isync"); * (VINT32 *) M85XX_BR3(CCSBAR) = AC491_BASE_ADDR|ELBC_BR_Valid|ELBC_BR_PS_8|ELBC_BR_MSEL_GPCM; * (VINT32 *) M85XX_OR3(CCSBAR) = 0xffff09f7; WRS_ASM("isync"); 修改之后,LAW配置区的数据如下: -> d 0xffe00c00 NOTE: memory values are displayed in hexadecimal. 0xffe00c00: 0000 0000 0000 0000 0008 0000 0000 0000 *................* 0xffe00c10: 8020 001b 0000 0000 0000 0000 0000 0000 *. ..............* 0xffe00c20: 0000 0000 0000 0000 000f fc20 0000 0000 *........... ....* 0xffe00c30: 0020 000f 0000 0000 0000 0000 0000 0000 *. ..............* 0xffe00c40: 0000 0000 0000 0000 000a 0000 0000 0000 *................* 0xffe00c50: 8010 001c 0000 0000 0000 0000 0000 0000 *................* 0xffe00c60: 0000 0000 0000 0000 000f fc10 0000 0000 *................* 0xffe00c70: 8010 000f 0000 0000 0000 0000 0000 0000 *................* 0xffe00c80: 0000 0000 0000 0000 000f c000 0000 0000 *................* 0xffe00c90: 8040 0013 0000 0000 0000 0000 0000 0000 *.@..............* 0xffe00ca0: 0000 0000 0000 0000 000f 8000 0000 0000 *................* 0xffe00cb0: 8040 0011 0000 0000 0000 0000 0000 0000 *.@..............* 0xffe00cc0: 0000 0000 0000 0000 000f 9000 0000 0000 *................* 0xffe00cd0: 8040 000f 0000 0000 0000 0000 0000 0000 *.@..............* 0xffe00ce0: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 0xffe00cf0: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 修改之后的BANK寄存器内容: -> d 0xffe05000 NOTE: memory values are displayed in hexadecimal. 0xffe05000: fc00 0c21 fff8 0396 f800 0801 ffff 89f7 *...!............* 0xffe05010: f801 0801 ffff 09f7 f900 0801 ffff 09f7 *................* 0xffe05020: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 0xffe05030: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 修改之前的BANK寄存器内容是: -> d 0xffe05000 NOTE: memory values are displayed in hexadecimal. 0xffe05000: fc00 0c21 fff8 0396 f800 0801 ffff 89f7 *...!............* 0xffe05010: f801 0801 ffff 09f7 f802 0801 ffff 09f7 *................* /* 这个地址不可读,应该是在u-boot中配置的 */ 0xffe05020: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 0xffe05030: 0000 0000 0000 0000 0000 0000 0000 0000 *................* 读取0xf9000000地址的数据如下,这个数据应该是错误的,因为每次读取的时候,数据都可能会变化: -> d 0xf9000000 NOTE: memory values are displayed in hexadecimal. 0xf9000000: e6e6 0000 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf9000010: e6e6 e6e6 e6e6 e6e6 2626 e6e6 e6e6 e6e6 *........&&......* 0xf9000020: e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 0000 e6e6 *................* 0xf9000030: e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf9000040: 2666 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *&f..............* 0xf9000050: e6e6 e6e6 e6e6 0026 e6e6 e6e6 e6e6 e6e6 *.......&........* 0xf9000060: e6e6 e6e6 e6e6 e6e6 e6e6 0006 e6e6 e6e6 *................* 0xf9000070: e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf9000080: e6e6 e6e6 0000 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf9000090: e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf90000a0: e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 e600 *................* 0xf90000b0: e6e6 e6e6 0000 e6e6 e6e6 e6e6 e6e6 e6e6 *................* 0xf90000c0: e600 2666 e6e6 e6e6 e6e6 e6e6 e6e6 e6e6 *..&f............*
liyongjun1124 2015-05-08
  • 打赏
  • 举报
回复
片选位宽没有对应
puniaoren119 2015-04-30
  • 打赏
  • 举报
回复
所谓的的片选信号其实就是高位地址线,看看地址空间分配对不对吧,有没有可能读到地址空间以外的地方去了
zhenghn2010 2015-04-29
  • 打赏
  • 举报
回复
不了解这个接口是啥洋的,操作逻辑是砂样的。有的可能需要特定命令几次操作才能完成的。 如果是普通内存地址访问方式,依次片选就能完成。

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧