注册 登录
查看: 539|回复: 9

K60有关FlexBus的问题,多谢解答~!!

[复制链接]
发表于 2014-10-17 23:05:09 | 显示全部楼层 |阅读模式
本帖最后由 ExiBQ 于 2014-10-17 23:11 编辑

野火给的FlexBus驱动ILI9341很好用,但是手上有其他主控的LCD,这些LCD我都有用IO口模拟协议的代码。
下面是其中一种方式
void Write_Cmd(unsigned char DH,unsigned char DL)
{
  CS=0;
  RS=0;
  GPIO_SET_NBIT(8,PTA6,DH);
  RW=0;
  RW=1;
  GPIO_SET_NBIT(8,PTA6,DL);
  RW=0;
  RW=1;
  CS=1;
}
void Write_Data(unsigned char DH,unsigned char DL)
{
  CS=0;
  RS=1;
  GPIO_SET_NBIT(8,PTA6,DH);
  RW=0;
  RW=1;
  GPIO_SET_NBIT(8,PTA6,DL);
  RW=0;
  RW=1;
  CS=1;
}

请教一下,如何修改之前ILI9341的FlexBus配置来满足上面LCD的要求呢,多谢。

下面是原ILI9341的代码
MK60_flexbus.c
#include "common.h"
#include "MK60_flexbus.h"

/*!
*  @brief      flexbus初始化为8080协议
*  @since      v5.0
*/
void flexbus_8080_init()
{
    //flexbus 本身不直接支持 8080协议,而是支持 6800协议
    //我们可以配置 cmd 与 data 数据的地址不同,从而通过地址线来区分命令和数据


    SIM_SOPT2 |= SIM_SOPT2_FBSL(3);             //FlexBus安全水平:允许指令和数据访问
    SIM_SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;        //使能时钟


    //配置数据管脚复用
    port_init(PTD6  , ALT5 | HDS);              //PTD6 复用为 fb_ad[0] ,配置为 输出高驱动能力
    port_init(PTD5  , ALT5 | HDS);              //PTD5 复用为 fb_ad[1] ,配置为 输出高驱动能力
    port_init(PTD4  , ALT5 | HDS);              //PTD4 复用为 fb_ad[2] ,配置为 输出高驱动能力
    port_init(PTD3  , ALT5 | HDS);              //PTD3 复用为 fb_ad[3] ,配置为 输出高驱动能力
    port_init(PTD2  , ALT5 | HDS);              //PTD2 复用为 fb_ad[4] ,配置为 输出高驱动能力
    port_init(PTC10 , ALT5 | HDS);              //PTC10复用为 fb_ad[5] ,配置为 输出高驱动能力
    port_init(PTC9  , ALT5 | HDS);              //PTC9 复用为 fb_ad[6] ,配置为 输出高驱动能力
    port_init(PTC8  , ALT5 | HDS);              //PTC8 复用为 fb_ad[7] ,配置为 输出高驱动能力
    port_init(PTC7  , ALT5 | HDS);              //PTC7 复用为 fb_ad[8] ,配置为 输出高驱动能力
    port_init(PTC6  , ALT5 | HDS);              //PTC6 复用为 fb_ad[9] ,配置为 输出高驱动能力
    port_init(PTC5  , ALT5 | HDS);              //PTC5 复用为 fb_ad[10],配置为 输出高驱动能力
    port_init(PTC4  , ALT5 | HDS);              //PTC4 复用为 fb_ad[11],配置为 输出高驱动能力
    port_init(PTC2  , ALT5 | HDS);              //PTC2 复用为 fb_ad[12],配置为 输出高驱动能力
    port_init(PTC1  , ALT5 | HDS);              //PTC1 复用为 fb_ad[13],配置为 输出高驱动能力
    port_init(PTC0  , ALT5 | HDS);              //PTC0 复用为 fb_ad[14],配置为 输出高驱动能力
    port_init(PTB18 , ALT5 | HDS);              //PTB18复用为 fb_ad[15],配置为 输出高驱动能力
    //配置控制管脚复用
    //8080总线,即Intel总线,需要四根线控制线:RD写使能, WR读使能, RS数据/指令选择, CS片选
    port_init(PTB19 , ALT5 | HDS);              //PTB19复用为 fb_oe_b  ,配置为 输出高驱动能力 , fb_oe_b 时序符合 8080 总线的 RD写使能
    port_init(PTD1  , ALT5 | HDS);              //PTD1 复用为 fb_cs0_b ,配置为 输出高驱动能力 , fb_cs0_b时序符合 8080 总线的 CS片选
    port_init(PTC11 , ALT5 | HDS);              //PTC11复用为 fb_r/w   ,配置为 输出高驱动能力 , fb_r/w  时序符合 8080 总线的 WR读使能


    //目前还缺 8080 总线的 RS数据/指令选择线
    //flexbus可配置成两块地址不连续的块(高16位地址不相同),从而利用地址线来符合 8080 总线的 RS数据/指令选择线
    //高16位的地址,FB_BA 我们配置为 0x6000 ,因而可选择的 地址线有 fb_ad[16] ~ fb_ad[28]
    //FB_BAM配置为 0x0800 ,即选择 fb_ad[27] 作为 RS 。(0x0800 0000 == 1<<27 )
    // RS == 1 时 传输数据,RS == 0 时传输命令
    //因而 0x6000 0000 为 命令地址 , 0x6800 0000 为数据端口
    port_init(PTC12 , ALT5 | HDS);              //PTC12复用为 fb_ad[27],配置为 输出高驱动能力 , fb_ad[27]作为8080 总线的 RS数据/指令选择线


    FB_CSAR(0) = FB_CSAR_BA(FB_BA);             // 基地址 Base address
    FB_CSMR(0) =  ( 0
                    | FB_CSMR_BAM(FB_BAM)       // BAM = 0x0800 ,基地地址掩码 为 0x,800 FFFF ,即 片选有效的地址为 基地址 ~ (基地址 + 基地地址掩码) ,0x0800 0000 对应与 FB_AD27
                    | FB_CSMR_V_MASK            // 使用片选信号 FB_CS0
                  );
    FB_CSCR(0) =    FB_CSCR_BLS_MASK            //右对齐
                    | FB_CSCR_PS(2)             //16Byte数据
                    | FB_CSCR_AA_MASK           // 自动应答
                    ;
}

