用的arm芯片是stm32h743,arm侧驱动程序如下:void MX_FMC_Init(void){
GPIO_InitTypeDef GPIO_Initure;
FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
FMC_MPU_Config(); //使能MPU保护FPGA区域
SRAM_Handler.Instance=FMC_NORSRAM_DEVICE; //BANK1
SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;
SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1; //使用NE1
SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //不复用数据线
SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM; //SRAM
SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_8; //8位数据宽度
SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到
SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS; //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE; //存储器写使能
SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE; //等待使能位,此处未用到
SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE; //读写使用不同的时序
SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE; //禁止突发写
SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
SRAM_Handler.Init.WriteFifo=FMC_WRITE_FIFO_ENABLE;
SRAM_Handler.Init.PageSize=FMC_PAGE_SIZE_NONE;
/*FMC使用的HCLK3,主频200MHz,1个FMC时钟周期就是5ns*/
//FSMC读时序控制寄存器
FSMC_ReadWriteTim.AddressSetupTime=0x08; //地址建立时间(ADDSET 0~15)为15个HCLK 5ns*15=85ns
FSMC_ReadWriteTim.AddressHoldTime=0x02; //地址保持时间(ADDHOLD 1~15)为15个HCLK 5ns*5=25ns
FSMC_ReadWriteTim.DataSetupTime=0x15; //数据建立时间(DATASET 1~256)为85个HCLK 5ns*85=425ns
FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A
//FSMC写时序控制寄存器
FSMC_WriteTim.AddressSetupTime=0x08; //地址建立时间(ADDSET 0~15)为15个HCLK 5x15=85ns
FSMC_WriteTim.AddressHoldTime=0x02; //地址保持时间(ADDHOLD 1~15)为15个HCLK 5ns*5=25ns
FSMC_WriteTim.DataSetupTime=0x15; //数据保存时间(DATASET 1~256)为21个HCLK 5*21=105ns
FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A
HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);
delay_ms(50); // delay 50 ms
}
fpga使用的是altera的EP4CGX50F484。
arm中测试程序如下:
static void Fill_Buffer(u8 *pBuffer, u32 uwBufferLength, u16 uwOffset)
{
u16 tmpIndex = 0;
/* Put in global buffer different values */
for (tmpIndex = 0; tmpIndex < uwBufferLength; tmpIndex++)
{
pBuffer[tmpIndex] = tmpIndex + uwOffset;
}
}
__IO uint32_t FMC_SRAM_Test(void)
{
uint32_t uwIndex = 0;
__IO uint32_t uwWriteReadStatus = 0;
u8 aTxBuffer[BUFFER_SIZE];
u8 aRxBuffer[BUFFER_SIZE];
// vu8 i=0;
// vu8 temp=0;
// for(i=0;i<100;i++)
// {
// *(vu8*)(0x60000000+i)=temp;
// temp++;
// }
//
// vu8 temp1[32];
// for(i=0;i<32;i++)
// {
// temp1 = *(vu8*)(0x60000000+i);
// }
Fill_Buffer(aTxBuffer, BUFFER_SIZE, 0x0000);
/* Write data to the SRAM memory */
for(uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
*(__IO uint8_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR + 1 * uwIndex) = aTxBuffer[uwIndex];
}
/* Read back data from the SRAM memory */
for(uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
aRxBuffer[uwIndex] = *(__IO uint8_t *)(SRAM_BANK_ADDR + WRITE_READ_ADDR + 1 * uwIndex);
}
/*##-3- Checking data integrity ############################################*/
//uwWriteReadStatus = Buffercmp(aTxBuffer, aRxBuffer, BUFFER_SIZE);
return uwWriteReadStatus;
},其中BUFFER_SIZE为0x18,写地址从60000000开始,读地址从60000800开始,
在signaltap中抓取读写波形:
问题是,写的时候第0x17个数据跑到了读地址60000800,好像后移了一个数据时钟,目前找不到是啥原因出现的这个问题?
|