OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 959|回复: 9

一个代码分享帖。STM32的硬件SPI驱动的ILI9341。以及emWIN移植询问。

[复制链接]

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
发表于 2018-1-9 13:11:09 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 xyzjacky 于 2018-1-9 13:15 编辑

一、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




最佳答案

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

正点原子哥,我的问题已经解决了。是GUI_DEVICE_CreateAndLink函数创建的底层驱动接口不对。 我的应该是 GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0); 而非 pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0); 估计你们接触emWin的日子也不少了,希望你们能讲解一下这个地方: GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0); 和 pDevice = ...
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 2018-1-9 13:11:10 | 显示全部楼层
本帖最后由 xyzjacky 于 2018-1-12 16:14 编辑
正点原子哥,我的问题已经解决了。是GUI_DEVICE_CreateAndLink函数创建的底层驱动接口不对。
我的应该是  GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0);   
而非 pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);

估计你们接触emWin的日子也不少了,希望你们能讲解一下这个地方:

GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_565, 0, 0);        

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

我的移植不成功的问题就来自此:
GUIDRV_FLEXCOLOR  和  GUIDRV_Template_API

因为我也是刚接触,讲不清楚,希望你们熟悉的人能讲清楚  @正点原子
回复

使用道具 举报

  离线 

489

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
124830
金钱
124830
注册时间
2010-12-1
在线时间
1051 小时
发表于 2018-1-10 00:35:01 | 显示全部楼层
问题有点多。
1,是自己计算的,具体过程,看我们开发板教程,LCD实验章节。
2,参考我们emwin教程,移植过程有详细介绍的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 2018-1-11 17:04:01 | 显示全部楼层
正点原子 发表于 2018-1-10 00:35
问题有点多。
1,是自己计算的,具体过程,看我们开发板教程,LCD实验章节。
2,参考我们emwin教程,移植 ...

已经参考过了开发板上的程序了。

按照修改  _SetPixelIndex(),_GetPixelIndex(),_FillRect()函数后的程序,就无法使用,整个屏幕没有任何反应
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 2018-1-11 17:12:15 | 显示全部楼层
正点原子公众号
正点原子 发表于 2018-1-10 00:35
问题有点多。
1,是自己计算的,具体过程,看我们开发板教程,LCD实验章节。
2,参考我们emwin教程,移植 ...

按照论坛中,一个帖子的代码,修改下面几个函数,还有点反应,但是不知道为何,字符串都打印不出来。

tatic void LcdWriteReg(U16 Data) //写寄存器

static void LcdWriteData(U16 Data) //写数据

static void LcdWriteDataMultiple(U16 * pData, int NumItems) //写入多组数据

static void LcdReadDataMultiple(U16 * pData, int NumItems) //读取多组数据

回复

使用道具 举报

  离线 

489

主题

9万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
124830
金钱
124830
注册时间
2010-12-1
在线时间
1051 小时
发表于 2018-1-12 00:15:47 | 显示全部楼层
xyzjacky 发表于 2018-1-11 17:12
按照论坛中,一个帖子的代码,修改下面几个函数,还有点反应,但是不知道为何,字符串都打印不出来。

...

继续努力
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 2018-1-12 09:59:47 | 显示全部楼层

请问您有朋友或同事愿意帮我搞定这个移植吗?我付费.
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 2018-1-12 16:51:04 | 显示全部楼层
原子哥,@正点原子,这篇帖子,可以帮我结题了哈。问题解决了。
回复

使用道具 举报

  离线 

29

主题

120

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1500
金钱
1500
注册时间
2014-6-30
在线时间
224 小时
发表于 6 天前 | 显示全部楼层
大神,你的spi读取点的函数的连接貌似打不开啊,能给发一个么,最近也在搞这个,一直搞不出来
在电路上充实自己
回复

使用道具 举报

  离线 

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2013-8-15
在线时间
16 小时
 楼主| 发表于 昨天 23:44 | 显示全部楼层
greatxiaoguzi 发表于 2018-4-16 16:31
大神,你的spi读取点的函数的连接貌似打不开啊,能给发一个么,最近也在搞这个,一直搞不出来

你要把链接中的空格去掉,还有一个因为我换行,多了一个换行符%20,这个也要去掉。https://download.csdn.net/download/xyzjacky/10196062
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-4-22 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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