[活动专区] 【N32G430开发板试用】硬件SPI驱动0.96英寸LCD

[复制链接]
 楼主| 740071911 发表于 2022-7-11 19:39 | 显示全部楼层 |阅读模式
<
本帖最后由 740071911 于 2022-7-11 19:41 编辑

#有奖活动# #申请原创# @安小芯
以前薅羊毛买的合宙LuatOS的LCD屏,因为需要使用Lua,也不支持c底层,所以一直没有玩过,
趁着N32G430活动,先研究一下LCD。
因为官方不支持c底层,所以要自己摸索,不过基于spi通信,想来是不难的,先看原理图
QQ图片20220710221522.png
图片不清楚,我在右边整理了一下管脚
再看看实物图
QQ图片20220710221329.jpg
我的硬件连接
  1. BLK-------PB8
  2. CS--------PB7
  3. RS--------PB6
  4. RESET---PB5
  5. //SPI
  6. SCL-------PA5
  7. SDA------PA7


其中用到N32G430---SPI1

  1. #include "spi.h"

  2. #define MX_SPI_INDEX    0

  3. void MX_SPI_Init(void)
  4. {
  5. #if MX_SPI_INDEX==0
  6.    
  7.     SPI_InitType SPI_InitStructure;

  8.     SPI_I2S_Reset(SPI_MASTER);
  9.     //SPI_I2S_Reset(SPI_SLAVE);

  10.     /* SPI_MASTER configuration --------------------------------------------------*/
  11.     SPI_Initializes_Structure(&SPI_InitStructure);
  12.     SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
  13.     SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
  14.     SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
  15.     SPI_InitStructure.CLKPOL        = SPI_CLKPOL_LOW;
  16.     SPI_InitStructure.CLKPHA        = SPI_CLKPHA_FIRST_EDGE;
  17.     SPI_InitStructure.NSS           = SPI_NSS_SOFT;
  18.     /* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
  19.     SPI_InitStructure.BaudRatePres  = SPI_BR_PRESCALER_8;//64/8
  20.     SPI_InitStructure.FirstBit      = SPI_FB_MSB;
  21.     SPI_InitStructure.CRCPoly       = 7;
  22.     SPI_Initializes(SPI_MASTER, &SPI_InitStructure);
  23.    
  24.     SPI_Set_Nss_Level(SPI_MASTER, SPI_NSS_HIGH);

  25.     /* Enable SPI_MASTER CRC calculation */
  26.     SPI_CRC_Enable(SPI_MASTER);
  27.    
  28. #ifdef HARDWARE_NSS
  29.         SPI_NSS_Config(SPI_MASTER, SPI_NSS_HARD);
  30.         SPI_SS_Output_Enable(SPI_MASTER);
  31.         SPI_NSS_Config(SPI_SLAVE, SPI_NSS_HARD);
  32. #endif

  33.     /* Enable SPI_MASTER */
  34.     SPI_ON(SPI_MASTER);
  35.    
  36. #elif MX_SPI_INDEX==1

  37.     GPIO_InitType ioConfig;

  38.     /* Enable LCD related GPIO peripheral clock */
  39.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA); /*
  40.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOB);
  41.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOC);
  42.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOD); */

  43.     //SPI1: PA4,PA5,PA6,PA7
  44.     GPIO_Structure_Initialize(&ioConfig);
  45.     /* Configure master pins: SCK, MISO and MOSI ---------------------------------*/
  46.     /* Confugure SCK and MOSI pins as Alternate Function Push Pull */
  47.     ioConfig.Pin            = SPI_MASTER_MOSI_PIN | SPI_MASTER_CLK_PIN | SPI_MASTER_NSS_PIN;
  48.     ioConfig.GPIO_Mode      = GPIO_MODE_OUT_PP;
  49.     ioConfig.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW;
  50.     GPIO_Peripheral_Initialize(SPI_MASTER_GPIO_PORT, &ioConfig);
  51.    
  52.     GPIO_Structure_Initialize(&ioConfig);
  53.     /* Confugure MISO pins as Push Pull Input */
  54.     ioConfig.Pin            = SPI_MASTER_MISO_PIN;
  55.     ioConfig.GPIO_Mode      = GPIO_MODE_INPUT;
  56.     ioConfig.GPIO_Slew_Rate = GPIO_SLEW_RATE_SLOW;
  57.     ioConfig.GPIO_Pull      = GPIO_PULL_UP;
  58.     GPIO_Peripheral_Initialize(SPI_MASTER_GPIO_PORT, &ioConfig);
  59.    
  60. #elif MX_SPI_INDEX==20

  61.     GPIO_InitType ioConfig;
  62.         SPI_InitType spiConfig;
  63.    
  64.     intx_alloc();

  65.         //开启时钟
  66.         intx_disable();
  67.         RCC_APB2_Peripheral_Clock_Enable(RCC_APB2_PERIPH_SPI1 | RCC_APB2_PERIPH_AFIO);
  68.     RCC_AHB_Peripheral_Clock_Enable(RCC_AHB_PERIPH_GPIOA);
  69.         intx_enable();
  70.    
  71.     //SPI1: PA4,PA5,PA6,PA7
  72.     GPIO_Structure_Initialize(&ioConfig);
  73.     /* Configure master pins: SCK, MISO and MOSI ---------------------------------*/
  74.     /* Confugure SCK and MOSI pins as Alternate Function Push Pull */
  75.     ioConfig.Pin        = SPI_MASTER_MOSI_PIN | SPI_MASTER_CLK_PIN | SPI_MASTER_MISO_PIN | SPI_MASTER_NSS_PIN;
  76.     ioConfig.GPIO_Mode  = GPIO_MODE_AF_PP;
  77.     ioConfig.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
  78.     ioConfig.GPIO_Alternate = SPI_MASTER_GPIO_ALTERNATE;
  79.     GPIO_Peripheral_Initialize(SPI_MASTER_GPIO_PORT, &ioConfig);
  80.         
  81.     SPI_I2S_Reset(SPI_MASTER);

  82.         // SPI 配置
  83.     //SPI_DIR_DOUBLELINE_FULLDUPLEX
  84.     //
  85.     spiConfig.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
  86.     spiConfig.SpiMode       = SPI_MODE_MASTER;
  87.     spiConfig.DataLen       = SPI_DATA_SIZE_8BITS;
  88.     spiConfig.CLKPOL        = SPI_CLKPOL_HIGH;
  89.     spiConfig.CLKPHA        = SPI_CLKPHA_SECOND_EDGE;
  90.     spiConfig.NSS           = SPI_NSS_SOFT;
  91.     spiConfig.FirstBit                 = SPI_FB_MSB;
  92.     spiConfig.CRCPoly                  = 7;
  93.     spiConfig.BaudRatePres         = SPI_BR_PRESCALER_128;
  94.         SPI_Initializes(LCD_SPI, &spiConfig);
  95.    
  96.         //SPI_SS_Output_Enable(LCD_SPI);
  97.         SPI_Set_Nss_Level(LCD_SPI, SPI_NSS_HIGH);
  98.         SPI_ON(LCD_SPI);
  99.    
  100. #endif

  101. }


  102. /*
  103. SPI读取字节函数
  104. */
  105. u8 SPI_ReadWriteByte(SPI_Module* SPIx, u8 TxData)
  106. {
  107.     u8 retry=0;

  108.     while (SPI_I2S_Flag_Status_Get(SPIx, SPI_I2S_FLAG_TE) == RESET)
  109.     {
  110.         retry++;
  111.         if(retry>200) return 0;
  112.     }
  113.    
  114.     SPI_I2S_Data_Transmit(SPIx, TxData);
  115.     retry=0;

  116.     while (SPI_I2S_Flag_Status_Get(SPIx, SPI_I2S_FLAG_RNE) == RESET)
  117.     {
  118.         retry++;
  119.         if(retry>200) return 0;
  120.     }
  121.    
  122.     return SPI_I2S_Data_Get(SPIx);
  123. }


  124. /*
  125. SPI读取字节函数
  126. */
  127. #if MX_SPI_INDEX==0

  128. u8 SPI_WriteByte(SPI_Module* SPIx, u8 Byte)
  129. {
  130.     /* Wait for SPI_MASTER Tx buffer empty */
  131.     while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_TE) == RESET);
  132.    
  133.     /* Send SPI_SLAVE data */
  134.     SPI_I2S_Data_Transmit(LCD_SPI, Byte);
  135.    
  136.     /* Wait for SPI_SLAVE data reception */
  137.     while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_RNE) == RESET);
  138.    
  139.     return SPIx->DAT; //返回收到的数据                        
  140. }

  141. #elif MX_SPI_INDEX==1

  142. u8 SPI_WriteByte(SPI_Module* SPIx, u8 Byte)
  143. {
  144.    
  145. }

  146. #elif MX_SPI_INDEX==20

  147. u8 SPI_WriteByte(SPI_Module* SPIx, u8 Byte)
  148. {
  149.     while((SPIx->STS & SPI_I2S_FLAG_TE) == RESET);  //等待发送区空         
  150.    
  151.     SPIx->DAT = Byte; //发送一个byte
  152.    
  153.     while((SPIx->STS & SPI_I2S_FLAG_RNE) == RESET); //等待接收完一个byte  
  154.    
  155.     return SPIx->DAT; //返回收到的数据                        
  156. }

  157. #endif

