PB03F学习SPI方式驱动LCD

[复制链接]
查看542 | 回复1 | 2024-10-31 08:59:50 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-10-31 09:54 编辑

一、准备
例程中有一个SPI读写flash的例子:phy6222_v313_0512\example\peripheral\spiflash

拿它做模板修改下驱动LCD,copy一份spiflash到spilcd,加了一个LCD驱动文件,去掉了spiflash.c
2.png

2、OSAL初始化和事件处理函数
没做修改,还是利用spi_demo_ProcessEvent
  1. __ATTR_SECTION_SRAM__ const pTaskEventHandlerFn tasksArr[] =
  2. {
  3.     LL_ProcessEvent,
  4.     spi_demo_ProcessEvent,
  5. };

  6. __ATTR_SECTION_SRAM__ const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr[0] );
  7. uint16* tasksEvents;
复制代码
这里也是,还是用spi_demo_Init来初始化task
  1. void osalInitTasks( void )
  2. {
  3.     uint8 taskID = 0;
  4.     tasksEvents = (uint16*)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  5.     osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
  6.     LL_Init( taskID++);
  7.     /* Application */
  8.     spi_demo_Init(taskID);
  9. }
复制代码


3、spiflash_demo.c

没有改文件名,还用原例程的名字。
有两个SPI模块可选,这里选择SPI0
  1. hal_spi_t spiflash_spi =
  2. {
  3.     .spi_index = SPI0,                        //SPI 模块选择
  4. };
复制代码
SPI0的初始化数据
  1. spi_Cfg_t spi_cfg =
  2. {
  3.     .sclk_pin = GPIO_P07,
  4.     .ssn_pin = GPIO_DUMMY,                //GPIO_DUMMY
  5.     .MOSI = GPIO_P24,
  6.     .MISO = GPIO_P23,

  7.     .baudrate = 8000000,                        //SPI 波特率
  8.     .spi_tmod = SPI_TXD,                        //SPI 使用场景
  9.     .spi_scmod = SPI_MODE0,                //SPI 工作模式
  10.     .spi_dfsmod = SPI_1BYTE,        //每次SPI 1个byte

  11.     #if DMAC_USE
  12.     .dma_tx_enable = false,
  13.     .dma_rx_enable = false,               
  14.     #endif

  15.     .int_mode = false,                                //是否中断模式
  16.     .force_cs = true,                                        //true手动设置cs
  17.     .evt_handler = spi_cb,                //SPI 传输完成回调函数
  18. };
复制代码


DMA初始化数据
  1. HAL_DMA_t dma_cfg =
  2. {
  3.     .dma_channel = DMA_CH_0,
  4.     .evt_handler = dma_cb,
  5. };
复制代码
  1. void spi_cb(spi_evt_t* evt)
  2. {
  3. }

  4. void dma_cb(DMA_CH_t ch)
  5. {
  6. }
复制代码


OSAL的TASK初始化函数,每隔1秒中触发一个TIMER_1S_ONCE事件,但是TIMER_1S_ONCE事件基本不做任何事情。
  1. void spi_demo_Init( uint8 task_id )
  2. {
  3.     spi_TaskID = task_id;
  4.     hal_dma_init();
  5.     spi_lcd_init();
  6.                
  7.     osal_start_reload_timer( spi_TaskID, TIMER_1S_ONCE, 2000);

  8. }
复制代码


事件处理函数,可以看到TIMER_1S_ONCE,只打印个LOG

  1. uint16 spi_demo_ProcessEvent( uint8 task_id, uint16 events )
  2. {
  3.     if (events & TIMER_1S_ONCE )
  4.     {
  5.         LOG("\n2s:recycle mode\n");
  6.         return (events ^ TIMER_1S_ONCE);
  7.     }

  8.     return 0;
  9. }
复制代码

