野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12448|回复: 2

关于指南针LCD屏调试串口出错,ILI9341连接串口发送命令 和接收的错误

[复制链接]
发表于 2019-11-9 13:56:33 | 显示全部楼层 |阅读模式
#include "bsp_ili9341_lcd.h"

/******* 初始化ILI9341 的 IO 引脚 ***********/


static uint16_t CurrentTextColor   = BLACK;//前景色
static uint16_t CurrentBackColor = WHITE;//背景色

uint16_t LCD_X_LENGTH = ILI9341_LESS_PIXEL;
uint16_t LCD_Y_LENGTH = ILI9341_MORE_PIXEL;

static __inline void ILI9341_FillColor ( uint32_t ulAmout_Point,uint16_t usColor );


// 串口ILI9341的GPIO初始化
static void ILI9341_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        // 使能FSMC 的时钟
        RCC_APB2PeriphClockCmd(ILI9341_RES_CLK|ILI9341_CS_CLK|ILI9341_RS_CLK|ILI9341_WE_CLK|
        ILI9341_BK_CLK|ILI9341_RD_CLK|ILI9341_D0_CLK|ILI9341_D1_CLK|ILI9341_D2_CLK|ILI9341_D3_CLK|
        ILI9341_D4_CLK|ILI9341_D5_CLK|ILI9341_D6_CLK|ILI9341_D7_CLK|ILI9341_D8_CLK|ILI9341_D9_CLK|
        ILI9341_D10_CLK|ILI9341_D11_CLK|ILI9341_D12_CLK|ILI9341_D13_CLK|ILI9341_D14_CLK|ILI9341_D15_CLK,ENABLE);
       
       
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        // 配置FSMC 的相应数据线
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Pin = ILI9341_D0_PIN;
  GPIO_Init ( ILI9341_D0_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D1_PIN;
  GPIO_Init ( ILI9341_D1_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D2_PIN;
  GPIO_Init ( ILI9341_D2_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D2_PIN;
  GPIO_Init ( ILI9341_D2_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D3_PIN;
  GPIO_Init ( ILI9341_D3_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D4_PIN;
  GPIO_Init ( ILI9341_D4_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D5_PIN;
  GPIO_Init ( ILI9341_D5_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D6_PIN;
  GPIO_Init ( ILI9341_D6_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D7_PIN;
  GPIO_Init ( ILI9341_D7_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D8_PIN;
  GPIO_Init ( ILI9341_D8_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D9_PIN;
  GPIO_Init ( ILI9341_D9_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D10_PIN;
  GPIO_Init ( ILI9341_D10_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D11_PIN;
  GPIO_Init ( ILI9341_D11_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D12_PIN;
  GPIO_Init ( ILI9341_D12_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D13_PIN;
  GPIO_Init ( ILI9341_D13_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D14_PIN;
  GPIO_Init ( ILI9341_D14_PORT, & GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_D15_PIN;
  GPIO_Init ( ILI9341_D15_PORT, & GPIO_InitStructure );
       
        // 配置FSMC 相应的控制线
       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Pin = ILI9341_RD_PIN;
        GPIO_Init (ILI9341_RD_PORT, &GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_WE_PIN;
        GPIO_Init (ILI9341_WE_PORT, &GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_RS_PIN;
        GPIO_Init (ILI9341_RS_PORT, &GPIO_InitStructure );
       
        GPIO_InitStructure.GPIO_Pin = ILI9341_CS_PIN;
        GPIO_Init (ILI9341_CS_PORT, &GPIO_InitStructure );
       
        // LCD 背光灯
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

        GPIO_InitStructure.GPIO_Pin = ILI9341_BK_PIN;
        GPIO_Init (ILI9341_BK_PORT, &GPIO_InitStructure );
       
        // LCD 复位引脚配置
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = ILI9341_RES_PIN;
        GPIO_Init (ILI9341_RES_PORT, &GPIO_InitStructure );
}       


// ILI9341 FSMC的配置

static void ILI9341_FSMC_Config ( void )
{
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;        
       
        /* 使能FSMC时钟*/
        RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );

        //地址建立时间(ADDSET)为1个HCLK 2/72M=28ns
        readWriteTiming.FSMC_AddressSetupTime      = 0x01;         //地址建立时间
        //数据保持时间(DATAST)+ 1个HCLK = 5/72M=70ns       
        readWriteTiming.FSMC_DataSetupTime         = 0x04;         //数据建立时间
        //选择控制的模式
        //模式B,异步NOR FLASH模式,与ILI9341的8080时序匹配
        readWriteTiming.FSMC_AccessMode            = FSMC_AccessMode_B;       
       
        /*以下配置与模式B无关*/
        //地址保持时间(ADDHLD)模式A未用到
        readWriteTiming.FSMC_AddressHoldTime       = 0x00;         //地址保持时间
        //设置总线转换周期,仅用于复用模式的NOR操作
        readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
        //设置时钟分频,仅用于同步类型的存储器
        readWriteTiming.FSMC_CLKDivision           = 0x00;
        //数据保持时间,仅用于同步型的NOR       
        readWriteTiming.FSMC_DataLatency           = 0x00;       

       
        FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_BANK_NORSRAM;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_NOR;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;
        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_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &readWriteTiming;  
       
        FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure );
       
       
        /* 使能 FSMC_Bank1_NORSRAM4 */
        FSMC_NORSRAMCmd ( FSMC_BANK_NORSRAM, ENABLE );                 
}

// ILI9341_LCD屏背光灯

void ILI9341_BackLed_Control ( FunctionalState enumState )
{
        if ( enumState )
                GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );       
        else
                GPIO_SetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
               
}

//  LCD 复位引脚
void LCD_Reset(void)
{
        GPIO_ResetBits(ILI9341_RES_PORT,ILI9341_RES_PIN);
        ILI9341_Delay(0xAFF);
        GPIO_SetBits(ILI9341_RES_PORT,ILI9341_RES_PIN);
        ILI9341_Delay(0xAFF);
}
// 和视频一样使用内联函数编写写命令,和写数据

// 写命令
__inline void ILI9341_Write_Cmd(uint16_t usCmd)
{
        * ( __IO uint16_t * ) ( FSMC_ILI9341_CMD_ADDR ) = usCmd;
       
}

// 写数据
__inline void ILI9341_Write_Data(uint16_t usData)
{
        * ( __IO uint16_t * ) ( FSMC_ILI9341_DATA_ADDR ) = usData;
       
}
// 读数据
__inline uint16_t ILI9341_Read_Data(void)
{
        return (*FSMC_ILI9341_DATA_ADDR);
}


// 初始化ILI9341寄存器
static void ILI9341_REG_Config ( void )
{
        /*  Power control B (CFh)  */
        DEBUG_DELAY  ();
        ILI9341_Write_Cmd ( 0xCF  );
        ILI9341_Write_Data ( 0x00  );
        ILI9341_Write_Data ( 0x81  );
        ILI9341_Write_Data ( 0x30  );
       
        /*  Power on sequence control (EDh) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xED );
        ILI9341_Write_Data ( 0x64 );
        ILI9341_Write_Data ( 0x03 );
        ILI9341_Write_Data ( 0x12 );
        ILI9341_Write_Data ( 0x81 );
       
        /*  Driver timing control A (E8h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xE8 );
        ILI9341_Write_Data ( 0x85 );
        ILI9341_Write_Data ( 0x10 );
        ILI9341_Write_Data ( 0x78 );
       
        /*  Power control A (CBh) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xCB );
        ILI9341_Write_Data ( 0x39 );
        ILI9341_Write_Data ( 0x2C );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x34 );
        ILI9341_Write_Data ( 0x02 );
       
        /* Pump ratio control (F7h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xF7 );
        ILI9341_Write_Data ( 0x20 );
       
        /* Driver timing control B */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xEA );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x00 );
       
        /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xB1 );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x1B );
       
        /*  Display Function Control (B6h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xB6 );
        ILI9341_Write_Data ( 0x0A );
        ILI9341_Write_Data ( 0xA2 );
       
        /* Power Control 1 (C0h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xC0 );
        ILI9341_Write_Data ( 0x35 );
       
        /* Power Control 2 (C1h) */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0xC1 );
        ILI9341_Write_Data ( 0x11 );
       
        /* VCOM Control 1 (C5h) */
        ILI9341_Write_Cmd ( 0xC5 );
        ILI9341_Write_Data ( 0x45 );
        ILI9341_Write_Data ( 0x45 );
       
        /*  VCOM Control 2 (C7h)  */
        ILI9341_Write_Cmd ( 0xC7 );
        ILI9341_Write_Data ( 0xA2 );
       
        /* Enable 3G (F2h) */
        ILI9341_Write_Cmd ( 0xF2 );
        ILI9341_Write_Data ( 0x00 );
       
        /* Gamma Set (26h) */
        ILI9341_Write_Cmd ( 0x26 );
        ILI9341_Write_Data ( 0x01 );
        DEBUG_DELAY ();
       
        /* Positive Gamma Correction */
        ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma
        ILI9341_Write_Data ( 0x0F );
        ILI9341_Write_Data ( 0x26 );
        ILI9341_Write_Data ( 0x24 );
        ILI9341_Write_Data ( 0x0B );
        ILI9341_Write_Data ( 0x0E );
        ILI9341_Write_Data ( 0x09 );
        ILI9341_Write_Data ( 0x54 );
        ILI9341_Write_Data ( 0xA8 );
        ILI9341_Write_Data ( 0x46 );
        ILI9341_Write_Data ( 0x0C );
        ILI9341_Write_Data ( 0x17 );
        ILI9341_Write_Data ( 0x09 );
        ILI9341_Write_Data ( 0x0F );
        ILI9341_Write_Data ( 0x07 );
        ILI9341_Write_Data ( 0x00 );
       
        /* Negative Gamma Correction (E1h) */
        ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x19 );
        ILI9341_Write_Data ( 0x1B );
        ILI9341_Write_Data ( 0x04 );
        ILI9341_Write_Data ( 0x10 );
        ILI9341_Write_Data ( 0x07 );
        ILI9341_Write_Data ( 0x2A );
        ILI9341_Write_Data ( 0x47 );
        ILI9341_Write_Data ( 0x39 );
        ILI9341_Write_Data ( 0x03 );
        ILI9341_Write_Data ( 0x06 );
        ILI9341_Write_Data ( 0x06 );
        ILI9341_Write_Data ( 0x30 );
        ILI9341_Write_Data ( 0x38 );
        ILI9341_Write_Data ( 0x0F );
       
        /* memory access control set */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0x36 );        
        ILI9341_Write_Data ( 0xC8 );    /*竖屏  左上角到 (起点)到右下角 (终点)扫描方式*/
        DEBUG_DELAY ();
       
        /* column address control set */
        ILI9341_Write_Cmd ( CMD_SetCoordinateX );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0xEF );
       
        /* page address control set */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( CMD_SetCoordinateY );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x00 );
        ILI9341_Write_Data ( 0x01 );
        ILI9341_Write_Data ( 0x3F );
       
        /*  Pixel Format Set (3Ah)  */
        DEBUG_DELAY ();
        ILI9341_Write_Cmd ( 0x3a );
        ILI9341_Write_Data ( 0x55 );
       
        /* Sleep Out (11h)  */
        ILI9341_Write_Cmd ( 0x11 );       
        ILI9341_Delay ( 0xAFFf<<2 );
        DEBUG_DELAY ();
       
        /* Display ON (29h) */
        ILI9341_Write_Cmd ( 0x29 );
}

// ILI9341的初始化
void ILI9341_Init(void)
{
        ILI9341_GPIO_Config();
        ILI9341_FSMC_Config();
        ILI9341_BackLed_Control(ENABLE);                         // 点亮LED背光灯
        LCD_Reset();
        ILI9341_REG_Config();
}
// 读像素点函数
uint16_t Read_Pixel_Format(void)
{
        ILI9341_Write_Cmd(CMD_SetPixel);
        ILI9341_Read_Data();
        return ILI9341_Read_Data();
}

当将这些函数再main函数里面调用并执行的时候通过串=串口调试,打印的记过不正确
我也和视频刚开始老师配置完并执行的时候没有对LCD屏进行复位,错误结果一样(就是我传入CMD_SetPixel)
然后进行数据的读取,但是读取的结果是我传入(CMD_SetPixel) ,我进行了LCD的复位并执行也还是没有解决



回复

使用道具 举报

发表于 2019-11-10 00:00:57 | 显示全部楼层
是不是这两个函数的问题:
那个  FSMC_ILI9341_CMD_ADDR  和 FSMC_ILI9341_DATA_ADDR  在例程序中定义的是常量,在讲座中是定义成一个指针的

这两个函数里都是把 FSMC_ILI9341_CMD_ADDR  和 FSMC_ILI9341_DATA_ADDR   当作常量使用的。

// 写命令
__inline void ILI9341_Write_Cmd(uint16_t usCmd)
{
        * ( __IO uint16_t * ) ( FSMC_ILI9341_CMD_ADDR ) = usCmd;
        
}


// 写数据
__inline void ILI9341_Write_Data(uint16_t usData)
{
        * ( __IO uint16_t * ) ( FSMC_ILI9341_DATA_ADDR ) = usData;
        
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-11 17:16:52 | 显示全部楼层
不是,是我将命令和数据的地址写反了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-27 12:07 , Processed in 0.032489 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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