在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
今天,用MCUXpresso配置了一下SPI,并驱动LCD屏幕。由于我们屏的硬件结构,只支持接收,实际上配置给SPI的仅仅就SCK和MOSI这2个引脚,其他的
RST、CS、DC均有GPIO模拟实现。
配置图如下:
引脚配置;
时钟配置:
SPI配置(波特率最大不超过50M):
更新代码,添加LCD的驱动代码:
ili_lcd.h(本想取名LCD的,发现与加载的emwin里面一个文件同名,有冲突)
- /*
- * lcd.h
- *
- * Created on: 2020年12月16日
- * Author: Administrator
- */
- #ifndef ILI9341_LCD_H_
- #define ILI9341_LCD_H_
- #include "fsl_common.h"
- #include "fsl_gpio.h"
- #include "pin_mux.h"
- #include "peripherals.h"
- #include "fsl_spi.h"
- #include "fsl_ili9341.h"
- #ifndef ILI9341_SIZE
- #define ILI9341_SIZE 1
- #define LCD_H 320 // 屏幕高度
- #define LCD_W 240 // 屏幕宽度
- #endif
- #ifndef COLOUR_FOR_LCD
- #define COLOUR_FOR_LCD 1
- #define WHITE 0xFFFF // 白色
- #define BLACK 0x0000 // 黑色
- #define BLUE 0x001F // 蓝色
- #define BRED 0xF81F // 洋紫
- #define GBLUE 0x07FF // 靛青
- #define RED 0xF800 // 红色
- #define GREEN 0x07E0 // 绿色
- #define CYAN 0x7FFF // 天蓝
- #define YELLOW 0xFFE0 // 黄色
- #define BROWN 0xBC40 // 棕色
- #define BRRED 0xFC07 // 棕红色 接近肤色
- #define GRAY 0x8430 // 灰色
- #define DARKBLUE 0x01CF // 深蓝色
- #define LIGHTBLUE 0x7D7C // 浅蓝色
- #define GRAYBLUE 0x5458 // 灰蓝色
- #define ORCHID 0xF11F // 紫色
- #endif
- #define lcd_rst(n) GPIO_PinWrite(BOARD_INITPINS_lcd_rst_GPIO,BOARD_INITPINS_lcd_rst_PORT, BOARD_INITPINS_lcd_rst_PIN, n)
- #define lcd_cs(n) GPIO_PinWrite(BOARD_INITPINS_lcd_cs_GPIO, BOARD_INITPINS_lcd_cs_PORT, BOARD_INITPINS_lcd_cs_PIN, n)
- #define lcd_dc(n) GPIO_PinWrite(BOARD_INITPINS_lcd_dc_GPIO, BOARD_INITPINS_lcd_dc_PORT, BOARD_INITPINS_lcd_dc_PIN, n)
- // ========== SPI 发送配置选项 ==========
- typedef enum
- {
- SPI_FIFO_WIRTE_NOP = 0X0000,
- SPI_FIFO_WIRTE_EOT = 0X0010,
- SPI_FIFO_WIRTE_EOF = 0X0020,
- SPI_FIFO_WIRTE_RXIGNORE = 0X0040,
- SPI_FIFO_WIRTE_TXIGNORE = 0X0080,
- }spi_fifo_wirte_list;
- void lcd_init (void);
- void lcd_writ_bus (char data);
- void lcd_writ_cmd (uint16_t cmd);
- void lcd_writ_data (uint16_t data);
- void lcd_writ_data16 (uint16_t data);
- void lcd_address_set (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
- void lcd_set_point_color (uint16_t color);
- void lcd_set_back_color (uint16_t color);
- void lcd_clear_screen (uint16_t Color);
- void lcd_draw_point (uint16_t x, uint16_t y, uint16_t color);
- void lcd_show_char (uint16_t x, uint16_t y, uint8_t data);
- void lcd_show_string (uint16_t x, uint16_t y, uint8_t *data);
- void lcd_show_uint8 (uint16_t x, uint16_t y, uint8_t data);
- void lcd_show_int16 (uint16_t x, uint16_t y, int16_t data);
- void lcd_show_uint16 (uint16_t x, uint16_t y, uint16_t data);
- void lcd_show_int32 (uint16_t x, uint16_t y, int32_t data, uint8_t num);
- void lcd_show_float (uint16_t x, uint16_t y, double data, int8_t num, int8_t pointnum);
- void lcd_show_image (uint16_t x, uint16_t y ,uint16_t w, uint16_t l, const unsigned char *p);
- #endif /* ILI9341_LCD_H_ */
复制代码 ili_lcd.c
- /*
- * lcd.c
- *
- * Created on: 2020年12月16日
- * Author: Administrator
- */
- #include <ili9341_lcd.h>
- #include "font.h"
- #include "delay.h"
- #include "stdio.h"
- static uint16_t lcd_point_color = BLACK; // 默认画点颜色
- static uint16_t lcd_back_color = WHITE; // 背景色
- static volatile uint16_t *FIFOWR_HSPI_H16 = ((volatile uint16_t *)0x4009FE22); // HSPI FIFOWR
- void hspi_master_write_data (uint16_t data, uint16_t config)
- {
- *(FIFOWR_HSPI_H16) = // 对应 SPI 的 FIFOWR 寄存器地址
- (
- config | (FLEXCOMM8_config.dataWidth << 8) | // 设置 帧结束 数据位数
- (~(0x1 << FLEXCOMM8_config.sselNum) & 0x0f) // 选择从机
- );
- SPI8->FIFOWR |= data; // 发送数据
- }
- static void hspi_Init(void)
- {
- RESET_PeripheralReset(kHSLSPI_RST_SHIFT_RSTn);
- /* Initialization function */
- SPI_MasterInit(FLEXCOMM8_PERIPHERAL, &FLEXCOMM8_config, FLEXCOMM8_CLOCK_SOURCE);
- }
- static void lcd_port_Init(void)
- {
- //除SPI之外的 RST CS DC
- /* Enables the clock for the I/O controller.: Enable Clock. */
- CLOCK_EnableClock(kCLOCK_Iocon);
- /* Enables the clock for the GPIO0 module */
- CLOCK_EnableClock(kCLOCK_Gpio0);
- /* Enables the clock for the GPIO1 module */
- CLOCK_EnableClock(kCLOCK_Gpio1);
- gpio_pin_config_t lcd_cs_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 0U
- };
- /* Initialize GPIO functionality on pin PIO1_1 (pin 59) */
- GPIO_PinInit(BOARD_INITPINS_lcd_cs_GPIO, BOARD_INITPINS_lcd_cs_PORT, BOARD_INITPINS_lcd_cs_PIN, &lcd_cs_config);
- gpio_pin_config_t lcd_rst_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 0U
- };
- /* Initialize GPIO functionality on pin PIO1_3 (pin 62) */
- GPIO_PinInit(BOARD_INITPINS_lcd_rst_GPIO, BOARD_INITPINS_lcd_rst_PORT, BOARD_INITPINS_lcd_rst_PIN, &lcd_rst_config);
- gpio_pin_config_t lcd_dc_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 0U
- };
- /* Initialize GPIO functionality on pin PIO1_4 (pin 1) */
- GPIO_PinInit(BOARD_INITPINS_lcd_dc_GPIO, BOARD_INITPINS_lcd_dc_PORT, BOARD_INITPINS_lcd_dc_PIN, &lcd_dc_config);
- //1_1 CS
- IOCON->PIO[1][1] = ((IOCON->PIO[1][1] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT11 (pin 59) is configured as PIO1_1. */
- | IOCON_PIO_FUNC(PIO1_1_FUNC_ALT0)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO1_1_DIGIMODE_DIGITAL));
- //1_3 RST
- IOCON->PIO[1][3] = ((IOCON->PIO[1][3] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT13 (pin 62) is configured as PIO1_3. */
- | IOCON_PIO_FUNC(PIO1_3_FUNC_ALT0)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO1_3_DIGIMODE_DIGITAL));
- //1_4 DC
- IOCON->PIO[1][4] = ((IOCON->PIO[1][4] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT14 (pin 1) is configured as PIO1_4. */
- | IOCON_PIO_FUNC(PIO1_4_FUNC_ALT0)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO1_4_DIGIMODE_DIGITAL));
- //SPI 相关引脚 SCK MOSI
- //1_2 SCK
- IOCON->PIO[1][2] = ((IOCON->PIO[1][2] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT12 (pin 61) is configured as HS_SPI_SCK. */
- | IOCON_PIO_FUNC(PIO1_2_FUNC_ALT6)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO1_2_DIGIMODE_DIGITAL));
- //0_26 MOSI
- IOCON->PIO[0][26] = ((IOCON->PIO[0][26] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT026 (pin 60) is configured as HS_SPI_MOSI. */
- | IOCON_PIO_FUNC(0x09u)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO0_26_DIGIMODE_DIGITAL));
- //TEST CS-->1_1 硬件CS
- //0_26 MOSI
- IOCON->PIO[1][1] = ((IOCON->PIO[1][1] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))
- /* Selects pin function.
- * : PORT026 (pin 60) is configured as HS_SPI_MOSI. */
- | IOCON_PIO_FUNC(0x05u)
- /* Select Digital mode.
- * : Enable Digital mode.
- * Digital input is enabled. */
- | IOCON_PIO_DIGIMODE(PIO1_1_DIGIMODE_DIGITAL));
- //SPI 初始化
- hspi_Init();
- }
- //仅发送,不接收
- static void HSPIWriteByteNoRec(uint8_t tx_data)
- {
- //添加了忽略接收的标志
- //SPI_WriteData(FLEXCOMM8_PERIPHERAL, tx_data, kSPI_FrameDelay|SPI_FIFOWR_RXIGNORE_MASK);
- hspi_master_write_data(tx_data, SPI_FIFO_WIRTE_EOF|SPI_FIFO_WIRTE_RXIGNORE);
- }
- static uint16_t HSPIReadWriteByte(uint8_t tx_data)
- {
- SPI_WriteData(FLEXCOMM8_PERIPHERAL, tx_data, kSPI_FrameDelay);
- while (1)
- {
- //if rxFIFO is not empty
- if ((FLEXCOMM8_PERIPHERAL->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK) != 0U)
- {
- return SPI_ReadData(FLEXCOMM8_PERIPHERAL);
- }
- }
- return 0;
- }
- void lcd_writ_bus(char data)
- {
- //HSPIReadWriteByte(data);
- HSPIWriteByteNoRec(data);
- //zf_hspi_master_write_data(data, SPI_FIFO_WIRTE_EOF|SPI_FIFO_WIRTE_RXIGNORE);
- }
- void lcd_writ_cmd(uint16_t cmd)
- {
- lcd_dc(0);
- lcd_writ_bus(cmd);
- }
- void lcd_writ_data(uint16_t data)
- {
- lcd_dc(1);
- lcd_writ_bus(data);
- }
- void lcd_writ_data16(uint16_t data)
- {
- lcd_dc(1);
- lcd_writ_bus(data>>8);
- lcd_writ_bus(data);
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 设置显示位置
- // @param x1 起始 x 轴位置 从左往右为 0 - 239
- // @param y1 起始 y 轴位置 从上往下为 0 - 319
- // @param x2 结束 x 轴位置 从左往右为 0 - 239
- // @param y2 结束 y 轴位置 从上往下为 0 - 319
- // Sample usage: lcd_address_set(0, 0, 239, 319);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_address_set (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
- {
- lcd_writ_cmd(0x2a);
- lcd_writ_data16(x1);
- lcd_writ_data16(x2);
- lcd_writ_cmd(0x2b);
- lcd_writ_data16(y1);
- lcd_writ_data16(y2);
- lcd_writ_cmd(0x2c);
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 设置点颜色
- // @param Color 填充颜色
- // Sample usage: ili9341_hwspi_set_point_color(WHITE);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_set_point_color (uint16_t color)
- {
- lcd_point_color = color;
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 设置背景颜色
- // @param Color 填充颜色
- // Sample usage: ili9341_hwspi_set_back_color(WHITE);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_set_back_color (uint16_t color)
- {
- lcd_back_color = color;
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 全屏填充
- // @param Color 填充颜色
- // Sample usage: ili9341_hwspi_clear_screen(WHITE);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_clear_screen (uint16_t Color)
- {
- uint16_t i,j;
- lcd_address_set(0, 0, LCD_W-1, LCD_H-1);
- for(i=0; i<LCD_W; i++)
- {
- for (j=0;j<LCD_H;j++)
- {
- lcd_writ_data16(Color);
- }
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标画点
- // @param x 点 x 轴位置 从左往右为 0 - 239
- // @param y 点 y 轴位置 从上往下为 0 - 319
- // @param Color 颜色
- // Sample usage: ili9341_hwspi_draw_point(0, 0, WHITE);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_draw_point (uint16_t x, uint16_t y, uint16_t color)
- {
- lcd_address_set(x, y, x, y);
- lcd_writ_data16(color);
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示字符
- // @param x 点 x 轴位置 从左往右为 0 - 239
- // @param y 点 y 轴位置 从上往下为 0 - 319
- // @param data 字符数据
- // Sample usage: ili9341_hwspi_show_char(0, 0, dat);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_char (uint16_t x, uint16_t y, uint8_t data)
- {
- uint8_t i,j;
- uint8_t temp;
- for(i=0; i<16; i++)
- {
- lcd_address_set(x, y+ i, x+ 7, y+ i);
- temp = tft_ascii[(uint16_t)data-32][i];//减32因为是取模是从空格开始取得 空格在ascii中序号是32
- for(j=0; j<8; j++)
- {
- if(temp&0x01)
- lcd_writ_data16(lcd_point_color);
- else
- lcd_writ_data16(lcd_back_color);
- temp>>=1;
- }
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示字符串
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data 字符数据数组
- // Sample usage: ili9341_hwspi_show_string(0, 0, dat);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_string (uint16_t x, uint16_t y, uint8_t *data)
- {
- uint16_t j;
- j = 0;
- while(data[j] != '\0')
- {
- lcd_show_char(x+ 8* j, y* 16, data[j]);
- j++;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 uint8_t 数字
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data uint8_t 数字
- // Sample usage: ili9341_hwspi_show_uint8(0, 0, dat);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_uint8 (uint16_t x, uint16_t y, uint8_t data)
- {
- uint8_t a[3];
- uint8_t i;
- a[0] = data/100;
- a[1] = data/10%10;
- a[2] = data%10;
- i = 0;
- while(i<3)
- {
- lcd_show_char(x+ (8* i), y* 16, '0'+ a[i]);
- i++;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 int16_t 数字
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data int16_t 数字
- // Sample usage: ili9341_hwspi_show_int16(0, 0, dat);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_int16 (uint16_t x, uint16_t y, int16_t data)
- {
- uint8_t a[5];
- uint8_t i;
- uint16_t u_dat;
- if(data<0)
- {
- lcd_show_char(x, y* 16, '-');
- u_dat = (uint16_t)data;
- u_dat -= 1;
- u_dat = ~data;
- }
- else
- {
- lcd_show_char(x, y* 16, ' ');
- u_dat = data;
- }
- a[0] = u_dat/10000;
- a[1] = u_dat/1000%10;
- a[2] = u_dat/100%10;
- a[3] = u_dat/10%10;
- a[4] = u_dat%10;
- i = 0;
- while(i<5)
- {
- lcd_show_char(x+ (8* (i+ 1)), y* 16, '0'+ a[i]);
- i++;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 uint16_t 数字
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data uint16_t 数字
- // Sample usage: ili9341_hwspi_show_uint16(0, 0, dat);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_uint16 (uint16_t x, uint16_t y, uint16_t data)
- {
- uint8_t a[5];
- uint8_t i;
- a[0] = data/10000;
- a[1] = data/1000%10;
- a[2] = data/100%10;
- a[3] = data/10%10;
- a[4] = data%10;
- i = 0;
- while(i<5)
- {
- lcd_show_char(x+ (8* i), y* 16, '0' +a[i]);
- i++;
- }
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 int32_t 数字
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data int32_t 数字
- // @param num int32_t 数字位数
- // Sample usage: ili9341_hwspi_show_int32(0, 0, 100, 3);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_int32 (uint16_t x, uint16_t y, int32_t data, uint8_t num)
- {
- char buff[34];
- uint8_t length;
- if(10<num)
- num = 10;
- num++;
- if(0>data)
- length = sprintf(&buff[0], "%d", data);//负数
- else
- {
- buff[0] = ' ';
- length = sprintf(&buff[1], "%d", data);
- length++;
- }
- while(length < num)
- {
- buff[length] = ' ';
- length++;
- }
- buff[num] = '\0';
- lcd_show_string(x, y, (uint8_t *)buff); //显示数字
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 float 数字
- // @param x 点 x 轴位置 从左往右为 0 - 239 这里是像素点 一共 240 像素点
- // @param y 点 y 轴位置 从上往下为 0 - 19 这里是字符高度分割 一共 20 行 20*16=320
- // @param data float 数字
- // @param num float 数字整数位数
- // @param pointnum float 数字小数位数
- // Sample usage: ili9341_hwspi_show_float(0, 0, 3.14, 1, 2);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_float (uint16_t x, uint16_t y, double dat, int8_t num, int8_t pointnum)
- {
- uint8_t length;
- char buff[34];
- int8_t start, end, point;
- if(6<pointnum)
- pointnum = 6;
- if(10<num)
- num = 10;
- if(0>dat)
- length = sprintf(&buff[0], "%f", dat);//负数
- else
- {
- length = sprintf(&buff[1], "%f", dat);
- length++;
- }
- point = length - 7; //计算小数点位置
- start = point - num - 1; //计算起始位
- end = point + pointnum + 1; //计算结束位
- while(0>start)//整数位不够 末尾应该填充空格
- {
- buff[end] = ' ';
- end++;
- start++;
- }
- if(0>dat)
- buff[start] = '-';
- else
- buff[start] = ' ';
- buff[end] = '\0';
- lcd_show_string(x, y, (uint8_t *)buff); //显示数字
- }
- //-------------------------------------------------------------------------------------------------------------------
- // @brief ili9341 坐标显示 图片
- // @param x 点 x 轴位置 从左往右为 0 - 239
- // @param y 点 y 轴位置 从上往下为 0 - 319
- // @param w 图像宽度
- // @param l 图像高度
- // @param *p 图像指针
- // Sample usage: ili9341_hwspi_show_image(0, 0, 240, 320, big_image);
- //-------------------------------------------------------------------------------------------------------------------
- void lcd_show_image (uint16_t x, uint16_t y, uint16_t w, uint16_t l, const unsigned char *p)
- {
- int i;
- unsigned char picH,picL;
- lcd_address_set(x, y, x+ w- 1, y+ l- 1);
- for(i=0; i < w*l; i++)
- {
- picL=*(p+ i* 2);
- picH=*(p+ i* 2+ 1);
- lcd_writ_data16(picH<< 8| picL);
- }
- }
- void lcd_init(void)
- {
- lcd_port_Init();
- delay_ms(120);
- lcd_dc(1);
- lcd_cs(0);
- lcd_rst(0);
- delay_ms(50);
- lcd_rst(1);
- delay_ms(100);
- lcd_writ_cmd(0xCF);
- lcd_writ_data(0x00);
- lcd_writ_data(0xD9);
- lcd_writ_data(0X30);
- lcd_writ_cmd(0xED);
- lcd_writ_data(0x64);
- lcd_writ_data(0x03);
- lcd_writ_data(0X12);
- lcd_writ_data(0X81);
- lcd_writ_cmd(0xE8);
- lcd_writ_data(0x85);
- lcd_writ_data(0x10);
- lcd_writ_data(0x78);
- lcd_writ_cmd(0xCB);
- lcd_writ_data(0x39);
- lcd_writ_data(0x2C);
- lcd_writ_data(0x00);
- lcd_writ_data(0x34);
- lcd_writ_data(0x02);
- lcd_writ_cmd(0xF7);
- lcd_writ_data(0x20);
- lcd_writ_cmd(0xEA);
- lcd_writ_data(0x00);
- lcd_writ_data(0x00);
- lcd_writ_cmd(0xC0); //Power control
- lcd_writ_data(0x21); //VRH[5:0]
- lcd_writ_cmd(0xC1); //Power control
- lcd_writ_data(0x12); //SAP[2:0];BT[3:0]
- lcd_writ_cmd(0xC5); //VCM control
- lcd_writ_data(0x32);
- lcd_writ_data(0x3C);
- lcd_writ_cmd(0xC7); //VCM control2
- lcd_writ_data(0XC1);
- lcd_writ_cmd(0x36); // Memory Access Control
- lcd_writ_data(0x08);
- lcd_writ_cmd(0x3A);
- lcd_writ_data(0x55);
- lcd_writ_cmd(0xB1);
- lcd_writ_data(0x00);
- lcd_writ_data(0x18);
- lcd_writ_cmd(0xB6); // Display Function Control
- lcd_writ_data(0x0A);
- lcd_writ_data(0xA2);
- lcd_writ_cmd(0xF2); // 3Gamma Function Disable
- lcd_writ_data(0x00);
- lcd_writ_cmd(0x26); //Gamma curve selected
- lcd_writ_data(0x01);
- lcd_writ_cmd(0xE0); //Set Gamma
- lcd_writ_data(0x0F);
- lcd_writ_data(0x20);
- lcd_writ_data(0x1E);
- lcd_writ_data(0x09);
- lcd_writ_data(0x12);
- lcd_writ_data(0x0B);
- lcd_writ_data(0x50);
- lcd_writ_data(0XBA);
- lcd_writ_data(0x44);
- lcd_writ_data(0x09);
- lcd_writ_data(0x14);
- lcd_writ_data(0x05);
- lcd_writ_data(0x23);
- lcd_writ_data(0x21);
- lcd_writ_data(0x00);
- lcd_writ_cmd(0XE1); //Set Gamma
- lcd_writ_data(0x00);
- lcd_writ_data(0x19);
- lcd_writ_data(0x19);
- lcd_writ_data(0x00);
- lcd_writ_data(0x12);
- lcd_writ_data(0x07);
- lcd_writ_data(0x2D);
- lcd_writ_data(0x28);
- lcd_writ_data(0x3F);
- lcd_writ_data(0x02);
- lcd_writ_data(0x0A);
- lcd_writ_data(0x08);
- lcd_writ_data(0x25);
- lcd_writ_data(0x2D);
- lcd_writ_data(0x0F);
- lcd_writ_cmd(0x11); //Exit Sleep
- delay_ms(120);
- lcd_writ_cmd(0x29); //Display on
- }
复制代码 显示颜色正常,但我感觉速度怎么这么慢呢!之前的SPI发送接收函数是一问一答的形式。后来看了官方的程序,它直接屏蔽了REC的功能。这样就能节省些时间了。
之前的SPI单个发送接收函数:
- static uint16_t HSPIReadWriteByte(uint8_t tx_data)
- {
- SPI_WriteData(FLEXCOMM8_PERIPHERAL, tx_data, kSPI_FrameDelay);
- while (1)
- {
- //if rxFIFO is not empty
- if ((FLEXCOMM8_PERIPHERAL->FIFOSTAT & SPI_FIFOSTAT_RXNOTEMPTY_MASK) != 0U)
- {
- return SPI_ReadData(FLEXCOMM8_PERIPHERAL);
- }
- }
- return 0;
- }
复制代码 后面参考修改的仅接收的函数:
- <blockquote>// ========== SPI 发送配置选项 ==========
复制代码static volatile uint16_t *FIFOWR_HSPI_H16 = ((volatile uint16_t *)0x4009FE22); // HSPI FIFOWR
void hspi_master_write_data (uint16_t data, uint16_t config)
{
*(FIFOWR_HSPI_H16) = // 对应 SPI 的 FIFOWR 寄存器地址
(
config | (FLEXCOMM8_config.dataWidth << 8) | // 设置 帧结束 数据位数
(~(0x1 << FLEXCOMM8_config.sselNum) & 0x0f) // 选择从机
);
SPI8->FIFOWR |= data; // 发送数据
}
理论上用 SPI_WriteData(FLEXCOMM8_PERIPHERAL, tx_data, kSPI_FrameDelay|SPI_FIFOWR_RXIGNORE_MASK); 也是同等的,但我感觉就是慢一拍。
关于寄存器的地址及选项,我们看参考手册:
SPI8 基准地址 0x4009F000 + FIFOWR的偏移 0xe20 然后FIFOWR是32bit 一个字,有2个16BIT的半字,所以后面的16BIT的其实地址还要+2.就是
0x4009FE22。这样我们就多操作发送选项寄存器地址的由来,和选项大概了解。
官方库给的选项其实还不过多,最后将所以的发送选项都放上去:
NXP sdk 库的:
- /*! @brief SPI transfer option.*/
- typedef enum _spi_xfer_option
- {
- kSPI_FrameDelay = (SPI_FIFOWR_EOF_MASK), /*!< A delay may be inserted, defined in the DLY register.*/
- kSPI_FrameAssert = (SPI_FIFOWR_EOT_MASK), /*!< SSEL will be deasserted at the end of a transfer */
- } spi_xfer_option_t;
复制代码 Seekfree 的:
- // ========== SPI 发送配置选项 ==========
- typedef enum
- {
- SPI_FIFO_WIRTE_NOP = 0X0000,
- SPI_FIFO_WIRTE_EOT = 0X0010,
- SPI_FIFO_WIRTE_EOF = 0X0020,
- SPI_FIFO_WIRTE_RXIGNORE = 0X0040,
- SPI_FIFO_WIRTE_TXIGNORE = 0X0080,
- }spi_fifo_wirte_list;
复制代码 刷屏函数调用单发,比之前速度好像好了些,但是还是没有ZF的官方例子速度快。不知道为啥,哪位大侠试下,帮看看原因。
好了.LCD刷屏目前先到这。请哪位大侠试下,并告知原因。
|
|