新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2023-5-3
- 在线时间
- 2 小时
|
用的是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) //将8552的ID转换成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); //读取ID高8位
lcddev.id = LCD_RD_DATA(); //读回0X55
lcddev.id <<= 8;
LCD_WR_REG(0xC501); //读取ID低8位
lcddev.id |= LCD_RD_DATA(); //读回0X10
HAL_Delay(5); //兼容1963驱动
if (lcddev.id == 0x8000)lcddev.id = 0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为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读回的ID是5761H,为方便区分,我们强制设置为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的问题。
|
|