其中需要注意的是,软件片选的时候,必须添加这个函数,使能SPI主模式
  1. SPI_Set_Nss_Level(SPI_MASTER, SPI_NSS_HIGH);
这是之前国民技术群里前辈踩过的坑,让我们少走弯路,表示感谢。
可以参看产品手册SPI1配置说明:
QQ图片20220710222912.png
接下来主要就是对屏幕的操作,基本操作就不贴了,官方是基于lua,所以有不少功能还需要慢慢移植,先来刷图。
  1. /*----------------------------------------------------------------------------*/
  2. /*----------------------------------------------------------------------------*/
  3. //画图
  4. void LCD_DrawPic(u16 x,u16 y,const unsigned char *p)
  5. {
  6.           int i;
  7.         unsigned char picH,picL;
  8.    
  9.         LCD_SetWindows(x,y,x+128-1,y+80-1);
  10.    
  11.     for(i=0;i<128*80;i++)
  12.         {        
  13.                  picL=*(p+i*2);
  14.                 picH=*(p+i*2+1);                                
  15.                 Lcd_WriteData_16Bit(picH<<8|picL);                                                  
  16.         }
  17.    
  18.         LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
  19. }
这些都不重要,我幂才是唯一!
R-C.jpg

再来看看实际显示效果如何
微信图片_20220711193612.jpg
哈哈,大幂幂很能打呀。
最后附上程序代码,
希望能增加.7z这种附件格式@21ic小管家
N32G430C8L7-STB-v1.1.zip (90.8 KB, 下载次数: 50)

