> 文档中心 > 【MM32F5270开发板试用】一、2.8寸SPI屏幕点亮和触摸移植

【MM32F5270开发板试用】一、2.8寸SPI屏幕点亮和触摸移植


本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:卢阿涛

提示:下面只贴出部分代码,后续开发完后会提供完整代码。

一、前言

在上周,收到了MM32F5270开发板,多余的介绍就不说了(官网比较详细)。板子上集成了音频功放,可用IIS驱动音频芯片或者直接使用单片机的DAC输出音频,有SD卡可以存储数据,正好家里又有2.8寸的液晶屏,那就组合一下做个音乐播放器吧。

二、硬件接口

**2.8寸屏幕:**使用SPI1驱动(不使用PA4和PA5引脚,可复用为其它引脚)
**电阻触摸:**使用软件模拟SPI驱动
**音频:**使用芯片内置DAC驱动,因为通用性强(不考虑音质)。
**SD卡:**使用SPI3驱动(开发板连接好)

三、屏幕驱动

屏幕使用SPI1进行驱动,关于这一部分可以参考官方给的例程,这里只贴出SPI部分,关于屏幕其他部分都是一样的,此处省略。

void bsp_spi1_config(void){    SPI_Master_Init_Type    SPI_InitStructure;    GPIO_Init_Type   GPIO_InitStructure;    RCC_EnableAHB1Periphs(BSP_SPI1_GPIO_RCU, true);    RCC_EnableAPB2Periphs(BSP_SPI1_RCU, true);#if USB_SPI1_CS    /* CS */     GPIO_InitStructure.Pins = BSP_SPI1_CS_PIN;    GPIO_InitStructure.Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.PinMode = GPIO_PinMode_Out_PushPull;    GPIO_Init(BSP_SPI1_CS_PORT, &GPIO_InitStructure);    GPIO_PinAFConf(BSP_SPI1_CS_PORT, BSP_SPI1_CS_PIN, GPIO_AF_5);#endif    /* SCK */    GPIO_InitStructure.Pins = BSP_SPI1_SCK_PIN;    GPIO_InitStructure.Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.PinMode = GPIO_PinMode_AF_PushPull;    GPIO_Init(BSP_SPI1_SCK_PORT, &GPIO_InitStructure);    GPIO_PinAFConf(BSP_SPI1_SCK_PORT, BSP_SPI1_SCK_PIN, GPIO_AF_5);#if USB_SPI1_READ    /* MISO */    GPIO_InitStructure.Pins = BSP_SPI1_MISO_PIN;    GPIO_InitStructure.PinMode  = GPIO_PinMode_In_Floating;    GPIO_Init(BSP_SPI1_MISO_PORT, &GPIO_InitStructure);    GPIO_PinAFConf(BSP_SPI1_MISO_PORT, BSP_SPI1_MISO_PIN, GPIO_AF_5);#endif    /* MOSI */    GPIO_InitStructure.Pins = BSP_SPI1_MOSI_PIN;    GPIO_InitStructure.PinMode = GPIO_PinMode_AF_PushPull;    GPIO_Init(BSP_SPI1_MOSI_PORT, &GPIO_InitStructure);    GPIO_PinAFConf(BSP_SPI1_MOSI_PORT, BSP_SPI1_MOSI_PIN, GPIO_AF_5);    /* Setup SPI Master. */    SPI_InitStructure.ClockFreqHz = CLOCK_APB2_FREQ;    SPI_InitStructure.BaudRate = 40000000u;  /* 40Mhz. */    SPI_InitStructure.XferMode = SPI_XferMode_TxRx;    SPI_InitStructure.PolPha = SPI_PolPha_Alt2;  // CPOL = 1, CPHA = 1,    SPI_InitStructure.DataWidth = SPI_DataWidth_8b;    SPI_InitStructure.LSB = false;    SPI_InitStructure.AutoCS = false;  /* if set false, need SPI_EnableCS after spi enable. */    SPI_InitMaster(USB_SPI1, &SPI_InitStructure);    /* Enable SPI Master. */    SPI_Enable(USB_SPI1, true);}

发送和接收数据部分:

uint8_t spi1_send_byte(uint8_t byte){    /* Tx. */    while ( SPI_STATUS_TX_FULL & SPI_GetStatus(USB_SPI1) )    {}    SPI_PutData(USB_SPI1, byte);    /* Rx. */    while (0u == (SPI_STATUS_RX_DONE & SPI_GetStatus(USB_SPI1)) )    {}    return SPI_GetData(USB_SPI1);}

完成上面两部分之后,SPI就初始化好了。

四、触摸驱动

这里也是使用SPI驱动,大家可以使用硬件SPI,这里我就省事就直接用软件的了。

void bsp_software_spi_config(void){    GPIO_Init_Type GPIO_InitStructure;    RCC_EnableAHB1Periphs(BSP_SOFTWARE_SPI_SCK_RCU|BSP_SOFTWARE_SPI_MOSI_RCU, true);#if USB_SOFTWARE_SPI_READ    RCC_EnableAHB1Periphs(BSP_SOFTWARE_SPI_MISO_RCU, true);#endif    /* SCK */    GPIO_InitStructure.Pins = BSP_SOFTWARE_SPI_SCK_PIN;    GPIO_InitStructure.Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.PinMode = GPIO_PinMode_Out_PushPull;    GPIO_Init(BSP_SOFTWARE_SPI_SCK_PORT, &GPIO_InitStructure);#if USB_SOFTWARE_SPI_READ    /* MISO */    GPIO_InitStructure.Pins = BSP_SOFTWARE_SPI_MISO_PIN;    GPIO_InitStructure.Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.PinMode = GPIO_PinMode_In_PullUp; // 输入上拉    GPIO_Init(BSP_SOFTWARE_SPI_MISO_PORT, &GPIO_InitStructure);#endif    /* MOSI */    GPIO_InitStructure.Pins = BSP_SOFTWARE_SPI_MOSI_PIN;    GPIO_InitStructure.Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.PinMode = GPIO_PinMode_Out_PushPull;    GPIO_Init(BSP_SOFTWARE_SPI_MOSI_PORT, &GPIO_InitStructure);}/********************************************@功能:软件SPI写入一个字节 @日期:2022-08-14 09:03@作者:lengyuefeng@说明:@参数: 无@返回值: 无*********************************************/static void software_spi_write_byte(uint8_t byte){    uint8_t i = 0;for(i = 0; i < 8; i++)      { if(byte&0x80)     BSP_SOFTWARE_SPI_MOSI_WRITE(1);  else      BSP_SOFTWARE_SPI_MOSI_WRITE(0);    byte <<= 1;     BSP_SOFTWARE_SPI_SCK_WRITE(0);      BSP_SOFTWARE_SPI_SCK_WRITE(1); //上升沿有效  }}/********************************************@功能:软件SPI写入一个字节 @日期:2022-08-14 09:03@作者:lengyuefeng@说明:@参数: 无@返回值: 无*********************************************/static uint16_t software_spi_read_byte(void){    uint8_t i = 0;uint16_t byte = 0;    BSP_SOFTWARE_SPI_SCK_WRITE(0);     BSP_SOFTWARE_SPI_DELAY_US(6);    BSP_SOFTWARE_SPI_SCK_WRITE(1); //给1个时钟,清除BUSY      BSP_SOFTWARE_SPI_SCK_WRITE(0); for(i = 0; i < 12; i++)      { byte <<= 1;BSP_SOFTWARE_SPI_SCK_WRITE(0);    //下降沿有效    BSP_SOFTWARE_SPI_SCK_WRITE(1); if(BSP_SOFTWARE_SPI_MISO_READ())     byte ++; }    return byte;}/********************************************@功能:uint8_t software_spi_send_byte(uint8_t byte)@日期:2022-08-14 09:03@作者:lengyuefeng@说明:@参数: 无@返回值: 无*********************************************/uint16_t software_spi_send_byte(uint8_t byte){    BSP_SOFTWARE_SPI_SCK_WRITE(0); //先拉低时钟   BSP_SOFTWARE_SPI_MOSI_WRITE(0);     //拉低数据线    software_spi_write_byte(byte);    BSP_SOFTWARE_SPI_DELAY_US(1);    return software_spi_read_byte();}

五、测试

完成屏幕移植和触摸移植之后,可以测试一下功能。这里屏幕就简单显示一下,然后触摸呢,写了一个测试矫正函数。

显示部分:

ScreenGUI_DrawFontGBK32((OLED_W-32*5)/2,30,BLACK,WHITE,"音乐播放器");    ScreenGUI_ShowPicture(30,OLED_H-50-30,50,50,gImage_pic_music);    ScreenGUI_ShowPicture(OLED_W / 2 - 25,OLED_H-50-30,50,50,gImage_pic_video);    ScreenGUI_ShowPicture(OLED_W-30-50,OLED_H-50-30,50,50,gImage_pic_setting);

测试效果:

【MM32F5270开发板试用】一、2.8寸SPI屏幕点亮和触摸移植

触摸部分:
用触摸测试函数,首先会在左上角出现字符,点击之后消失,然后出现在右上角,以此类推,会出现在四个角。
测试效果:

【MM32F5270开发板试用】一、2.8寸SPI屏幕点亮和触摸移植

【MM32F5270开发板试用】一、2.8寸SPI屏幕点亮和触摸移植

六、后续

音乐播放器在开发中,一切从简(没有使用lvgl等图形库,纯贴图),不做太复杂的界面,也没有特别多的功能,只有音乐播放这一个功能。

郁金香导航