首先、《手册》中有关页面模式的引述:
"图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个字?