高中生
最后登录1970-1-1
在线时间 小时
注册时间2014-1-8
|
野火给的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();
再次先谢谢了,真的是穷途末路了才问的。。
|
|