MK60_flexbus.h
#define FB_BA       0x6000      //基地址     = FB_BA * 0x10000 ,用于区分 不同的片选信号
                                //参考 System memory map 的说明, External Memory 的范围为 0x6000_0000 ~ 0x9FFF_FFFF
                                //即 FB_BA 的取值范围为 0x6000 ~ 0x9FFF
#define FB_BAM      0x0800      //基地址掩膜 = (FB_BA + FB_BAM)* 0x10000 ,用于区分 同一个CS控制的两个不连续的块的地址
#define FB_8080_CMD     (*(volatile uint16 *)(FB_BA * 0x10000))
#define FB_8080_DATA    (*(volatile uint16 *)((FB_BA + FB_BAM )* 0x10000))
extern void flexbus_8080_init();


再次先谢谢了,真的是穷途末路了才问的。。
回复

使用道具 举报

发表于 2014-10-17 23:11:19 | 显示全部楼层
只要是8080 协议的,16位的,flexbus都可以直接用啊。你只需要修改液晶的命令数据初始化就好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-18 01:10:46 | 显示全部楼层
本帖最后由 ExiBQ 于 2014-10-18 01:28 编辑
山外メ雲ジ 发表于 2014-10-17 23:11
只要是8080 协议的,16位的,flexbus都可以直接用啊。你只需要修改液晶的命令数据初始化就好了

一直有点没搞懂9341的代码,因为一次无论是数据还是命令都是8位嘛,却用了16位FlexBus,我就猜16位是前8位是数据后8位是命令?然后还用RS来区分了数据/命令

我手上有两个LCD都不是不是9341的,我只有他IO口模拟8080协议的代码。
IO口模拟8080协议的代码的意思是,只有8位(LCD除了WR RD RS RST CS之外只有8根线和单片机连),而且这8位既用来传数据又传命令,并用RS区分数据/命令。

直接套用原先9341的FlexBus配置肯定是不行的,但是自己总是调不成功,所以来提问看看。
(我的另外一块分辨率大一点的屏幕是800x480的,他则是有16根线,一次写16位数据或16位命令,这样的又如何改代码呢?)


回复 支持 反对

使用道具 举报

发表于 2014-10-18 01:14:22 | 显示全部楼层
ExiBQ 发表于 2014-10-18 01:10
9341的8080协议16位是前8位是数据后8位是命令?我手上的这个LCD不是9341的,我看他IO口模拟的程序的意思 ...

你的液晶是8位还是16位?8位的,我们也是用模拟的。当然也可以用flexbus,代码中有挺详细注释了的。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-18 01:26:30 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-18 01:14
你的液晶是8位还是16位?8位的,我们也是用模拟的。当然也可以用flexbus,代码中有挺详细注释了的。

8位的和16位的都有一块,在注释里面没看懂所以来问问
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-18 01:27:30 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-18 01:14
你的液晶是8位还是16位?8位的,我们也是用模拟的。当然也可以用flexbus,代码中有挺详细注释了的。

当然是希望能用FlexBus啊。。。速度快了不止一点
回复 支持 反对

使用道具 举报

发表于 2014-10-18 01:32:34 | 显示全部楼层
ExiBQ 发表于 2014-10-18 01:26
8位的和16位的都有一块,在注释里面没看懂所以来问问

8位不需要初始化高位,然后写数据需要写两次。应该这样就可以了。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-18 02:01:48 | 显示全部楼层
山外メ雲ジ 发表于 2014-10-18 01:32
8位不需要初始化高位,然后写数据需要写两次。应该这样就可以了。

呃,还是不是很懂。
最后问一下吧,如果这个懂了问题也就不大了。

为什么在ILI9341写命令或者数据的时候,都是类似 LCD_ILI9341_WR_CMD(cmd) LCD_ILI9341_WR_DATA(data)
cmd和data都是0x00~0xff的8位数据,那为什么需要16位FlexBus呢?是FlexBus高8位是数据低8位是命令吗?
回复 支持 反对

使用道具 举报

发表于 2014-10-18 08:53:53 | 显示全部楼层
ExiBQ 发表于 2014-10-18 02:01
呃,还是不是很懂。
最后问一下吧,如果这个懂了问题也就不大了。

不是,先命令,后16位数据。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-10-18 09:01:20 | 显示全部楼层
ExiBQ 发表于 2014-10-18 02:01
呃,还是不是很懂。
最后问一下吧,如果这个懂了问题也就不大了。

建议你先看看液晶手册的时序,不然你没法理解为什么这样。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

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

本版积分规则

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