一、模塊來(lái)源?
采2
資料下載鏈接:
http://www.lcdwiki.com/zh/2.8inch_SPI_Module_ILI9341_SKU:MSP2807

產(chǎn)品實(shí)物展示
二、規(guī)格參數(shù)?
上方下載鏈接下載資料。
工作電壓:3.3V-5V
工作電流:90mA
模塊尺寸:50.0(H) x 86(V) MM
像素大小:320(H) x 240(V)RGB
驅(qū)動(dòng)芯片:ILI9341
通信協(xié)議:SPI
工作電流:90mA
模塊尺寸:50.0(H) x 86(V) MM
像素大?。?20(H) x 240(V)RGB
驅(qū)動(dòng)芯片:ILI9341
通信協(xié)議:SPI
三、移植過程?
我們的目標(biāo)是將例程移植至立創(chuàng)·CW32F030C8T6開發(fā)板上。按照以下步驟,即可完成移植。
將源碼導(dǎo)入工程;
根據(jù)編譯報(bào)錯(cuò)處進(jìn)行粗改;
修改引腳配置;
修改時(shí)序配置;
移植驗(yàn)證。
3.1 查看資料?
打開廠家資料例程(例程下載見例程下載)。具體路徑見下圖。

3.2 移植至工程?
將廠家資料路徑下的【LCD】、【SPI】、【TOUCH】文件夾和User文件夾下的GUI.c、GUI.h、test.c和test.h、pic.h,復(fù)制到自己的工程中。自己的工程至少需要有毫秒級(jí)延時(shí)函數(shù)。(工程可以參考空白工程下載)


打開自己的工程,將我們剛剛復(fù)制過來(lái)的文件導(dǎo)入.c和.h文件。

分別在touch.h、spi.h、gui.h 和 test.h 文件中定義三個(gè)宏,s32、u16與u8。
#include "sys.h" 替換為 #include "board.h"
#include "board.h" #ifndef u8 #define u8 uint8_t #endif #ifndef u16 #define u16 uint16_t #endif #ifndef s32 #define s32 uint32_t #endif #ifndef u32 #define u32 uint32_t #endif
將touch.c、lcd.c、GUI.c與test.c文件中的頭文件delay.h 注釋掉?。?/p>

