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.

[参考译文] AM3874:页面模式只读取它应该读取的数据的一半。

Guru**** 1567975 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1123859/am3874-page-mode-only-reading-half-of-the-data-it-is-supposed-to

器件型号:AM3874

首先、《手册》中有关页面模式的引述:  

"图11-26显示了非多路复用器件上的异步多路读取操作、 其中对 GPMC 的两个字32主机读取访问被拆分为对所连接器件的一个多字(页模式4字16)读取访问。"  

链接: https://www.ti.com/lit/ug/sprugz7e/sprugz7e.pdf?ts=1655806231947&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FAM3874 (第 11.2.4.10.3.3章)

 

问题摘要:  

当我们打开非多路复用器件的异步多路读取页面模式时、我们接收到两个16位字、而不是四个字。 我们无法读取最后两个。  

 

我们的寄存器设置如下:  

GPMC_CS_CONFIG1:GPMC_CONFIG1_READMULTIPLE_SUPPORD | GPMC_CONFIG1_DEVICETYPE_NOR | GPMC_CONFIG1_DEVICSIZE  

GPMC_CS_CONFIG2:GPMC_CFG2_CSWROFFTIME (5)| GPMC_CFG2_CSRDOFFTIME (5)| GPMC_CFG2_CSONTIME (0)  

GPMC_CS_CONFIG3:零  

GPMC_CS_CONFIG4:GPMC_CFG4_WEOFFTIME (5)| GPMC_CFG4_WEONTIME (0)| GPMC_CFG4_OEOFFTIME (5)| GPMC_CFG4_OEONTIME (0)  

GPMC_CS_CONFIG5:GPMC_CFG5_PAGEBURSTACESSTIME (1)| GPMC_CFG5_RDACCESSTIME (4)| GPMC_CFG5_WRCYCLETIME (5)| GPMC_CFG5_RDCYCLETIME (5)  

GPMC_CS_CONFIG6:GPMC_CFG6_WRACCESSTIME (5)| GPMC_CFG6_CYCLE2CYCLEDELAY (5)| GPMC_CFG6_CYCLE2CYCLESAMECSEN | GPMC_CFG6_CYCLE2CYCLEDIFFCSEN | GPMC_CFG6_CYCLEANTRFCSEN (5)  

 

从项目的 FPGA 侧:  

信号 test_data:std_logic_vector (15下载到0):= x"1137";  

(笑声)  

如果(SIG_GPMC_NCS ="0"且 SIG_GPMC_NRE ="0"且 SIG_GPMC_Nwe ="1"且 SIG_gmpc_a (7下调至0)= double_word_REG)、则如此  

 

SIG_ST态<= ST_READ_DOUBLE_WORD_REG;  

sig_control_reg <= sig_control_reg;  

sig_GPMC_d_in <= test_data_mod;  

test_data_mod <= std_logic_vector (to_unsigned (to_integer (unsigned (test_data_mod))+ 1、16));  

 

因此、基本上寄存器 double_word_REG 在每个 clk 周期中都有增量值、从1137开始。  

 

我们的 C 语言阅读器:  

#define GPMC 0x1000000  

#define GPMC_SIZE 0x1F000000  

#define iterations 1000000  

(笑声)  

//所有寄存器  

struct mainboard_fpga_t{  

 uint32_t revision_reg;  

 uint32_t control_status_reg;  

 uint32_t GTP_rxstatus_reg;  

 uint32_t GTP_rxfifo_empty_reg;  

 uint32_t GTP_rxfifo_full_reg;  

 uint32_t GTP_txstatus_reg;  

 uint32_t GTP_txfifo_empty_reg;  

 uint32_t GTP_txfifo_full_reg;  

 uint32_t GTP_rxfifo_count_regs[8];  

 uint32_t GTP_Fifo_data_regs[8];  

 uint32_t GTP_broadcast_data_reg;  

 uint32_t test_reg;         这是 double_word_REG  

 uint32_t test_reg2;  

 uint32_t test_reg3;  

 uint32_t test_reg4;  

 uint32_t test_reg5;  

};  

…μ A  

int main (int argc、char ** argv){  

int fd;  

volatile uint32_t * GPMC_ptr;  

volatile struct mainboard_fpga_t *s;  

 

fd =开路("/dev/mem"、O_RDWR | O_SYNC);  

 (笑声)   

GPMC_PTR =(volatile uint32_t*) mmap (0、GPMC_SIZE、PROT_READ | PROT_WRITE、MAP_SHARED、FD、 GPMC);  

   (笑声)  

   S=(volatile struct mainboard_fpga_t*) GPMC_ptr;  

(笑声)  

   printf ("0x%08x\n"、s->test_reg);  

  printf ("0x%08x\n"、s->GTP_broadcast_data_reg);  

   printf ("0x%08x\n"、s->test_reg2);  

   printf ("0x%08x\n"、s->test_reg3);  

 

结果:  

11381137.  

00000000  

00000000  

00000000  

问题:在示波器上、我们读取了6个周期、这意味着我们读取的是两个字。 我们如何读取四个? 如何在 C 语言中调用两个32位读数以强制读取4个字?  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Krzysztof、

    是否可以尝试使用64位数据类型进行读取?
           uint64_t pDst =(uint64_t)&pDstBuff;

    或者、使用 DMA 读取4个字(64位)。

    您是否只需要读取4个字的页面模式? 我希望异步写入不支持页面模式。

    此致、
    标记