机缘巧合之下博主手里拿到了5寸的一块液晶屏幕,驱动芯片是ILI9806G,手里刚好还有之前剩下的C8T6,苦于C8T6没有FSMC模块,博主突发奇想能不能自己模拟一下FSMC信号做个驱动把屏幕点亮,省流:失败了,来求助各位大佬的。下面是博主的历程。
刚开始研究了一些FSMC的原理,看了一下芯片的手册,总体来说就是信号控制线和数据线、地址线,针对不同的外设用FSMC不同的模式,这样看起来跟其他通讯协议差不多,于是就没有深入去钻研FSMC的协议,转而从芯片的信号入手,如下图。
这个图很明确的把信号组成给出来了,CS作为片选信号,RES复位信号,DC作为选择指令or数据信号,WR和RD分别是读取和写入的时钟信号,按照这个思路,博主写了一个简单的时序函数,不出意外地失败了,分析原因可能是没有考虑到信号的长度,用nop函数调整了每个函数中间的延时,也是没有成功,已经下单了ZET6的板子,贴出来博主写的函数给大佬看看,求助一下。
void Write_Comm(uint16_t comm) //写指令函数
{
HAL_GPIO_WritePin(GPIO_RESX, PIN_RESX, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_RDX, PIN_RDX, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_CSX, PIN_CSX, GPIO_PIN_RESET);
__nop();
__nop();
__nop();
__nop();
GPIO_DATA->ODR = comm;
__nop();
__nop();
__nop();
__nop();
HAL_GPIO_WritePin(GPIO_DCX, PIN_DCX, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIO_WRX, PIN_WRX, GPIO_PIN_RESET);
__nop();
__nop();
__nop();
__nop();
__nop();
HAL_GPIO_WritePin(GPIO_WRX, PIN_WRX, GPIO_PIN_SET);
__nop();
__nop();
__nop();
__nop();
__nop();
}
void Write_Data(uint16_t data) //写数据函数
{
HAL_GPIO_WritePin(GPIO_RESX, PIN_RESX, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_RDX, PIN_RDX, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_CSX, PIN_CSX, GPIO_PIN_RESET);
__nop();
__nop();
__nop();
__nop();
__nop();
GPIOB->ODR = data;
__nop();
__nop();
__nop();
__nop();
__nop();
HAL_GPIO_WritePin(GPIO_DCX, PIN_DCX, GPIO_PIN_SET);
__nop();
__nop();
__nop();
HAL_GPIO_WritePin(GPIO_WRX, PIN_WRX, GPIO_PIN_RESET);
__nop();
__nop();
__nop();
__nop();
__nop();
HAL_GPIO_WritePin(GPIO_WRX, PIN_WRX, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIO_DCX, PIN_DCX, GPIO_PIN_RESET);
}
补充一下,博主是用了PA1-PA6作为背光、片选这类信号,数据线使用了整个PB口,这中间也是在调节每个信号的位置和nop的数量,不过也是没有成功,上一级的函数是参考商家给的初始化函数和画点函数做的,现在正在尝试用定时器把信号长度统一一下再试试。