[AT32F423] 【AT-START-F423测评】+ spi接口lcd显示

[复制链接]
 楼主| WoodData 发表于 2023-11-8 16:21 | 显示全部楼层 |阅读模式
<
本次研究SPI接口的lcd显示测试。
自己做的一个lcd模块,使用arduino接口插在板子上。引脚使用
LCD SCK==PA5
LCD MISO = PA6
LCD MOSI = PA7
LCD CS = PA15
LCD DC = PC7
LCD BLK = PA9
3.jpg
开发板接口。

4.jpg

lcd模块接口
2.jpg
实物如上图。

下面初始化SPI.
  1. void drv_spi_gpio_init(void)
  2. {
  3.     gpio_init_type gpio_initstructure;
  4.     spi_init_type spi_init_struct;
  5.    
  6.     crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
  7.     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  8.     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  9.     crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  10.    
  11.     gpio_default_para_init(&gpio_initstructure);
  12.     /* spi1 sck pin */
  13.     gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  14.     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  15.     gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  16.     gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  17.     gpio_initstructure.gpio_pins = GPIO_PINS_5;
  18.     gpio_init(GPIOA, &gpio_initstructure);
  19.     gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_5);

  20.     /* spi1 miso pin */
  21.     gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  22.     gpio_initstructure.gpio_pins           = GPIO_PINS_6;
  23.     gpio_init(GPIOA, &gpio_initstructure);
  24.     gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_5);

  25.     /* spi1 mosi pin */
  26.     gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  27.     gpio_initstructure.gpio_pins           = GPIO_PINS_7;
  28.     gpio_init(GPIOA, &gpio_initstructure);
  29.     gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_5);
  30.   
  31.     spi_default_para_init(&spi_init_struct);
  32.     spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  33.     spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  34.     spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_4;
  35.     spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  36.     spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  37.     spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  38.     spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;
  39.     spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  40.     spi_init(SPI1, &spi_init_struct);
  41.     spi_enable(SPI1, TRUE);
  42. }
SPI读写
  1. uint8_t spi_writebyte(uint8_t index,uint8_t TxData)
  2. {
  3.     uint8_t re;
  4.     while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);
  5.     spi_i2s_data_transmit(SPI1, TxData);
  6.     while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET);
  7.     re = spi_i2s_data_receive(SPI1);
  8.     return re;
  9. }
lcd使用的IO初始化
  1. void spilcd_gpio_init(void)
  2. {
  3.     gpio_init_type gpio_initstructure;
  4.    
  5.     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  6.     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  7.    
  8.     gpio_default_para_init(&gpio_initstructure);
  9.     /* lcd CS=PA15,BLK=PA9 */
  10.     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  11.     gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  12.     gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  13.     gpio_initstructure.gpio_pins = GPIO_PINS_15 | GPIO_PINS_9;
  14.     gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  15.     gpio_init(GPIOA, &gpio_initstructure);
  16.    
  17.     //DC = PC7
  18.     gpio_initstructure.gpio_pins = GPIO_PINS_7;
  19.     gpio_init(GPIOC, &gpio_initstructure);
  20.    
  21.     drv_spi_gpio_init();
  22. }