3.3. 引腳選擇?
該屏幕需要設(shè)置14個(gè)接口,具體接口說(shuō)明見廠家資料屏幕規(guī)格書。 當(dāng)前廠家源碼使用的是軟件SPI接口,SPI時(shí)序部分廠家已經(jīng)完成,我們只需要將硬件SPI引腳時(shí)序和延時(shí)配置好即可。所以對(duì)應(yīng)接入的屏幕引腳請(qǐng)按照你的需要。這里選擇的引腳見屏幕接線。
| 屏幕 | 開發(fā)板 |
|---|---|
| GND | GND |
| --- | --- |
| VCC | 3.3V |
| SCK | PA6 |
| SDI | PA7 |
| RST | PB1 |
| DC | PB0 |
| CS | PB10 |
| LED | PA5 |
| SDO | x |
| T_CLK | PA4 |
| T_CS | PA3 |
| T_DIN | PA2 |
| T_DO | PA1 |
| T_IRQ | PA0 |
選擇好引腳后,進(jìn)入工程開始編寫屏幕引腳初始化代碼。
3.4. 端口修改?
為了方便后續(xù)移植,我在lcd.h處宏定義了每一個(gè)引腳,后續(xù)根據(jù)需要進(jìn)行修改即可。
//-----------------LCD端口移植---------------- #define RCC_LCD1_ENABLE() __RCC_GPIOA_CLK_ENABLE() #define RCC_LCD2_ENABLE() __RCC_GPIOB_CLK_ENABLE() //SCK #define PORT_LCD_SCL CW_GPIOA #define GPIO_LCD_SCL GPIO_PIN_6 //MOSI #define PORT_LCD_SDA CW_GPIOA #define GPIO_LCD_SDA GPIO_PIN_7 ////MIS0 //#define PORT_LCD_MIS GPIOB //#define GPIO_LCD_MIS GPIO_PIN_14 //NSS #define PORT_LCD_CS CW_GPIOB #define GPIO_LCD_CS GPIO_PIN_10 //DC #define PORT_LCD_DC CW_GPIOB #define GPIO_LCD_DC GPIO_PIN_0 //RES #define PORT_LCD_RES CW_GPIOB #define GPIO_LCD_RES GPIO_PIN_1 //BLK/LED #define PORT_LCD_BLK CW_GPIOA #define GPIO_LCD_BLK GPIO_PIN_5 //CS2/T_CS #define PORT_LCD_CS2 CW_GPIOA #define GPIO_LCD_CS2 GPIO_PIN_3 //PEN/T_IRQ #define PORT_LCD_PEN CW_GPIOA #define GPIO_LCD_PEN GPIO_PIN_0 //T_CLK #define PORT_LCD_TCLK CW_GPIOA #define GPIO_LCD_TCLK GPIO_PIN_4 //T_DIN #define PORT_LCD_TDIN CW_GPIOA #define GPIO_LCD_TDIN GPIO_PIN_2 //T_DO #define PORT_LCD_TD0 CW_GPIOA #define GPIO_LCD_TD0 GPIO_PIN_1
將 lcd.c 源代碼中的 void LCD_GPIOInit(void) 修改為如下代碼。
代碼中已經(jīng)做了引腳SPI的適配,如果沒有修改相關(guān)引腳,則將宏定義 USE_HARDWARE_SPI 宏 為1即可。
void LCD_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體
RCC_LCD1_ENABLE(); // 使能GPIO時(shí)鐘
RCC_LCD2_ENABLE(); // 使能GPIO時(shí)鐘
GPIO_InitStruct.Pins = GPIO_LCD_SCL| // GPIO引腳
GPIO_LCD_SDA|
GPIO_LCD_BLK;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高
GPIO_Init(PORT_LCD_SCL, &GPIO_InitStruct); // 初始化
GPIO_InitStruct.Pins = GPIO_LCD_DC|
GPIO_LCD_RES|
GPIO_LCD_CS;
GPIO_Init(PORT_LCD_CS, &GPIO_InitStruct); // 初始化
}
將lcd.h中的LCD端口定義宏,修改為:
//////////////////////////////////////////////////////////////////// //-----------------LCD端口定義---------------- //液晶控制口置1操作語(yǔ)句宏定義 #define LCD_CS_SET GPIO_WritePin(PORT_LCD_CS, GPIO_LCD_CS, GPIO_Pin_SET) #define LCD_RS_SET GPIO_WritePin(PORT_LCD_DC, GPIO_LCD_DC, GPIO_Pin_SET) #define LCD_SDA_SET GPIO_WritePin(PORT_LCD_SDA, GPIO_LCD_SDA, GPIO_Pin_SET) #define LCD_SCL_SET GPIO_WritePin(PORT_LCD_SCL, GPIO_LCD_SCL, GPIO_Pin_SET) #define LCD_RST_SET GPIO_WritePin(PORT_LCD_RES, GPIO_LCD_RES, GPIO_Pin_SET) #define LCD_LED_SET GPIO_WritePin(PORT_LCD_BLK, GPIO_LCD_BLK, GPIO_Pin_SET) //液晶控制口置0操作語(yǔ)句宏定義 #define LCD_CS_CLR GPIO_WritePin(PORT_LCD_CS, GPIO_LCD_CS, GPIO_Pin_RESET)//CS #define LCD_RS_CLR GPIO_WritePin(PORT_LCD_DC, GPIO_LCD_DC, GPIO_Pin_RESET)//DC #define LCD_SDA_CLR GPIO_WritePin(PORT_LCD_SDA, GPIO_LCD_SDA, GPIO_Pin_RESET)//SDA=MOSI #define LCD_SCL_CLR GPIO_WritePin(PORT_LCD_SCL, GPIO_LCD_SCL, GPIO_Pin_RESET)//SCL=SCLK #define LCD_RST_CLR GPIO_WritePin(PORT_LCD_RES, GPIO_LCD_RES, GPIO_Pin_RESET)//RES #define LCD_LED_CLR GPIO_WritePin(PORT_LCD_BLK, GPIO_LCD_BLK, GPIO_Pin_RESET)

3.5. 驅(qū)動(dòng)修改?
在 SPI.c 文件中,找到void SPIv_WriteData(unsigned char Data) 函數(shù),將其修改如下。
void SPIv_WriteData(u8 Data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
if(Data&0x80)
LCD_SDA_SET; //輸出數(shù)據(jù)
else
LCD_SDA_CLR;
LCD_SCL_CLR;
LCD_SCL_SET;
Data<=1;
}
}

在spi.h中,廠家定義了關(guān)于SPI接口的宏,這里我們將其注釋,使用我們自己的方式。

打開touch.c 文件 修改以下內(nèi)容:
修改u8 TP_Init(void);函數(shù)
u8 TP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* PEN */
GPIO_InitStructure.Pins = GPIO_LCD_PEN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(PORT_LCD_PEN, &GPIO_InitStructure);
/* DOUT*/
GPIO_InitStructure.Pins = GPIO_LCD_TD0;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(PORT_LCD_TD0, &GPIO_InitStructure);
/* TDIN*/
GPIO_InitStructure.Pins = GPIO_LCD_TDIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(PORT_LCD_TDIN, &GPIO_InitStructure);
/* TCLK*/
GPIO_InitStructure.Pins = GPIO_LCD_TCLK;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(PORT_LCD_TCLK, &GPIO_InitStructure);
/* TCS*/
GPIO_InitStructure.Pins = GPIO_LCD_CS2;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出模式
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(PORT_LCD_CS2, &GPIO_InitStructure);
TP_Read_XY(&tp_dev.x,&tp_dev.y);//第一次讀取初始化
return 1;
}
注釋掉 void TP_Save_Adjdata(void);和 u8 TP_Get_Adjdata(void);函數(shù)。