spi_lcd_init(),初始化SPI、DMA_CHANNEL、LCD

  1. void spi_lcd_init(void)
  2. {
  3.           uint8_t retval = PPlus_SUCCESS;
  4.        
  5.                 //配置使能 SPI 模块
  6.     retval = hal_spi_bus_init(&spiflash_spi,spi_cfg);

  7.     if(retval != PPlus_SUCCESS)
  8.     {
  9.         LOG("spi init err!please check it!\n");
  10.     }

  11.     retval = hal_dma_init_channel(dma_cfg);

  12.     if(retval != PPlus_SUCCESS)
  13.     {
  14.         LOG("dma init err!please check it!\n");
  15.     }
  16.                
  17.                 ST7735_Init();
  18. }
复制代码




4、ST7735.C
CS、DC、RST、背光定义和驱动
  1. #define LCD_CS          GPIO_P20                        //
  2. #define LCD_DC          GPIO_P03                        //
  3. #define LCD_RST          GPIO_P02                        //
  4. #define LCD_LED          GPIO_P34                        //

  5. #define LCD_CS_SET()                 hal_gpio_write(LCD_CS,1);
  6. #define LCD_CS_RESET()  hal_gpio_write(LCD_CS,0);

  7. #define LCD_DC_SET()                 hal_gpio_write(LCD_DC,1);
  8. #define LCD_DC_RESET()         hal_gpio_write(LCD_DC,0);

  9. #define LCD_RST_SET()         hal_gpio_write(LCD_RST,1);
  10. #define LCD_RST_RESET() hal_gpio_write(LCD_RST,0);

  11. #define LCD_LED_SET()         hal_gpio_write(LCD_LED,1);
  12. #define LCD_LED_RESET() hal_gpio_write(LCD_LED,0);
复制代码
利用hal_spi_send_byte函数向SPI总线发送1BTYE数据
  1. void LCD_SPI_TxData_Polling(uint8_t *Buffer, uint8_t Length)
  2. {
  3.     uint8_t i = 0, Data = 0;

  4.     for (i = 0; i < Length; i++)
  5.     {
  6.                                 hal_spi_send_byte(&spiflash_spi,Buffer[i]);
  7.     }
  8. }
复制代码
写指令、写数据、发送连续数据
  1. /*写指令*/
  2. void LCD_WriteIndex(uint8_t index)
  3. {
  4.         LCD_CS_RESET();
  5.         LCD_DC_RESET();
  6.         LCD_SPI_TxData_Polling(&index,1);
  7.         LCD_CS_SET();
  8. }
  9. /*写数据*/
  10. void LCD_WriteData(uint8_t *Buffer, uint8_t Length)
  11. {
  12.         LCD_CS_RESET();
  13.         LCD_DC_SET();
  14.         LCD_SPI_TxData_Polling(Buffer,Length);
  15.         LCD_CS_SET();
  16. }

  17. void ST7735_SendData(uint8_t cmd, uint8_t *data, uint16_t length)
  18. {
  19.         LCD_WriteIndex(cmd);
  20.         LCD_WriteData(data,length);
  21. }
复制代码
ST7735_Init

  1. void ST7735_Init(void)
  2. {
  3.         char buf[16];
  4.         LCD_LED_SET();
  5.         
  6.         
  7.         ST7735_HardReset();
  8.         ST7735_SendInitStr();
  9.         GUI_Clear(COLOR_Red);

  10.         
  11.         WaitMs(1000);
  12.         GUI_Clear(COLOR_Green);
  13.         
  14.         WaitMs(1000);
  15.         GUI_Clear(COLOR_Blue);
  16.         GUI_WriteASCII8x16(10,10,"PB-03F ",COLOR_White,COLOR_Blue);
  17.         GUI_WriteASCII8x16(10,30,"ST7735",COLOR_White,COLOR_Blue);
  18.         GUI_WriteASCII8x16(10,50,"SPI Drive LCD",COLOR_White,COLOR_Blue);
  19.         WaitMs(1000);
  20. }
复制代码


5、实际效果
tutieshi_320x180_7s.gif
回复

使用道具 举报

爱笑 | 2024-10-31 09:20:35 | 显示全部楼层
资料越来越多~
用心做好保姆工作
回复 支持 反对

使用道具 举报

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

本版积分规则