[活动专区] 【AT-START-F407测评】+ 硬件SPI驱动LCD

[复制链接]
879|0
 楼主| qjp1988113 发表于 2021-1-30 14:09 | 显示全部楼层 |阅读模式
今天我们来搞下,用AT407板子的ardunio 接口的SPI来驱动LCD屏幕,它的芯片是XH8347D~诚如我在群里面说的,板子硬件设计时,一些引脚的复用,还是没考虑到位~
就如PA8引脚,可以选择一边可接到SPI FLASH 的NSS端,或者PA8_E端,然后PA8_E就是连接到ardunio接口上,但是他有把PA8_E又通过R64接到了
DM9162的REF_CLOCK_25M。
M0.png
M1.png
废话不多说,我用的LCD接口正好用到了PA8,只好焊掉了R64再调试~
屏幕ardunio接口:
M3.jpg
我们配置好SPI先:
  1. static void SPI1_GPIO_Configuration(void)
  2. {
  3.   GPIO_InitType GPIO_InitStructure;

  4.         RCC_APB2PeriphClockCmd(SPI1_GPIO_CLK|RCC_APB2PERIPH_SPI1|RCC_APB2PERIPH_AFIO, ENABLE);
  5.        
  6.          /* Configure SPI_FLASH pins*/
  7.   GPIO_InitStructure.GPIO_Pins =  SPI1_PIN_MOSI;
  8.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  10.   GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);

  11.   GPIO_InitStructure.GPIO_Pins = SPI1_PIN_MISO;
  12.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;  
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14.   GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);

  15.   GPIO_InitStructure.GPIO_Pins =  SPI1_PIN_SCK;
  16.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  18.   GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
  19.        
  20.         //CS
  21.   GPIO_InitStructure.GPIO_Pins = LCD_CS_PIN;
  22.   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;  
  23.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  24.   GPIO_Init(LCD_CS_GPIO, &GPIO_InitStructure);  
  25.        
  26. }

  27. //SPI1 初始化
  28. void SPI1_Init(void)
  29. {

  30.         SPI_InitType   SPI_InitStructure;
  31.        
  32.         /* Enable SPIy clock and GPIO clock for SPIy and SPIz */
  33.   RCC_APB2PeriphClockCmd(SPI1_CLK , ENABLE);

  34.   /* 1st phase: SPI1 Master */
  35.   /* GPIO configuration ------------------------------------------------------*/
  36.   SPI1_GPIO_Configuration();
  37.        
  38.         //CS 置高
  39.         __LCD_CS_SET();
  40.   
  41.   /* SPI1 Config -------------------------------------------------------------*/
  42.   SPI_DefaultInitParaConfig(&SPI_InitStructure);
  43.   SPI_InitStructure.SPI_TransMode = SPI_TRANSMODE_FULLDUPLEX;
  44.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2EDGE;
  45.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_HIGH;
  46.         SPI_InitStructure.SPI_CPOLY = 0;
  47.         SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
  48.   SPI_InitStructure.SPI_FrameSize = SPI_FRAMESIZE_8BIT;
  49.         SPI_InitStructure.SPI_MCLKP = SPI_MCLKP_8;
  50.   SPI_InitStructure.SPI_NSSSEL = SPI_NSSSEL_SOFT;
  51.         SPI_InitStructure.SPI_Mode = SPI_MODE_MASTER;
  52.   
  53.   SPI_Init(SPI1, &SPI_InitStructure);

  54.   
  55.   /* Enable SPI1 */
  56.   SPI_Enable(SPI1, ENABLE);

  57. }
然后编写SPI发送读取已个字节的函数:
  1. unsigned int SPI1ReadWriteByte(unsigned char tx_data)
  2. {
  3.        
  4.                 /* Wait for SPIy Tx buffer empty */
  5.     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TE) == RESET);

  6.     /* Send SPIy data */
  7.     SPI_I2S_TxData(SPI1,tx_data);

  8.     /* Wait for SPIy data reception */
  9.     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RNE) == RESET);
  10.     /* Read SPIy received data */
  11.     return SPI_I2S_RxData(SPI1);
  12.        
  13. }
下面就对LCD的其他引脚进行配置:
这里用到PA15,PA15又关联到JTAG的JDI,引脚,所以首先要remap引脚,到关闭JTAG仅有SWD的功能配置上,这样就释放了PA15:
  1. GPIO_PinsRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//释放PA15  PB3  PB4
引脚配置:
  1. void lcd_port_init(void)
  2. {

  3.         GPIO_InitType GPIO_InitStructure;

  4.         RCC_AHBPeriphClockCmd(RCC_APB2PERIPH_GPIOA| RCC_APB2PERIPH_GPIOC||RCC_APB2PERIPH_AFIO , ENABLE);
  5.   //调试仅SWD
  6.         GPIO_PinsRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//释放PA15  PB3  PB4
  7.        
  8.         GPIO_StructInit(&GPIO_InitStructure);
  9.         //LCD-CS  PA15
  10.         GPIO_InitStructure.GPIO_Pins = LCD_CS_PIN;                            
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  12.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  13.         GPIO_Init(LCD_CS_GPIO, &GPIO_InitStructure);
  14.         //LCD-DC  PA8
  15.         GPIO_InitStructure.GPIO_Pins = LCD_DC_PIN;                            
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  17.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  18.         GPIO_Init(LCD_DC_GPIO, &GPIO_InitStructure);
  19.         //LCD-BKL PC7
  20.         GPIO_InitStructure.GPIO_Pins = LCD_BKL_PIN;                           
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
  22.         GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  23.         GPIO_Init(LCD_BKL_GPIO, &GPIO_InitStructure);

  24. }
其他的都是写LCD相关的函数,这里就不一一列出了。
下载调试:
6a5b.gif
程序(把库集在一起了): SPI_LCD.rar (5.24 MB, 下载次数: 38)

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

本版积分规则

111

主题

627

帖子

2

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