找到 void TP_Adjust(void) ;函數(shù)將函數(shù)里面的 TP_Save_Adjdata();和TP_Get_Adjdata();注釋掉。

我們打開 test.c 文件進(jìn)行一些修改:找到 void Touch_Test(void); 函數(shù),將里面的一些語(yǔ)句注釋掉,并且將282行括號(hào)內(nèi)的 key==1 改為 1。

打開 lcd.c 文件 找到 void LCD_Init(void); 函數(shù)將里面的LCD_LED=1;替換成 LCD_LED_SET;

打開 touch.h 文件 將里面一部分代碼改為下面的部分:
#define PEN GPIO_ReadPin(PORT_LCD_PEN,GPIO_LCD_PEN) //INT #define DOUT GPIO_ReadPin(PORT_LCD_TD0,GPIO_LCD_TD0) //MISO #define TDIN(x) GPIO_WritePin(PORT_LCD_TDIN,GPIO_LCD_TDIN,x?GPIO_Pin_SET:GPIO_Pin_RESET) //MOSI #define TCLK(x) GPIO_WritePin(PORT_LCD_TCLK,GPIO_LCD_TCLK,x?GPIO_Pin_SET:GPIO_Pin_RESET) //SCLK #define TCS(x) GPIO_WritePin(PORT_LCD_CS2, GPIO_LCD_CS2, x?GPIO_Pin_SET:GPIO_Pin_RESET) //CS

然后我們打開 touch.c 文件 將文件中的下列形式的語(yǔ)句換成后面的語(yǔ)句:
TCLK = 1; -----換成-------> TCLK(1); TCLK = 0; -----換成-------> TCLK(0); TDIN = 1; -----換成-------> TDIN(1); TDIN = 0; -----換成-------> TDIN(0); TCS = 1; -----換成-------> TCS(1); TCS = 0; -----換成-------> TCS(0);
例如:

到這里就移植完成了,請(qǐng)移步到第4節(jié)進(jìn)行移植驗(yàn)證。
四、移植驗(yàn)證?
在main.c中輸入代碼如下
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "lcd.h" #include "gui.h" #include "test.h" int32_t main(void) { board_init(); // 開發(fā)板初始化 uart1_init(115200); // 串口1波特率115200 LCD_Init(); //液晶屏初始化 while(1) { main_test(); //測(cè)試主界面 Test_Color(); //簡(jiǎn)單刷屏填充測(cè)試 Test_FillRec(); //GUI矩形繪圖測(cè)試 Test_Circle(); //GUI畫圓測(cè)試 Test_Triangle(); //GUI三角形繪圖測(cè)試 English_Font_test(); //英文字體示例測(cè)試 Chinese_Font_test(); //中文字體示例測(cè)試 Pic_test(); //圖片顯示示例測(cè)試 Rotate_Test(); //旋轉(zhuǎn)顯示測(cè)試 /* 如果不帶觸摸,或者不需要觸摸功能,請(qǐng)注釋掉下面觸摸屏測(cè)試項(xiàng) */ Touch_Test(); //觸摸屏手寫測(cè)試 } }
移植現(xiàn)象:

移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1pu5PsMlW1PlWOAGTy-iBuw?pwd=LCKF 提取碼:LCKF
審核編輯 黃宇
-
觸摸屏
+關(guān)注
關(guān)注
42文章
2462瀏覽量
122057 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1858
發(fā)布評(píng)論請(qǐng)先 登錄
使用芯源CW32的CW32L012開發(fā)評(píng)估板做了spi屏幕驅(qū)動(dòng)
CW32 MCU用什么IDE開發(fā)?
CW32模塊使用 1.28寸圓屏LCD彩色顯示屏
CW32模塊使用 0.91寸彩屏
CW32模塊使用 1.3寸單色OLED顯示屏
CW32模塊使用 3.5寸ILI9488彩色觸摸屏
【CW32模塊使用】0.96寸IIC單色屏
【CW32模塊使用】1.8寸彩色觸摸屏
【CW32模塊使用】1.47寸彩屏
【CW32模塊使用】0.96寸彩屏
CW32模塊使用 2.8寸與3.2寸ILI9341彩屏
評(píng)論