spi接口驱动
  1. static void SPILCD_WriteCmd(uint8_t Data)
  2. {
  3.     LCD_DC_CLR();
  4.     LCD_CS_CLR();
  5.     spi_writebyte(0,Data);
  6.     LCD_CS_SET();
  7. }

  8. static void SPILCD_WriteData(uint8_t Data)
  9. {
  10.     LCD_DC_SET();
  11.     LCD_CS_CLR();
  12.     spi_writebyte(0,Data);
  13.     LCD_CS_SET();
  14. }

  15. static void SPILCD_WriteMultiData(const uint8_t *pData, uint32_t NumItems)
  16. {
  17.     uint32_t i=NumItems;
  18.     uint32_t Data;
  19.         
  20.     LCD_DC_SET();
  21.     LCD_CS_CLR();
  22.     spi_writebuff(0,(uint8_t *)pData,NumItems);
  23.     LCD_CS_SET();
  24. }

  25. static void SPILCD_SetRegin(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
  26. {
  27.     uint8_t data[4];
  28.     /*Column addresses*/
  29.     SPILCD_WriteCmd(0x2A);
  30.     data[0] = (x1 >> 8) & 0xFF;
  31.     data[1] = x1 & 0xFF;
  32.     data[2] = (x2 >> 8) & 0xFF;
  33.     data[3] = x2 & 0xFF;
  34.     SPILCD_WriteData(data[0]);
  35.     SPILCD_WriteData(data[1]);
  36.     SPILCD_WriteData(data[2]);
  37.     SPILCD_WriteData(data[3]);

  38.     /*Page addresses*/
  39.     SPILCD_WriteCmd(0x2B);
  40.     data[0] = (y1 >> 8) & 0xFF;
  41.     data[1] = y1 & 0xFF;
  42.     data[2] = (y2 >> 8) & 0xFF;
  43.     data[3] = y2 & 0xFF;
  44.     SPILCD_WriteData(data[0]);
  45.     SPILCD_WriteData(data[1]);
  46.     SPILCD_WriteData(data[2]);
  47.     SPILCD_WriteData(data[3]);

  48.     /*Memory write*/
  49.     SPILCD_WriteCmd(0x2C);
  50. }

  51. void spilcd_draw_bitmap(uint16_t x,uint16_t y,uint16_t w,uint16_t h,const uint8_t *pbuff)
  52. {

  53.     uint16_t x1,y1,x2,y2;
  54.     uint32_t send_size   = w * h * 2;
  55.     x1 = x;
  56.     y1 = y;
  57.     x2 = x+w-1;
  58.     y2 = y+h-1;
  59.     SPILCD_SetRegin(x1,y1,x2,y2);
  60.     SPILCD_WriteMultiData(pbuff, send_size);
  61.     LCD_CS_SET();
  62. }


主函数调用lcd初始化,并显示。
  1.     spilcd_init();
  2.     Lcd_Clear(LCD_RED);
  3.     Delay_ms(1000);
  4.     Lcd_Clear(LCD_GREEN);
  5.     Delay_ms(1000);
  6.     Lcd_Clear(LCD_BLUE);
  7.     Delay_ms(1000);
  8.     Lcd_Clear(LCD_WHITE);
  9.     Delay_ms(1000);


通过shell控制显示效果。
  1. #if UART_SHELL == NR_MICRO_SHELL
  2. #include "nr_micro_shell.h"

  3. extern const unsigned char gImage_1[];

  4. /* GLCD RGB color definitions                            */
  5. #define GLCD_COLOR_BLACK        0x0000  /*   0,   0,   0 */
  6. #define GLCD_COLOR_NAVY         0x000F  /*   0,   0, 128 */
  7. #define GLCD_COLOR_DARK_GREEN   0x03E0  /*   0, 128,   0 */
  8. #define GLCD_COLOR_DARK_CYAN    0x03EF  /*   0, 128, 128 */
  9. #define GLCD_COLOR_MAROON       0x7800  /* 128,   0,   0 */
  10. #define GLCD_COLOR_PURPLE       0x780F  /* 128,   0, 128 */
  11. #define GLCD_COLOR_OLIVE        0x7BE0  /* 128, 128,   0 */
  12. #define GLCD_COLOR_LIGHT_GREY   0xC618  /* 192, 192, 192 */
  13. #define GLCD_COLOR_DARK_GREY    0x7BEF  /* 128, 128, 128 */
  14. #define GLCD_COLOR_BLUE         0x001F  /*   0,   0, 255 */
  15. #define GLCD_COLOR_GREEN        0x07E0  /*   0, 255,   0 */
  16. #define GLCD_COLOR_CYAN         0x07FF  /*   0, 255, 255 */
  17. #define GLCD_COLOR_RED          0xF800  /* 255,   0,   0 */
  18. #define GLCD_COLOR_MAGENTA      0xF81F  /* 255,   0, 255 */
  19. #define GLCD_COLOR_YELLOW       0xFFE0  /* 255, 255, 0   */
  20. #define GLCD_COLOR_WHITE        0xFFFF  /* 255, 255, 255 */

  21. static uint16_t g_color_f = GLCD_COLOR_WHITE,g_color_b = GLCD_COLOR_BLACK;
  22. static int16_t g_x=0,g_y=0;

  23. static uint16_t lcd_color_find(char *pstr)
  24. {
  25.     if (!strcmp("black", pstr)) return GLCD_COLOR_BLACK;
  26.     else if (!strcmp("white", pstr)) return GLCD_COLOR_WHITE;
  27.     else if (!strcmp("red", pstr)) return GLCD_COLOR_RED;
  28.     else if (!strcmp("yellow", pstr)) return GLCD_COLOR_YELLOW;
  29.     else if (!strcmp("green", pstr)) return GLCD_COLOR_GREEN;
  30.     else if (!strcmp("blue", pstr)) return GLCD_COLOR_BLUE;
  31.     else if (!strcmp("purple", pstr)) return GLCD_COLOR_PURPLE;
  32.     else if (!strcmp("light", pstr)) return GLCD_COLOR_LIGHT_GREY;
  33.     else if (!strcmp("dark", pstr)) return GLCD_COLOR_DARK_GREY;
  34.     else return atoi(pstr);
  35. }
  36. /**
  37. * [url=home.php?mod=space&uid=247401]@brief[/url] test command
  38. */

  39. void shell_lcd(char argc, char *argv)
  40. {
  41.     int color;
  42.     int x1,y1,x2,y2;
  43.     if (argc > 1)
  44.     {
  45.         if (!strcmp("clear", &argv[argv[1]]))
  46.         {
  47.             if(argc == 3)
  48.             {
  49.                 color = lcd_color_find(&argv[argv[2]]);
  50.             }else if(argc == 2)
  51.             {
  52.                 color = g_color_b;
  53.             }else goto lcd_end;
  54.             Lcd_Clear(color);
  55.         }else if (!strcmp("fillrect", &argv[argv[1]]))
  56.         {
  57.             if(argc == 6)
  58.             {
  59.                 color = g_color_f;
  60.             }else if(argc == 7)
  61.             {
  62.                 color = lcd_color_find(&argv[argv[6]]);
  63.             }else goto lcd_end;
  64.             x1 = atoi(&argv[argv[2]]);
  65.             y1 = atoi(&argv[argv[3]]);
  66.             x2 = atoi(&argv[argv[4]]);
  67.             y2 = atoi(&argv[argv[5]]);
  68.             if(x2 && y2)    Lcd_Fill(x1,y1,x1+x2-1,y1+y2-1,color);
  69.             else printf("w h must > 0");
  70.         }else if (!strcmp("fillcircle", &argv[argv[1]]))
  71.         {
  72.             if(argc == 5)
  73.             {
  74.                 color = g_color_f;
  75.             }else if(argc == 6)
  76.             {
  77.                 color = lcd_color_find(&argv[argv[5]]);
  78.             }else goto lcd_end;
  79.             x1 = atoi(&argv[argv[2]]);
  80.             y1 = atoi(&argv[argv[3]]);
  81.             x2 = atoi(&argv[argv[4]]);  //r
  82.             if(x2)  Lcd_FillCircle(x1,y1,x2,color);
  83.             else printf("r must > 0");
  84.         }else if (!strcmp("vline", &argv[argv[1]]))
  85.         {
  86.             if(argc == 5)
  87.             {
  88.                 color = g_color_f;
  89.             }else if(argc == 6)
  90.             {
  91.                 color = lcd_color_find(&argv[argv[5]]);
  92.             }else goto lcd_end;
  93.             x1 = atoi(&argv[argv[2]]);
  94.             y1 = atoi(&argv[argv[3]]);
  95.             y2 = atoi(&argv[argv[4]]);
  96.             if(y2)  Lcd_DrawVLine(x1,y1,y1+y2-1,color);
  97.             else printf("h must > 0");
  98.         }else if (!strcmp("hline", &argv[argv[1]]))
  99.         {
  100.             if(argc == 5)
  101.             {
  102.                 color = g_color_f;
  103.             }else if(argc == 6)
  104.             {
  105.                 color = lcd_color_find(&argv[argv[5]]);
  106.             }else goto lcd_end;
  107.             x1 = atoi(&argv[argv[2]]);
  108.             y1 = atoi(&argv[argv[3]]);
  109.             x2 = atoi(&argv[argv[4]]);
  110.             if(x2)  Lcd_DrawHLine(x1,y1,x1+x2-1,color);
  111.             else printf("w  must > 0");
  112.         }else if (!strcmp("circle", &argv[argv[1]]))
  113.         {
  114.             if(argc == 5)
  115.             {
  116.                 color = g_color_f;
  117.             }else if(argc == 6)
  118.             {
  119.                 color = lcd_color_find(&argv[argv[5]]);
  120.             }else goto lcd_end;
  121.             x1 = atoi(&argv[argv[2]]);
  122.             y1 = atoi(&argv[argv[3]]);
  123.             x2 = atoi(&argv[argv[4]]);  //r
  124.             if(x2)   Lcd_DrawCircle(x1,y1,x2,color);
  125.             else printf("r must > 0");
  126.         }else if (!strcmp("rect", &argv[argv[1]]))
  127.         {
  128.             if(argc == 6)
  129.             {
  130.                 color = g_color_f;
  131.             }else if(argc == 7)
  132.             {
  133.                 color = lcd_color_find(&argv[argv[6]]);
  134.             }else goto lcd_end;
  135.             x1 = atoi(&argv[argv[2]]);
  136.             y1 = atoi(&argv[argv[3]]);
  137.             x2 = atoi(&argv[argv[4]]);
  138.             y2 = atoi(&argv[argv[5]]);
  139.             if(x2 && y2)    Lcd_DrawRect(x1,y1,x1+x2-1,y1+y2-1,color);
  140.             else printf("w h must > 0");
  141.         }else if (!strcmp("point", &argv[argv[1]]))
  142.         {
  143.             if(argc == 4)
  144.             {
  145.                 color = g_color_f;
  146.             }else if(argc == 5)
  147.             {
  148.                 color = lcd_color_find(&argv[argv[4]]);
  149.             }else goto lcd_end;
  150.             x1 = atoi(&argv[argv[2]]);
  151.             y1 = atoi(&argv[argv[3]]);
  152.             Lcd_DrawPoint(x1,y1,color);
  153.         }else if (!strcmp("color", &argv[argv[1]]))
  154.         {
  155.             if(argc == 2)
  156.             {
  157.                 printf("f_color=%04X,b_color=%04X\r\n",g_color_f,g_color_b);
  158.             }else if(argc == 4)
  159.             {
  160.                 g_color_f = lcd_color_find(&argv[argv[2]]);
  161.                 g_color_b = lcd_color_find(&argv[argv[3]]);
  162.             }else goto lcd_end;
  163.         }else if (!strcmp("move", &argv[argv[1]]))
  164.         {
  165.             if(argc == 2)
  166.             {
  167.                 printf("x=%d,y=%d\r\n",g_x,g_y);
  168.             }else if(argc == 4)
  169.             {
  170.                 g_x = atoi(&argv[argv[2]]);
  171.                 g_y = atoi(&argv[argv[3]]);
  172.             }else goto lcd_end;
  173.         }else if (!strcmp("display", &argv[argv[1]]))
  174.         {
  175.             if(argc == 5)
  176.             {
  177.                 x1 = atoi(&argv[argv[2]]);
  178.                 y1 = atoi(&argv[argv[3]]);
  179.                 lcd_set_font_color(g_color_f,g_color_b);
  180.                 lcd_disp_str_at(x1,y1,&argv[argv[4]]);
  181.             }else goto lcd_end;
  182.         }else if (!strcmp("image", &argv[argv[1]]))
  183.         {
  184.             if(argc == 2)
  185.             {
  186. //                //Lcd_DrawImage(g_x,g_y,g_x+39,g_y+39,(uint8_t *)gImage_1);
  187.             }else if(argc == 4)
  188.             {
  189.                 x1 = atoi(&argv[argv[2]]);
  190.                 y1 = atoi(&argv[argv[3]]);
  191. //                //Lcd_DrawImage(x1,y1,x1+39,y1+39,(uint8_t *)gImage_1);
  192.             }else goto lcd_end;
  193.         }else goto lcd_end;
  194.     }else goto lcd_end;
  195.     return;
  196. lcd_end:
  197.     printf("usage: lcd  \r\n");
  198.     printf("lcd clear                    [color]\r\n");
  199.     printf("lcd fillrect     x1 y1 w  h  [color]\r\n");
  200.     printf("lcd fillcircle   x1 y1 r     [color]\r\n");
  201.     printf("lcd hline        x1 y1 w     [color]\r\n");
  202.     printf("lcd vline        x1 y1    h  [color]\r\n");
  203.     printf("lcd circle       x1 y1 r     [color]\r\n");
  204.     printf("lcd rect         x1 y1 w  h  [color]\r\n");
  205.     printf("lcd point        x1 y1       [color]\r\n");
  206.     printf("lcd display      x  y    string   \r\n");
  207.     printf("lcd move         x  y             \r\n");
  208.     printf("lcd image        x  y             \r\n");
  209.     printf("lcd color        f_color  b_color \r\n");
  210. }
  211. NR_SHELL_CMD_EXPORT(lcd, shell_lcd, "lcd display test");


5.jpg
1.jpg

工程代码:
游客,如果您要查看本帖隐藏内容请回复

dmxfeng 发表于 2023-11-13 10:44 | 显示全部楼层
学习一下SPI驱动
单片小菜 发表于 2023-11-13 17:16 | 显示全部楼层
屏幕的板子在哪里高的?
 楼主| WoodData 发表于 2023-11-13 17:34 | 显示全部楼层
单片小菜 发表于 2023-11-13 17:16
屏幕的板子在哪里高的?

自己画的板
forgot 发表于 2023-11-17 09:15 | 显示全部楼层
楼主这个屏下面左边那个大黑色的是什么?没看出来是什么
 楼主| WoodData 发表于 2023-11-17 14:08 | 显示全部楼层
forgot 发表于 2023-11-17 09:15
楼主这个屏下面左边那个大黑色的是什么?没看出来是什么

2轴的遥杆
jackcat 发表于 2023-12-4 09:04 | 显示全部楼层
主要涉及到如何使用SPI接口连接LCD显示屏
uiint 发表于 2023-12-4 16:10 | 显示全部楼层
根据LCD驱动器的数据手册和接口协议,编写相应的SPI驱动程序
tabmone 发表于 2023-12-5 14:21 | 显示全部楼层
在AT-START-F423开发板上,我们可以使用SPI接口连接LCD显示屏进行显示。
wengh2016 发表于 2023-12-5 18:24 | 显示全部楼层
对于SPI接口的LCD显示,AT-START-F423可以通过SPI接口与LCD驱动器进行通信,实现LCD的显示功能。
beacherblack 发表于 2023-12-5 19:46 | 显示全部楼层
SPI接口需要配置为Master模式,并设置相应的时钟分频因子、数据位宽、相位和极性等参数。
pl202 发表于 2023-12-6 17:14 | 显示全部楼层
使用SPI接口发送指令和数据,实现LCD显示屏的文本、图片等内容的显示。
yilin411 发表于 2023-12-9 08:08 | 显示全部楼层
学习学习
jst124 发表于 2023-12-10 20:11 | 显示全部楼层
好帖,谢谢分享
literliu 发表于 2024-8-29 19:42 | 显示全部楼层
好帖,谢谢分享
j2k 发表于 2024-10-24 11:40 | 显示全部楼层
学习
zhjb1 发表于 2024-11-12 20:44 | 显示全部楼层
硬件驱显SPI屏 不错
xiaoqi976633690 发表于 2024-11-28 16:29 | 显示全部楼层
学习了
gus96261 发表于 2024-12-22 12:29 | 显示全部楼层
学习学习,谢谢分享
qutian 发表于 2025-2-7 21:10 | 显示全部楼层
4444444444
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4778

帖子

28

粉丝
快速回复 在线客服 返回列表 返回顶部