This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于am335x的gpmc总线8位、16位、32位访问的问题

这两天试验用gpmc总线扩展外设,采用地址、数据复用,异步单次访问的模式。总线位宽使用8位还是16位方式还没最终确定,做了如下试验:
把总线配为16位访问方式,当调用iowrite16和ioread16读写16位数据时能正确读写。当用ioread32时它被拆成2次16位访问,这应该是如TRM里所描述的,用iowrite32时发现它被拆分成4次8位访问,为什么不是2次16位访问?是哪个寄存器没正确配置吗?时序如下图,从fpga的sigaltap抓取

16位总线 iowrite32(0x50403020, ...) 的图

把总线配置为8位访问方式,调用ioread8和iowrite8读写8位数据时能正确读写。当用ioread16产生了两次8位读,当用iowrite32时,它被拆成4次8位访问,数据从第到高输出4个字节,这应该是符合TRM描述的,当iowrite16时,它被拆成2次8位访问,但两次输出的都是高8位的数据,低8位的数据没有出现在总线上,是哪个寄存器没正确配置吗?时序如下图,从fpga的sigaltap抓取

8位总线  iowrite16(0x3020, ...) 的图

8位总线   iowrite32(0x50403020, ...) 的图
  • 你这里说道的配置为16位,或者是8位访问模式是指把GPMC_CONIFG1的13-12位,也就是DEVICESIZE这个bit配置为16或者8吗?

  • 是的

    8位时config1 = 0x610200

    16位时config1 = 0x611200

  •  在配置为8位的时候,也就是说只有GPMC_AD0~GPMC_AD7是作为数据总线来输出的,高8位data是没有使能的。所以为啥会期待高8位的数据出来呢?

    这个配置就决定了你的data line的bit width,并非是说只是决定了访问模式是8位,但是实际上是16位的宽度。

  • 你好,刘工!

            我的问题不是在配置为8位的时候,期待从GPMC_AD8~GPMC_AD15输出高8位。

    TRM 7.1.3.3.8.2.2 Access Size Adaptation and Device Width

    ......System requests with data width greater than the external device data bus width are split into successive accesses according to both the external device data-bus width and little-endian data organization.

            对于上面这句话我的试验中产生了一些疑问。

            我贴的第一张图是设置为16位总线时的情况。一次iowrite32向总线写入一个32位的数据,被拆成了4次8位写操作,而不是2次16位写操作,这是什么原因?

            我贴的第二张和第三张图是设置为8位总线时的情况。第二张图和第三张图的config1~config7的配置是一样的没改过。

            在第二张图里,一次iowrite16向总线写一个16位的数据,被拆成2次8位写操作,但连续输出两次高字节,低字节不被输出。根据TRM我的理解它应该先一次8位写操作输出低字节,再一次8位访问输出高字节(当然是也在AD0~AD7输出),请问 这是什么原因?

            在第三张图里,一次iowrite32向总线写入一个32位的数据,被拆成4次8位写操作,按顺序由低字节到高字节输出数据(都是在AD0~AD7输出)。第三张图里看到的符合我对TRM里那段话的理解,应该是正确的输出。