59 lines
2.4 KiB
Markdown
59 lines
2.4 KiB
Markdown
|
# LED_MATRIX驱动使用说明
|
|||
|
|
|||
|
#### 物理接口
|
|||
|
|
|||
|
led_matrix使用hub75接口驱动,驱动信号包括:
|
|||
|
|
|||
|
数据线:RGB0 3bit、RGB1 3bit、RGB2 3bit(预留)、RGB3 3bit(预留)
|
|||
|
|
|||
|
时钟线:1bit
|
|||
|
|
|||
|
控制线:行地址ABCD 4bit 、LAT锁存信号(高电平锁存)1bit、OE使能信号(低电平使能行输出) 1bit
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### 软件接口实现
|
|||
|
|
|||
|
使用 esp32 SDK 库中的 lcd_i80 接口实现16位并行数据输出,实现时钟线驱动下16bit数据的并行输出,并且内部采用dma方式传输;
|
|||
|
|
|||
|
使用 ledc PWM 实现 LAT 和 OE 信号的定时控制:LAT信号在定时器周期快结束时拉高锁存;OE信号在定时器周期中先低有效后高无效行输出,PWM占空比决定显示亮度,注意占空比设置必须在OE锁存信号之前;在定时器溢出中断中发送下一次显示的数据;
|
|||
|
|
|||
|
在 ulp riscv 协处理器中轮询捕获OE高电平,并在一次高电平中修改一次行地址(使用flag和CPU同步实现)。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### 文件组成
|
|||
|
|
|||
|
main/
|
|||
|
|
|||
|
* esp_lcd_common.h
|
|||
|
|
|||
|
* esp_lcd_panel_io_i80_hub75.c
|
|||
|
|
|||
|
esp_lcd_panel_io_i80_hub75.h
|
|||
|
|
|||
|
* led_matrix.c
|
|||
|
|
|||
|
led_matrix.h
|
|||
|
|
|||
|
* ulp/main.c
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### 文件说明
|
|||
|
|
|||
|
原 SDK 库中 esp_lcd_panel_io_i80.c、esp_lcd_panel_io_i80.c 实现的i80接口对某些引脚有检查,所以修改了某些检查,同时利用结构体中的format_buffer作为缓冲区,添加了一些结构体表项,并实现了映射以及发送数据的函数,作为文件 esp_lcd_panel_io_i80_hub75.c、esp_lcd_panel_io_i80_hub75.h,esp_lcd_common.h是其依赖头文件;
|
|||
|
|
|||
|
led_matrix.c、led_matrix.h 文件中对 led_matrix 整体进行初始化,并提供接口供用户调用。若后期板子大小做出调整,可以修改该文件的相关内容;
|
|||
|
|
|||
|
ulp/main.c 中是协处理器代码,注意需要编写main/CMakeLists.txt将协处理器代码嵌入进工程。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### 遗留问题
|
|||
|
|
|||
|
format_buffer 缓冲区出现过溢出问题,覆盖结构体其他表项,导致程序 panic ,*2后解决,但是并未发现原有分配大小有问题;
|
|||
|
|
|||
|
当亮度越大即OE使能越大时(超过1800),失能能到死区时间很少,导致地址线的改变不够及时,会导致对其他行的干扰。协处理器中对于地址的更新是一个一个设置的,可以直接写寄存器一次性设置,加快执行速度,优化这个问题;
|
|||
|
|
|||
|
刷新频率当前设置60HZ(刷整个8遍算一次),30HZ会导致闪烁严重。
|