最近调试STM32H750的FMC总线与FPGA通信的时候发现了一个问题,使用NE1和FPGA通信可以正常读写,而NE2通道却不能正常写数据,使用示波器观察发现NE2的波形有问题,但是查看代码又看不出来哪里有问题,使用了hal库和寄存器配置都不能解决,有没有大神帮小弟一把,不胜感激。
数据位D0-D15
地址为 A16-23
代码配置如下
void SRAM_init(void)
{
RCC->AHB4ENR |= 2 << 1; //使能C
RCC->AHB4ENR |= 3 << 3; //使能PD,PE
RCC->AHB3ENR |= 1 << 12; //使能FMC时钟
GPIO_Set(GPIOC, PIN8, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_HIGH, GPIO_PUPD_PU); //C8
GPIO_Set(GPIOD, (0xFFB3), GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_HIGH, GPIO_PUPD_PU); //PD0,1,4,5,7,8,9,10,11,12,13,14,15 AF OUT
GPIO_Set(GPIOE, (0XFFFC), GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_HIGH, GPIO_PUPD_PU); //PE7~15,AF OUT
GPIO_AF_Set(GPIOD, 0, 12); //PD0,AF12 D2
GPIO_AF_Set(GPIOD, 1, 12); //PD1,AF12 D3
GPIO_AF_Set(GPIOD, 4, 12); //PD4,AF12 NOE
GPIO_AF_Set(GPIOD, 5, 12); //PD5,AF12 NWE
GPIO_AF_Set(GPIOD, 7, 12); //PD7,AF12 NE1
GPIO_AF_Set(GPIOD, 8, 12); //PD8,AF12 D13
GPIO_AF_Set(GPIOD, 9, 12); //PD9,AF12 D14
GPIO_AF_Set(GPIOD, 10, 12); //PD10,AF12 D15
GPIO_AF_Set(GPIOD, 11, 12); //PD13,AF12 A16
GPIO_AF_Set(GPIOD, 12, 12); //PD13,AF12 A17
GPIO_AF_Set(GPIOD, 13, 12); //PD13,AF12 A18
GPIO_AF_Set(GPIOD, 14, 12); //PD14,AF12 D0
GPIO_AF_Set(GPIOD, 15, 12); //PD15,AF12 D1
GPIO_AF_Set(GPIOE, 2, 12); //PE7,AF12 A23
GPIO_AF_Set(GPIOE, 3, 12); //PE8,AF12 A19
GPIO_AF_Set(GPIOE, 4, 12); //PE9,AF12 A20
GPIO_AF_Set(GPIOE, 5, 12); //PE10,AF12 A21
GPIO_AF_Set(GPIOE, 6, 12); //PE11,AF12 A22
GPIO_AF_Set(GPIOE, 7, 12); //PE7,AF12 D4
GPIO_AF_Set(GPIOE, 8, 12); //PE8,AF12 D5
GPIO_AF_Set(GPIOE, 9, 12); //PE9,AF12 D5
GPIO_AF_Set(GPIOE, 10, 12); //PE10,AF12 D7
GPIO_AF_Set(GPIOE, 11, 12); //PE11,AF12 D8
GPIO_AF_Set(GPIOE, 12, 12); //PE12,AF12 D9
GPIO_AF_Set(GPIOE, 13, 12); //PE13,AF12 D10
GPIO_AF_Set(GPIOE, 14, 12); //PE14,AF12 D11
GPIO_AF_Set(GPIOE, 15, 12); //PE15,AF12 D12
GPIO_AF_Set(GPIOC, 8, 9); //PE15,AF12 D12
//fmc_ker_ck来自pll2_r_ck=220Mhz
//寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE1 ,也就对应BTCR[0],[1]。
FMC_Bank1->BTCR[0] = 0X00000000;
FMC_Bank1->BTCR[1] = 0X00000000;
FMC_Bank1E->BWTR[0] = 0X00000000;
//操作BCR寄存器 使用异步模式
FMC_Bank1->BTCR[0] |= 1 << 12; //存储器写使能
FMC_Bank1->BTCR[0] |= 1 << 14; //读写使用不同的时序
FMC_Bank1->BTCR[0] |= 1 << 4; //存储器数据宽度为16bit
//操作BTR寄存器
//读时序控制寄存器
FMC_Bank1->BTCR[1] |= 0 << 28; //模式A
FMC_Bank1->BTCR[1] |= 4 << 0; //地址建立时间(ADDSET)为15个fmc_ker_ck 1/220M=4.5ns*15=67.5ns
//因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。
FMC_Bank1->BTCR[1] |= 16 << 8; //数据保存时间(DATAST)为78个fmc_ker_ck=4.5*78=351ns
//写时序控制寄存器
FMC_Bank1E->BWTR[0] |= 0 << 28; //模式A
FMC_Bank1E->BWTR[0] |= 4 << 0; //地址建立时间(ADDSET)为15个fmc_ker_ck=67.5ns
//15个fmc_ker_ck(fmc_ker_ck=220Mhz),某些液晶驱动IC的写信号脉宽,最少也得50ns。
FMC_Bank1E->BWTR[0] |= 16 << 8; //数据保存时间(DATAST)为15个fmc_ker_ck=67.5ns
//使能BANK1,区域1
FMC_Bank1->BTCR[0] |= 1 << 0; //使能BANK1,区域1
// FMC_Bank1->BTCR[0] |= (u32)1 << 31; //使能FMC
delay_us(10);
//这里我们使用NE1 ,也就对应BTCR[0],[1]。
FMC_Bank1->BTCR[2] = 0X00000000;
FMC_Bank1->BTCR[3] = 0X00000000;
FMC_Bank1E->BWTR[2] = 0X00000000;
// FMC_Bank1->BTCR[2]= FMC_Bank1->BTCR[0];
// FMC_Bank1->BTCR[3] = FMC_Bank1->BTCR[1];
// FMC_Bank1E->BWTR[2] = FMC_Bank1E->BWTR[0];
//操作BCR寄存器 使用异步模式
FMC_Bank1->BTCR[2] |= 1 << 12; //存储器写使能
FMC_Bank1->BTCR[2] |= 1 << 14; //读写使用不同的时序
FMC_Bank1->BTCR[2] |= 1 << 4; //存储器数据宽度为16bit
//操作BTR寄存器
//读时序控制寄存器
FMC_Bank1->BTCR[3] |= 0 << 28; //模式A
FMC_Bank1->BTCR[3] |= 4 << 0; //地址建立时间(ADDSET)为15个fmc_ker_ck 1/220M=4.5ns*15=67.5ns
//因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。
FMC_Bank1->BTCR[3] |= 16 << 8; //数据保存时间(DATAST)为78个fmc_ker_ck=4.5*78=351ns
//写时序控制寄存器
FMC_Bank1E->BWTR[2] |= 0 << 28; //模式A
FMC_Bank1E->BWTR[2] |= 4 << 0; //地址建立时间(ADDSET)为15个fmc_ker_ck=67.5ns
//15个fmc_ker_ck(fmc_ker_ck=220Mhz),某些液晶驱动IC的写信号脉宽,最少也得50ns。
FMC_Bank1E->BWTR[2] |= 16 << 8; //数据保存时间(DATAST)为15个fmc_ker_ck=67.5ns
//使能BANK1,区域1
FMC_Bank1->BTCR[2] |= 1 << 0; //使能BANK1,区域1
FMC_Bank1->BTCR[0] |= (u32)1 << 31; //使能FMC
delay_ms(50); // delay 50 ms
}
//port test
#define Port_Testdata1 (( vu16) ((BASE_ADDRNE1+(0xfa<<17)))) // USB MARK DATA
#define Port_Testdata2 (( vu16) ((BASE_ADDRNE1+(0xfb<<17)))) // USB MARK DATA
#define Port_Testdata3 (( vu16) ((BASE_ADDRNE1+(0xfc<<17)))) // USB MARK DATA
#define Port_Testdata4 (( vu16) ((BASE_ADDRNE1+(0xfd<<17)))) // USB MARK DATA
#define Port_Testdata5 (( vu16) ((BASE_ADDRNE1+(0xfe<<17)))) // USB MARK DATA
#define Port_Testdata6 (( vu16) ((BASE_ADDRNE1+(0xff<<17)))) // USB MARK DATA
#define Port_Testdata21 (( vu16) ((BASE_ADDRNE2+(0xfa<<17)))) // USB MARK DATA
#define Port_Testdata22 (( vu16) ((BASE_ADDRNE2+(0xfb<<17)))) // USB MARK DATA
#define Port_Testdata23 (( vu16) ((BASE_ADDRNE2+(0xfc<<17)))) // USB MARK DATA
#define Port_Testdata24 (( vu16) ((BASE_ADDRNE2+(0xfd<<17)))) // USB MARK DATA
#define Port_Testdata25 (( vu16) ((BASE_ADDRNE2+(0xfe<<17)))) // USB MARK DATA
#define Port_Testdata26 (( vu16) ((BASE_ADDRNE2+(0xff<<17)))) // USB MARK DATA
u16 temptt[10];
#define BASE_ADDRNE1 0x60000000
#define BASE_ADDRNE2 0x64000000
#define BASE_ADDRNE3 0x68000000
#define BASE_ADDRNE4 0x6C000000
while(1)
{
// Port_Testdata4=ii;
// ii++;
// Port_Testdata5=ii;
// ii++;
// Port_Testdata6=ii;
// ii++;
Port_Testdata24=ii;
ii++;
// Port_Testdata25=ii;
// ii++;
// Port_Testdata26=0xffff;
// ii++;
delay_us(1);
// temptt[0]=Port_Testdata1;
//
// temptt[1]=Port_Testdata2;
//
// temptt[2]=Port_Testdata3;
//
// temptt[3]=Port_Testdata4;
//
// temptt[4]=Port_Testdata5;
//
// temptt[5]=Port_Testdata6;
//
// temptt[6]=Port_Testdata23;
// temptt[7]=Port_Testdata24;
// temptt[8]=Port_Testdata25;
// temptt[9]=Port_Testdata26;
}
图片如下,可以看到NE2明显不对。黄色线位NWE信号,蓝色线位NE信号
更多回帖