关于TFTLCD读取问题

2019-07-20 18:11发布

我想使用FSMC来实现ILI9341 LCD的驱动,代码如下,存在的问题是读取不到数据,我使用的是地址线A0作为指令/数据线,然后参考了原子的代码,将相应的位置修改到我的硬件连接(代码见第二部分[mw_shl_code=applescript,true]GPIO_InitTypeDef  GPIO_InitStructure;
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
        FSMC_NORSRAMTimingInitTypeDef  writeTiming;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟  
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟  
       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PB15 推挽输出,控制背光
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 //PB15 推挽输出,控制背光
       
  GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  
       
  GPIO_InitStructure.GPIO_Pin = (0X1FF<<7);//PE7~15,AF OUT
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PF12,FSMC_A6
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化  

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//PF12,FSMC_A6
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

  GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);//PE7,AF12
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12

  GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//PF12,AF12
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC);


  readWriteTiming.FSMC_AddressSetupTime = 0XF;         //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns       
  readWriteTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(ADDHLD)模式A未用到       
  readWriteTiming.FSMC_DataSetupTime = 60;                        //数据保存时间为60个HCLK        =6*60=360ns
  readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  readWriteTiming.FSMC_CLKDivision = 0x00;
  readWriteTiming.FSMC_DataLatency = 0x00;
  readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A
   

        writeTiming.FSMC_AddressSetupTime =9;              //地址建立时间(ADDSET)为9个HCLK =54ns
  writeTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(A               
  writeTiming.FSMC_DataSetupTime = 8;                 //数据保存时间为6ns*9个HCLK=54ns
  writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  writeTiming.FSMC_CLKDivision = 0x00;
  writeTiming.FSMC_DataLatency = 0x00;
  writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A


  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //  存储器写使能
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // 使能BANK1 [/mw_shl_code]),只能读取到0x4141,但是把硬件调整到匹配原子的代码,读取时没有问题的,麻烦指导一下,具体问题出在哪里。先谢谢了
[mw_shl_code=applescript,true]//FSMC SRAM类型存储器初始化结构体
        FSMC_NORSRAMInitTypeDef                FSMC_NORSRAMInitStructure;
       
        //FSMC 时序初始化结构
        FSMC_NORSRAMTimingInitTypeDef                pw,pr;
       
        //GPIO 定义
        /*
        *                FSMC_D0:                                PD14
        *                FSMC_D1:                                PD15
        *                FSMC_D2:                                PD0
        *                FSMC_D3:                                PD1
        *                FSMC_D4:                                PE7
        *                FSMC_D5:                                PE8
        *                FSMC_D6:                                PE9
        *                FSMC_D7:                                PE10
        *                FSMC_D8:                                PE11
        *                FSMC_D9:                                PE12
        *                FSMC_D10:                                PE13
        *                FSMC_D11:                                PE14
        *                FSMC_D12:                                PE15
        *                FSMC_D13:                                PD8
        *                FSMC_D14:                                PD9
        *                FSMC_D15:                                PD10
        *
        *                FSMC_NOE:                                PD4                                LCD_RD
        *                FSMC_NWE:                                PD5                                LCD_RW
        *                FSMC_NE1:                                PG12                        LCD_CS
        *                FSMC_A0:                                PF12                        LCD_RS
        *                                                                                PF1                                LCD_BACKLIGHT
        */
        //GPIO初始化结构体
        GPIO_InitTypeDef  GPIO_InitStructure;
        //时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF, ENABLE);
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);                                                //使能FSMC时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                                                                        //PF0:命令数据控制线
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                                        //输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                                //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                       
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                                                        //内部上拉
       
  GPIO_Init(GPIOF, &GPIO_InitStructure);                                                                                                //初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                                                                        //PF1 推挽输出,控制背光
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                                                                        //输出模式
       
        GPIO_Init(GPIOF, &GPIO_InitStructure);                                                                                                //初始化
       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 |
                                                                                                                                GPIO_Pin_10 | GPIO_Pin_11 |
                                                                                                                                GPIO_Pin_12 | GPIO_Pin_13 |
                                                                                                                                GPIO_Pin_14 | GPIO_Pin_15;                        //PF0:命令数据控制线;PF1 推挽输出,控制背光
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                                        //复用输出模式
       
        GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                                                //初始化
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |
                                                                                                                                GPIO_Pin_4 | GPIO_Pin_5 |
                                                                                                                                GPIO_Pin_7 | GPIO_Pin_8 |
                                                                                                                                GPIO_Pin_9 | GPIO_Pin_10 |
                                                                                                                                GPIO_Pin_14 | GPIO_Pin_15;                        //PF0:命令数据控制线;PF1 推挽输出,控制背光
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                                        //输出模式
       
        GPIO_Init(GPIOD, &GPIO_InitStructure);                                                                                                //初始化
        //复用功能映射
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);

  GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FSMC);
       
        pw.FSMC_AddressSetupTime                                        =                0x09;                                                                                //地址建立时间
        pw.FSMC_AddressHoldTime                                                =                0x00;                                                                                //地址保持时间
        pw.FSMC_DataSetupTime                                                        =                0x08;                                                                                //数据建立时间
        pw.FSMC_BusTurnAroundDuration                        =                0x00;                                                                                //总线恢复时间
        pw.FSMC_CLKDivision                                                                =                0x00;                                                                                //时钟分频
        pw.FSMC_DataLatency                                                                =                0x00;                                                                                //数据保持时间
        pw.FSMC_AccessMode                                                                =                FSMC_AccessMode_A;                        //模式
       
        pr.FSMC_AddressSetupTime                                        =                0x0f;                                                                                //地址建立时间
        pr.FSMC_AddressHoldTime                                                =                0x00;                                                                                //地址保持时间
        pr.FSMC_DataSetupTime                                                        =                0x3c;                                                                                //数据建立时间
        pr.FSMC_BusTurnAroundDuration                        =                0x00;                                                                                //总线恢复时间
        pr.FSMC_CLKDivision                                                                =                0x00;                                                                                //时钟分频
        pr.FSMC_DataLatency                                                                =                0x00;                                                                                //数据保持时间
        pr.FSMC_AccessMode                                                                =                FSMC_AccessMode_A;                        //模式
       
        FSMC_NORSRAMInitStructure.FSMC_Bank                                                                                                                =                        FSMC_Bank1_NORSRAM1;                                                                                                                        //选择NOR/SRAM所在的块1
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux                                                                        =                        FSMC_DataAddressMux_Disable;                                                                                        //数据线与地址线不复用
        FSMC_NORSRAMInitStructure.FSMC_MemoryType                                                                                        =                        FSMC_MemoryType_SRAM;                                                                                                                        //存储器类型选择NOR FLASH
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth                                                                =                        FSMC_MemoryDataWidth_16b;                                                                                                        //数据总线宽度为16bit
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode                                                                =                        FSMC_BurstAccessMode_Disable;                                                                                        //使用异步写入模式
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity                                                        =                        FSMC_WaitSignalPolarity_Low;                //只在突发模式下有效
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait                                                                =                        FSMC_AsynchronousWait_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WrapMode                                                                                                =                        FSMC_WrapMode_Disable;                                                                                                                //禁止非对齐突发模式
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive                                                                =                        FSMC_WaitSignalActive_BeforeWaitState;                                                //只在突发模式下有效
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal                                                                                        =                        FSMC_WaitSignal_Disable;                                                                                                        //只在突发模式下有效
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst                                                                                        =                        FSMC_WriteBurst_Disable;                                                                                                        //禁止突发写操作
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation                                                                        =                        FSMC_WriteOperation_Enable;                                                                                                //使能写操作
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode                                                                                =                        FSMC_ExtendedMode_Enable;                                                                                                //禁止扩展操作
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct                                        =                        &#8826;                                                                                                                                                                                                //配置读写时序
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct                                                        =                        &pw;                                                                                                                                                                                                //配置写时序
       
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);                                                                        //初始化FSMC
       
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);                                                                        //使能FSMC块1[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。