OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2735|回复: 3

H750开发板FMC读取LCD返回00

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-5-3
在线时间
2 小时
发表于 2023-6-25 23:59:00 | 显示全部楼层 |阅读模式
用的是cubemx,但是测试过直接复制例程的FMC配置代码,效果还是一样,甚至不给我点反应。虽然用示波器测试D0有波动,但是记录到的就是0x0000。


FMC配置是这样的
hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_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;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 0x15;
Timing.BusTurnAroundDuration = 15;
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */
ExtTiming.AddressSetupTime = 15;
ExtTiming.AddressHoldTime = 15;
ExtTiming.DataSetupTime = 0x15;
ExtTiming.BusTurnAroundDuration = 15;
ExtTiming.CLKDivision = 16;
ExtTiming.DataLatency = 17;
ExtTiming.AccessMode = FMC_ACCESS_MODE_A;



读取ID代码是这样的
LCD_WR_REG(0XD3);
HAL_Delay(1);
lcddev.id = LCD_RD_DATA();    //dummy read
lcddev.id = LCD_RD_DATA();    //读到0X00
lcddev.id = LCD_RD_DATA();    //读取93
lcddev.id <<= 8;
lcddev.id |= LCD_RD_DATA();    //读取41
if (lcddev.id != 0X9341)        //9341,尝试看看是不是NT35310
{
    LCD_WR_REG(0X04);
    lcddev.id = LCD_RD_DATA();      //dummy read
    lcddev.id = LCD_RD_DATA();      //读到0X85
    lcddev.id = LCD_RD_DATA();      //读取0X85
    lcddev.id <<= 8;
    lcddev.id |= LCD_RD_DATA();     //读取0X52

    if (lcddev.id == 0X8552)        //8552ID转换成7789
    {
        lcddev.id = 0x7789;
    }

    if (lcddev.id != 0x7789)        //也不是ST7789, 尝试是不是 NT35310
    {
        LCD_WR_REG(0XD4);
        lcddev.id = LCD_RD_DATA();//dummy read
        lcddev.id = LCD_RD_DATA();//读回0X01
        lcddev.id = LCD_RD_DATA();//读回0X53
        lcddev.id <<= 8;
        lcddev.id |= LCD_RD_DATA();    //这里读回0X10
        if (lcddev.id != 0X5310)        //也不是NT35310,尝试看看是不是NT35510
        {
            //发送秘钥(厂家提供,照搬即可)
            LCD_WriteReg(0xF000, 0x0055);
            LCD_WriteReg(0xF001, 0x00AA);
            LCD_WriteReg(0xF002, 0x0052);
            LCD_WriteReg(0xF003, 0x0008);
            LCD_WriteReg(0xF004, 0x0001);

            LCD_WR_REG(0xC500);             //读取ID8
            lcddev.id = LCD_RD_DATA();      //读回0X55
            lcddev.id <<= 8;

            LCD_WR_REG(0xC501);             //读取ID8
            lcddev.id |= LCD_RD_DATA();     //读回0X10
            HAL_Delay(5);           //兼容1963驱动

            if (lcddev.id == 0x8000)lcddev.id = 0x5510;//NT35510读回的ID8000H,为方便区分,我们强制设置为5510
            if (lcddev.id != 0X5510)            //也不是NT5510,尝试看看是不是SSD1963
            {
                LCD_WR_REG(0XA1);
                lcddev.id = LCD_RD_DATA();
                lcddev.id = LCD_RD_DATA();    //读回0X57
                lcddev.id <<= 8;
                lcddev.id |= LCD_RD_DATA();    //读回0X61
                if (lcddev.id == 0X5761)lcddev.id = 0X1963;//SSD1963读回的ID5761H,为方便区分,我们强制设置为1963
            }
        }
    }
}



读写寄存器代码是这样的,没有修改过例程中的内容。
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(volatile uint16_t regval) {
    regval = regval;        //使用-O2优化的时候,必须插入的延时
    LCD->LCD_REG = regval;//写入要写的寄存器序号
}

//LCD数据
//data:要写入的值
void LCD_WR_DATA(volatile uint16_t data) {
    data = data;            //使用-O2优化的时候,必须插入的延时
    LCD->LCD_RAM = data;
}

//LCD数据
//返回值:读到的值
uint16_t LCD_RD_DATA(void) {
    volatile uint16_t ram;            //防止被优化
    ram = LCD->LCD_RAM;
    return ram;
}

//写寄存器
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) {
    LCD->LCD_REG = LCD_Reg;        //写入要写的寄存器序号
    LCD->LCD_RAM = LCD_RegValue;//写入数据
}



测试过调整FMC频率到20M,但是依旧没有效果。
CPU没有开启缓存。
main函数中还使用了SDRAM,也是通过FMC,初始化顺序是先SDRAM后LCD。

不知道有没有大神知道怎么处理这种id只能读取到0x0000的问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-5-3
在线时间
2 小时
 楼主| 发表于 2023-6-26 00:08:08 | 显示全部楼层
还使用了一个在之前的开发板上测试过可以使用的lcd库,依旧是不能读取到任何数据。
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10565
金钱
10565
注册时间
2017-2-18
在线时间
1913 小时
发表于 2023-6-27 23:59:02 | 显示全部楼层
帮顶~~
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-5-3
在线时间
2 小时
 楼主| 发表于 2023-7-7 23:17:57 | 显示全部楼层
问题已经解决了,但是还是没有定位到问题在哪里,后面我启用了内存保护,把FMC加入保护就可以了。
可能是H750的特性吧,之后会记得把要用到的内存都加入保护的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表