打印
[STM32]

STM32的硬件SPI驱动的ILI9341。以及emWIN移植求助询问。

[复制链接]
3701|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyzjacky|  楼主 | 2018-1-9 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、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

相关帖子

沙发
airwill| | 2018-1-14 09:40 | 只看该作者
用这个地址, 是并口驱动的. 使用了 外部数据总线接口.
用 SPI 就没有这个地址了, 底层驱动部分你得重做才行

使用特权

评论回复
板凳
xyzjacky|  楼主 | 2018-1-15 13:46 | 只看该作者
airwill 发表于 2018-1-14 09:40
用这个地址, 是并口驱动的. 使用了 外部数据总线接口.
用 SPI 就没有这个地址了, 底层驱动部分你得重做才行 ...

嗯嗯,我已经知道怎么解决了,谢谢哈!

使用特权

评论回复
地板
zqx1000| | 2018-4-10 19:33 | 只看该作者
kankan

使用特权

评论回复
5
xyzjacky|  楼主 | 2020-1-3 16:52 | 只看该作者
当年我在移植EMwin时的一个笔记:

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

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

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

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

使用特权

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

本版积分规则

24

主题

112

帖子

4

粉丝