OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2505|回复: 2

ILI9341液晶屏往GRAM里写0XFFFF就会出错?!!

[复制链接]

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
发表于 2018-1-16 23:42:23 | 显示全部楼层 |阅读模式
1金钱
某宝买了块兼容原子哥开发板的液晶,不过我是单独用C8T6核心板接杜邦线的,用IO口模拟16位8080接口时序。
液晶的D0-D15用整组PB口,其他的控制端用PA的若干个口。PB3、PB4的JTAG功能已经关掉。

但由于PB2是BOOT1引出而且接了个10K电阻,测试过如果D2用这个脚,往GRAM里写0XFFFF(白色)时会卡住,不过写其他颜色就没问题,有点费解。。。
所以D2改用PA12代替,然后写0XFFFF是正常了,但写了一次之后再也不能写任何颜色了,现象不是黑屏就是白屏。这时候奇怪的地方来了,在debug里调出PA、PB的状态窗口,只要点击和液晶控制相关的ODR寄存器的任何一个位,0就白屏1就黑屏。已经确定不是背光问题,因为黑屏时还会微亮。其他颜色代码只要不是0XFFFF都没问题。。。


还有个疑问就是,8080接口不是速度很快吗,为什么刷一次屏要300ms左右??眼睛都能看到刷的过程。有人用SPI都能30帧/s是怎么做到的?

[mw_shl_code=c,true]/***************** LCD 8080接口时序 *****************/
/*------- 写命令时序 ----------*/
void LCD_WR_CMD(unsigned short dat)//一组IO口16位,所以数据是16位的
{
        LCD_CS_0;//片选拉低
        LCD_RS_0;//RS为0是写命令
        LCD_WR_0;//写操作,先拉低以便产生上升沿
        LCD_RD_1;
       
        DATAOUT(dat)//往数据口放数据
        if((dat&0x0004) == 0x0004) D2out = 1;
        else D2out = 0;
       
        LCD_WR_1;
        LCD_CS_1;//片选拉高
}

/*------- 写数据时序 --------*/
void LCD_WR_DAT(unsigned short dat)
{
        LCD_CS_0;
        LCD_RS_1;//RS为1是写数据
        LCD_WR_0;//写操作,先拉低以便产生上升沿
        LCD_RD_1;
       
        DATAOUT(dat)
        if((dat&0x0004) == 0x0004) D2out = 1;
        else D2out = 0;       

        LCD_WR_1;
        LCD_CS_1;
}

/*-------- 读数据时序 -----------*/
unsigned short LCD_RD_DAT(void)
{
        u16 dat = 0;
        Input_mode();//IO口模式设置为输入模式以便接收数据
       
        LCD_CS_0;
        LCD_RS_1;//数据
        LCD_WR_1;
        LCD_RD_0;//读操作,先拉低以便产生上升沿
        delay_us(5);
       
        dat = DATAIN//取出IDR里的数据
       
        if(D2in) dat = dat | 0x0004;
        else dat = dat & (~0x0004);
       
        LCD_RD_1;
        LCD_CS_1;
       
        Output_mode();//IO口模式换回输出模式
       
        return dat;
}[/mw_shl_code]

[mw_shl_code=c,true]
/*------- 清屏函数 -------*/
void LCD_Clear(u16 color)//填充的颜色
{
        u32 i;
       
        LCD_WR_CMD(LCD_CMD_COLADDR);//设置列地址
        LCD_WR_DAT(0x00);       //列开始地址0(0x0000)
        LCD_WR_DAT(0x00);
        LCD_WR_DAT(0x00);                //列结束地址239(0x00ef)
        LCD_WR_DAT(0xef);
       
        LCD_WR_CMD(LCD_CMD_ROWADDR);//设置行地址
        LCD_WR_DAT(0x00);       //行开始地址0(0x0000)
        LCD_WR_DAT(0x00);       
        LCD_WR_DAT(0x01);                //行结束地址319(0x013f)
        LCD_WR_DAT(0x3f);       
       
        LCD_WR_CMD(LCD_CMD_GRAM);//开始写显示数据
       
        for(i=0;i<76800;i++) LCD_WR_DAT(color);//一共240*320=76800个点
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

D2的问题,仿真看D2的波形就知道了 至于背光忽闪忽闪的,检查背光控制脚是不是也顺带被你设置了? 至于速率,8080并口,是你的MCU有硬件并口,才会快,否则是比较慢的。 SPI 30帧,你自己计算SPI时钟就知道了。STM32F1最快18M,那么18M/320/240/8/2, 是最快速度,不可能比这个快。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-1-16 23:42:24 | 显示全部楼层
D2的问题,仿真看D2的波形就知道了
至于背光忽闪忽闪的,检查背光控制脚是不是也顺带被你设置了?

至于速率,8080并口,是你的MCU有硬件并口,才会快,否则是比较慢的。
SPI 30帧,你自己计算SPI时钟就知道了。STM32F1最快18M,那么18M/320/240/8/2,  是最快速度,不可能比这个快。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
 楼主| 发表于 2018-1-17 16:56:07 | 显示全部楼层
正点原子 发表于 2018-1-16 23:42
D2的问题,仿真看D2的波形就知道了
至于背光忽闪忽闪的,检查背光控制脚是不是也顺带被你设置了?

已经确定那个黑屏白屏不是背光引起的呀。是整个屏幕像的像素全白或全黑,看起来像背光问题,其实不是的。。。只要往GRAM里写FFFF就会这样。我看波形也挺符合时序的。。。
速率问题,如果用FSMC是不是能超过30帧?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表