打印
[STM32F1]

STM32的硬件SPI驱动的ILI9341代码分享。以及emWIN移植求助。

[复制链接]
5025|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyzjacky|  楼主 | 2018-1-10 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、emWIN移植询问和求助
本人有以下几个疑问,请各位指教:
1.有关LCD的寄存器和RAM操作地址。在别的网友贴出来的帖子中,有以下描述:

增加定义LCD寄存器、RAM操作地址,
#define LCD_BASE (uint32_t)(0x60000000 | 0x0001fffe) //基地址
#define LCD_REG_ADDRESS  (*(volatile U16*)LCD_BASE) //寄存器地址
#define LCD_DATA_ADDRESS  (*(volatile U16*)(LCD_BASE + 2)) //RAM地址

看样子这网友用的是ILI9341的。这里我就有一个疑问:这些地址是否是自己查资料找来的,还是因为emWIN含有ILI9341,只需要查emWIN使用手册就能找到
然后,如果用的LCD的驱动芯片不被emWIN支持,岂不是就用不了了(知道怎么移植驱动,那就不存在这个问题)。

2.关于移植时,读当前像素点的颜色的函数:static void LcdReadDataMultiple(U16 * pData, int NumItems);这个函数里的移植该怎么写呢?

比如,我现在的读点颜色的函数是这样的:
unsigned short int LCD_Read_Point(unsigned short int cx,unsigned short int cy)
{
        unsigned char r=0,g=0,b=0;
        LCD_set_windows(cx,cy,cx,cy);
        LCD_wtREG(0x2E);
        
        LCD_Read_Data();                //只需要执行一次空读取
        r = LCD_Read_Data();
        g = LCD_Read_Data();
        b = LCD_Read_Data();
        
        LCD_wtREG(0x2C);                //关键步骤,必须要有

        return (((r>>3)<<11)|((g>>2)<<5)|(b>>3));
}

首先,我们读点的函数中,是加入了所读像素点的坐标。由于使用了emWIN,那就由调用emWIN的函数决定读哪里坐标的颜色,是这样吗?我是不用关心的,即不需要LCD_set_windows这个函数?

第二,移植时,是否要把LCD_wtREG(0x2E);加入? 因为还没有在emWIN手册上看到有这一块的详细介绍,凭其他网友所给资料所讲述,我猜想,emWIN既然支持ILI9341,那么emWIN函数要读取像素点颜色时,它应该已经做了发送0X2E的指令,是这样吗?
也就是说,只要在这个函数中static void LcdWriteReg(U16 Data),移植了我自己编写的、正确的写寄存器代码,那就能搞定读点,不需要我去关心有没有发0X2E指令,是吗?


3、几个关键的移植函数。
请各位大神帮我看看,emWIN的移植是不是改写这三个函数,就能实现emWIN的绝大部分功能。

第一、写寄存器函数
static void LcdWriteReg(U16 Data) {
  // ... TBD by user
        LCD_wtREG((U8)Data);  //此函数已经在我的样机上正常使用
}

第二、写一个16位数据
static void LcdWriteData(U16 Data) {
  // ... TBD by user
        LCD_wt16bitData(Data);  //此函数已经在我的样机上正常使用
}

第三、连续写数据
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
                LCD_wt16bitData(*(pData++));   //此函数已经在我的样机上正常使用
  }
}


第四、读像素点的颜色

static void LcdReadDataMultiple(U16 * pData, int NumItems) {
  while (NumItems--) {
    // ... TBD by user
   // *(pData++) = LCD_Read_Data();  //就是这里让我不解,所以是被注释掉的。LCD_Read_Data函数是能正常使用的,已在我的样机上使用
  }
}




二、STM32的硬件SPI驱动的ILI9341代码如下:(我是本论坛的新手,还不知道怎么发资源,管理员莫怪哈)
http://    download.csdn.net         
/download/xyzjacky/10196062
沙发
lebment| | 2018-1-10 14:58 | 只看该作者
看样子很有可能是你的emwin里初始化那一部分,有个函数要改一下。具体可以看安富莱的emwin教程,学生党,我就是看教程会的,目前移植到触摸函数就GG了。

使用特权

评论回复
板凳
lebment| | 2018-1-10 14:58 | 只看该作者
看样子很有可能是你的emwin里初始化那一部分,有个函数要改一下。具体可以看安富莱的emwin教程,学生党,我就是看教程会的,目前移植到触摸函数就GG了。

使用特权

评论回复
地板
xyzjacky|  楼主 | 2018-1-10 15:34 | 只看该作者
lebment 发表于 2018-1-10 14:58
看样子很有可能是你的emwin里初始化那一部分,有个函数要改一下。具体可以看安富莱的emwin教程,学生党,我 ...

OK,谢谢!

使用特权

评论回复
5
xyzjacky|  楼主 | 2018-1-26 15:18 | 只看该作者
已经完成移植,谢谢各位关心。

使用特权

评论回复
6
android2| | 2018-1-26 18:09 | 只看该作者
那几个地方楼主怎么解决的

使用特权

评论回复
7
xyzjacky|  楼主 | 2018-2-5 10:15 | 只看该作者
android2 发表于 2018-1-26 18:09
那几个地方楼主怎么解决的

关于移植,你要仔细看看这两个地方:
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0);        

pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);

我的移植不成功的问题就来自此。这两个函数代表了不同的底层驱动代码,即是说,emwin有两种接入你自己写的LCD驱动。一种的完全的IO操作(即发指令,发数据),另一种是接入你写好的画点,画直线这些函数。

你仔细看安福莱的教程就能明白。我开始就是没有弄清楚。

使用特权

评论回复
8
taobaofarmer| | 2018-11-18 12:14 | 只看该作者
你看的是安富莱的哪个教程?V5的EMWIN教程还是V6的2.0教程

使用特权

评论回复
9
xyzjacky|  楼主 | 2020-1-2 15:51 | 只看该作者
本帖最后由 xyzjacky 于 2020-1-2 15:56 编辑
taobaofarmer 发表于 2018-11-18 12:14
你看的是安富莱的哪个教程?V5的EMWIN教程还是V6的2.0教程

我具体参考的是哪一个安福莱的版本我也记不清楚了,因为是17年的事情了。
我记得当时我从网上下载了几个安福莱的教程,看完后仍不成功,于是又在网上看网友的帖子,最后发现安福莱的教程里有两个细节没有讲清楚,把这几个细节弄好后,就成功了。我于是还在安福莱的论坛上发了一个帖子讲解。可惜安福莱的论坛也挂了,我也不记得当时是哪两个细节了。
你要做SPI屏的显示,先参考野火或者正点原子的显示屏驱动程序,只不过把他们的并口屏驱动,换成你的SPI驱动。然后参考安福莱的教程来做EMWIN。
步骤:
1.确认你的SPI读写函数正确。(能实现读写W25Q64就算成功)
2.用已成功的SPI读写函数,去驱动你的SPI屏,实现画点和画线,以及,实现从SPI屏读取其RAM数据,即屏幕点阵上的颜色的数值(显示透明图标必须用到)。
3.将画点函数、画线函数、读回RAM数据的函数移植到EMWIN中。
以上就是主要步骤。期间你还要自己调整一些东西。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

112

帖子

4

粉丝