guijial511 发表于 2022-7-11 20:40 来自手机 | 显示全部楼层
还是个彩色屏啊!

评论

精致吧  发表于 2022-7-12 08:57
yangxiaor520 发表于 2022-7-12 08:33 来自手机 | 显示全部楼层
这个屏确实够小巧的
 楼主| 740071911 发表于 2022-7-12 08:58 | 显示全部楼层
yangxiaor520 发表于 2022-7-12 08:33
这个屏确实够小巧的

哈哈,可以考虑入手一个,便宜啊
看电池 发表于 2022-8-19 17:54 | 显示全部楼层
感谢大佬,大佬牛批
handsomeliang 发表于 2022-8-26 22:14 | 显示全部楼层
是软件模拟spi吗
linfelix 发表于 2022-12-2 21:43 | 显示全部楼层
这个的驱动芯片是哪个?
              
nomomy 发表于 2022-12-4 19:51 | 显示全部楼层
可以使用dma配置spi使用的吗?
51xlf 发表于 2022-12-4 21:01 | 显示全部楼层
spi需要配置速率的吗?这个最大支持多少帧的刷屏速度呢
jkl21 发表于 2022-12-4 21:51 | 显示全部楼层
LCD和OLED哪个好用一些呢?
wangdezhi 发表于 2023-1-5 11:48 | 显示全部楼层
这个不是有iic接口的lcd吗              
tabmone 发表于 2023-1-5 14:55 | 显示全部楼层
这个的驱动芯片的型号是什么呢?              
pixhw 发表于 2023-1-5 16:52 | 显示全部楼层
oled的效果还不错              
burgessmaggie 发表于 2023-1-5 17:21 | 显示全部楼层
能不能移植arduino的驱动库过来
ccook11 发表于 2023-1-6 13:11 | 显示全部楼层
硬件spi的速度就是快一些。              
qiufengsd 发表于 2023-1-6 13:53 | 显示全部楼层
可以使用dma驱动这个的代码吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:想低声说句不在乎,可会飞的心总是在高处!

48

主题

887

帖子

5

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