STM32
直播中

苏国英

6年用户 7经验值
私信 关注
[问答]

调试STM32H750的FMC总线读写PSRAM遇到的问题求解?

最近调试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信号

NE2.jpg

NE1.jpg

回帖(1)

siyugege

2024-5-8 17:44:27
根据您提供的信息,您在使用STM32H750的FMC总线与FPGA通信时遇到了问题。NE1通道可以正常读写,但NE2通道无法正常写数据。您已经尝试了使用HAL库和寄存器配置,但问题仍未解决。以下是一些建议,希望能帮助您解决问题:

1. 检查硬件连接:首先,请确保NE2通道的硬件连接正确无误。检查FPGA与STM32之间的数据线、地址线和控制线是否连接正确。

2. 检查NE2通道的配置:请确保NE2通道的配置与NE1通道相同。这包括地址、数据线、控制线等的配置。

3. 检查时钟配置:确保FMC时钟配置正确。您已经启用了FMC时钟,但请检查时钟频率是否符合PSRAM的要求。

4. 检查GPIO配置:请确保NE2通道的GPIO配置正确。您已经设置了GPIOC的PIN8,但请检查其他相关GPIO的配置是否正确。

5. 检查初始化代码:请检查SRAM_init函数中的代码,确保NE2通道的初始化代码与NE1通道相同。

6. 检查数据传输代码:请检查数据传输过程中的代码,确保NE2通道的数据传输逻辑与NE1通道相同。

7. 使用调试工具:如果可能的话,使用调试工具(如ST-LINK)逐步执行代码,观察NE2通道的寄存器值和变量值,以便找到问题所在。

8. 检查FPGA端:请检查FPGA端的逻辑,确保NE2通道的逻辑与NE1通道相同,且没有其他问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分