|
最近在做一个ARM与FPGA通讯的项目,使用ARM的FMC(SRAM方式)与FPGA收发数据,遇到一个问题:用#define ADDR 0x6000001B 定义的地址,使用FMC间接读ADDE地址数据时,读出的数据一直是0;但直接用FMC读地址数据时读出的FPGA数据正常,已试着修改C语法、加入MPU配置,禁止cache着手,问题现象仍存在,请教硬汉哥有什么好的解决方法?谢谢
1.问题描述:
/* FMC地址 */
#define WRITE_FPGA(Addr,Data) *((volatile unsigned short int *)(0x60000000 + (Addr<< 1))) = Data
#define READ_FPGA(Addr) *((volatile unsigned short int *)(0x60000000 + (Addr << 1)))
#define RD_LCD_COMMAND READ_FPGA(27)
2.问题现象:
中断100us读一次FMC数据。
使用"Data=READ_FPGA(RD_LCD_COMMAND)"这样读FMC(FPGA)数据时,一直是0.
使用"Data=READ_FPGA(27)"这样读FMC(FPGA)数据时,数据正常.
请教大神, 这个跟FMC什么有关呢?
3.代码:
void FMC_SRAM_Init(void)
{
FMC_NORSRAM_TimingTypeDef Timing = {0};
HsRam1.Instance = FMC_NORSRAM_DEVICE;
HsRam1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
HsRam1.Init.NSBank = FMC_NORSRAM_BANK1; //使用NE1
HsRam1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; //地址/数据线不复用
HsRam1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM; //SRAM
HsRam1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16; //位数据宽度
HsRam1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到
HsRam1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW; //等待信号的极性,仅在突发模式访问下有用
HsRam1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
HsRam1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; //存储器写使能
HsRam1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE; //等待使能位,此处未用到
HsRam1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; //读写使用不同的时序
HsRam1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE; //是否使能同步传输模式下的等待信号,此处未用到
HsRam1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE; //禁止突发写
HsRam1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
HsRam1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
HsRam1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* FSMC初始化 */
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 15;
Timing.BusTurnAroundDuration = 15;
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FMC_ACCESS_MODE_A;
if (HAL_SRAM_Init(&HsRam1, &Timing, NULL) != HAL_OK)
{
Error_Handler( );
}
}
void mpu_memory_protection(void)
{
mpu_set_protection( 0x60000000, /* 基地址 */
MPU_REGION_SIZE_64MB, /* 长度 */
MPU_REGION_NUMBER1, 0, /* NUMER5,允许指令访问 */
MPU_REGION_FULL_ACCESS, /* 全访问 */
MPU_ACCESS_SHAREABLE, /* 禁止共用 */
MPU_ACCESS_NOT_CACHEABLE, /* 禁止cache */
MPU_ACCESS_BUFFERABLE); /* 禁止缓冲 */
}
|
|