Initial commit: LSPi (LiangShanPi) project
GD32F470ZGT6 based project with full peripheral support: - SDRAM (W9825G6KH) via EXMC - LCD NT35510 (480x800) via EXMC NOR/PSRAM - Flash (W25Q64) via SPI - UART (USART0) debug console - LED indicators - CMSIS-DAP debug interface - CMake + ARM GCC toolchain build system
This commit is contained in:
@@ -0,0 +1,383 @@
|
||||
#include "touch.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
|
||||
|
||||
_m_tp_dev tp_dev;
|
||||
|
||||
|
||||
void delay_1us(uint16_t us)
|
||||
{
|
||||
while(us--)
|
||||
{
|
||||
__NOP();
|
||||
__NOP();
|
||||
__NOP();
|
||||
__NOP();
|
||||
__NOP();
|
||||
__NOP();
|
||||
}
|
||||
}
|
||||
|
||||
void CT_Delay(void)
|
||||
{
|
||||
delay_1us(2);
|
||||
}
|
||||
|
||||
void CT_IIC_Init(void)
|
||||
{
|
||||
rcu_periph_clock_enable(SCL_RCU);
|
||||
gpio_mode_set(SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,SCL_PIN);
|
||||
gpio_output_options_set(SCL_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,SCL_PIN);
|
||||
|
||||
rcu_periph_clock_enable(SDA_RCU);
|
||||
gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,SDA_PIN);
|
||||
gpio_output_options_set(SDA_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,SDA_PIN);
|
||||
|
||||
}
|
||||
|
||||
void CT_IIC_Start(void)
|
||||
{
|
||||
CT_SDA_OUT();
|
||||
SDA_ON;
|
||||
SCL_ON;
|
||||
delay_1us(30);
|
||||
SDA_OFF;
|
||||
CT_Delay();
|
||||
SCL_OFF;
|
||||
}
|
||||
|
||||
void CT_IIC_Stop(void)
|
||||
{
|
||||
CT_SDA_OUT();
|
||||
SCL_ON;
|
||||
delay_1us(30);
|
||||
SDA_OFF;
|
||||
CT_Delay();
|
||||
SDA_ON;
|
||||
}
|
||||
|
||||
uint8_t CT_IIC_Wait_Ack(void)
|
||||
{
|
||||
uint8_t ucErrTime=0;
|
||||
CT_SDA_IN();
|
||||
SDA_ON;
|
||||
SCL_ON;
|
||||
CT_Delay();
|
||||
while(CT_READ_SDA)
|
||||
{
|
||||
ucErrTime++;
|
||||
if(ucErrTime>250)
|
||||
{
|
||||
CT_IIC_Stop();
|
||||
return 1;
|
||||
}
|
||||
CT_Delay();
|
||||
}
|
||||
SCL_OFF;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CT_IIC_Ack(void)
|
||||
{
|
||||
SCL_OFF;
|
||||
CT_SDA_OUT();
|
||||
CT_Delay();
|
||||
SDA_OFF;
|
||||
CT_Delay();
|
||||
SCL_ON;
|
||||
CT_Delay();
|
||||
SCL_OFF;
|
||||
}
|
||||
|
||||
void CT_IIC_NAck(void)
|
||||
{
|
||||
SCL_OFF;
|
||||
CT_SDA_OUT();
|
||||
CT_Delay();
|
||||
SDA_ON;
|
||||
CT_Delay();
|
||||
SCL_ON;
|
||||
CT_Delay();
|
||||
SCL_OFF;
|
||||
}
|
||||
|
||||
void CT_IIC_Send_Byte(uint8_t txd)
|
||||
{
|
||||
uint8_t t;
|
||||
CT_SDA_OUT();
|
||||
SCL_OFF;
|
||||
CT_Delay();
|
||||
for(t=0;t<8;t++)
|
||||
{
|
||||
if((txd&0x80)>>7)
|
||||
{
|
||||
gpio_bit_set(SDA_PORT,SDA_PIN);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_bit_reset(SDA_PORT,SDA_PIN);
|
||||
}
|
||||
|
||||
txd<<=1;
|
||||
SCL_ON;
|
||||
CT_Delay();
|
||||
SCL_OFF;
|
||||
CT_Delay();
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t CT_IIC_Read_Byte(unsigned char ack)
|
||||
{
|
||||
uint8_t i,receive=0;
|
||||
CT_SDA_IN();
|
||||
delay_1us(30);
|
||||
for(i=0;i<8;i++ )
|
||||
{
|
||||
SCL_OFF;
|
||||
CT_Delay();
|
||||
SCL_ON;
|
||||
receive<<=1;
|
||||
|
||||
if(CT_READ_SDA)receive++;
|
||||
}
|
||||
|
||||
if (!ack)CT_IIC_NAck();
|
||||
else CT_IIC_Ack();
|
||||
return receive;
|
||||
}
|
||||
|
||||
const uint8_t GT1151_CFG_TBL[]=
|
||||
{
|
||||
0x63,0xE0,0x01,0x20,0x03,0x05,0x3D,0x04,0x00,0x08,
|
||||
0x09,0x0F,0x55,0x37,0x33,0x11,0x00,0x03,0x08,0x56,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,
|
||||
0x3C,0x08,0x0A,0x28,0x1E,0x50,0x00,0x00,0x82,0xB4,
|
||||
0xD2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x85,0x25,0x10,0x41,0x43,0x31,
|
||||
0x0D,0x00,0xAD,0x22,0x24,0x7D,0x1D,0x1D,0x32,0xDF,
|
||||
0x4F,0x44,0x0F,0x80,0x2C,0x50,0x50,0x00,0x00,0x00,
|
||||
0x00,0xD3,0x00,0x00,0x00,0x00,0x0F,0x28,0x1E,0xFF,
|
||||
0xF0,0x37,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x50,0xB4,0xC0,0x94,0x53,0x2D,
|
||||
0x0A,0x02,0xBE,0x60,0xA2,0x71,0x8F,0x82,0x80,0x92,
|
||||
0x74,0xA3,0x6B,0x01,0x0F,0x14,0x03,0x1E,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x00,0x00,0x00,0x0D,0x0E,0x0F,0x10,0x12,
|
||||
0x13,0x14,0x15,0x1F,0x1D,0x1B,0x1A,0x19,0x18,0x17,
|
||||
0x16,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x06,0x08,0x0C,
|
||||
0x12,0x13,0x14,0x15,0x17,0x18,0x19,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,
|
||||
0xC4,0x09,0x23,0x23,0x50,0x5D,0x54,0x4B,0x3C,0x0F,
|
||||
0x32,0xFF,0xE4,0x04,0x40,0x00,0x8A,0x05,0x40,0x00,
|
||||
0xAA,0x00,0x22,0x22,0x00,0x00,0x73,0x22,0x01
|
||||
};
|
||||
|
||||
uint16_t CRC16(uint8_t *srcdata,uint16_t length)
|
||||
{
|
||||
uint16_t crc=0xffff;
|
||||
uint16_t i,j;
|
||||
uint8_t value;
|
||||
for(i=0;i<length;i++)
|
||||
{
|
||||
for(j=0;j<8;j++)
|
||||
{
|
||||
value=((srcdata[i]<<j)&0x80)^((crc&0x8000)>>8);
|
||||
crc<<=1;
|
||||
if(value!=0)
|
||||
{
|
||||
crc^=0x8005;
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
void check_sum(void)
|
||||
{
|
||||
uint16_t checksum=0;
|
||||
uint8_t checksumH,checksumL;
|
||||
uint8_t i=0;
|
||||
for(i=0;i<(sizeof(GT1151_CFG_TBL)-3);i+=2)
|
||||
checksum +=((GT1151_CFG_TBL[i]<<8)|GT1151_CFG_TBL[i+1]);
|
||||
checksum =(~checksum)+1;
|
||||
checksumH=checksum>>8;
|
||||
checksumL=checksum;
|
||||
printf("chksum:0x%X,\r\n",checksum);
|
||||
printf("chksumH:0x%X,\r\n",checksumH);
|
||||
printf("chksumL:0x%X,\r\n",checksumL);
|
||||
}
|
||||
|
||||
uint8_t GT1151_Send_Cfg(uint8_t mode)
|
||||
{
|
||||
uint16_t checksum=0;
|
||||
uint8_t i=0;
|
||||
for(i=0;i<(sizeof(GT1151_CFG_TBL)-3);i+=2)
|
||||
checksum +=((GT1151_CFG_TBL[i]<<8)|GT1151_CFG_TBL[i+1]);
|
||||
checksum =(~checksum)+1;
|
||||
printf("chksum:0x%x,\r\n",checksum);
|
||||
GT1151_WR_Reg(GT_CFGS_REG,(uint8_t*)GT1151_CFG_TBL,sizeof(GT1151_CFG_TBL));
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t GT1151_WR_Reg(uint16_t reg,uint8_t *buf,uint8_t len)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t ret=0;
|
||||
CT_IIC_Start();
|
||||
CT_IIC_Send_Byte(GT_CMD_WR);
|
||||
CT_IIC_Wait_Ack();
|
||||
CT_IIC_Send_Byte(reg>>8);
|
||||
CT_IIC_Wait_Ack();
|
||||
CT_IIC_Send_Byte(reg&0XFF);
|
||||
CT_IIC_Wait_Ack();
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
CT_IIC_Send_Byte(buf[i]);
|
||||
ret=CT_IIC_Wait_Ack();
|
||||
if(ret)break;
|
||||
}
|
||||
CT_IIC_Stop();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void GT1151_RD_Reg(uint16_t reg,uint8_t *buf,uint8_t len)
|
||||
{
|
||||
uint8_t i;
|
||||
CT_IIC_Start();
|
||||
CT_IIC_Send_Byte(GT_CMD_WR);
|
||||
CT_IIC_Wait_Ack();
|
||||
CT_IIC_Send_Byte(reg>>8);
|
||||
CT_IIC_Wait_Ack();
|
||||
CT_IIC_Send_Byte(reg&0XFF);
|
||||
CT_IIC_Wait_Ack();
|
||||
CT_IIC_Start();
|
||||
CT_IIC_Send_Byte(GT_CMD_RD);
|
||||
CT_IIC_Wait_Ack();
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
buf[i]=CT_IIC_Read_Byte(i==(len-1)?0:1);
|
||||
}
|
||||
CT_IIC_Stop();
|
||||
}
|
||||
|
||||
uint8_t Cfg_Info1[239] = {0};
|
||||
uint8_t GT1151_Init(void)
|
||||
{
|
||||
uint8_t temp[6]={0};
|
||||
uint8_t i=0;
|
||||
rcu_periph_clock_enable(INT_RCU);
|
||||
gpio_mode_set(INT_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,INT_PIN);
|
||||
gpio_output_options_set(INT_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,INT_PIN);
|
||||
|
||||
CT_IIC_Init();
|
||||
gpio_mode_set(INT_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE,INT_PIN);
|
||||
|
||||
delay_1ms(100);
|
||||
|
||||
GT1151_RD_Reg(GT_PID_REG,temp,4);
|
||||
|
||||
printf("CTP ID:GT%s\r\n",temp);
|
||||
|
||||
check_sum();
|
||||
|
||||
if(strcmp((char*)temp,"1158")==0)
|
||||
{
|
||||
GT1151_RD_Reg(GT_CFGS_REG,temp,1);
|
||||
printf("Default Ver:0x%x\r\n",temp[0]);
|
||||
|
||||
#if 1
|
||||
GT1151_RD_Reg(0x8050,Cfg_Info1,239);
|
||||
printf("Config Info:\r\n");
|
||||
for( i = 0; i < 239; i++ )
|
||||
{
|
||||
printf("0x%02X,",Cfg_Info1[i]);
|
||||
if((i+1)%10==0)
|
||||
printf("\r\n");
|
||||
}
|
||||
printf("\r\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
const uint16_t GT1151_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG};
|
||||
|
||||
uint8_t GT1151_Scan(uint8_t mode)
|
||||
{
|
||||
uint8_t buf[4];
|
||||
uint8_t i=0;
|
||||
uint8_t res=0;
|
||||
uint8_t temp;
|
||||
uint8_t tempsta;
|
||||
static uint8_t t=0;
|
||||
t++;
|
||||
if((t%10)==0||t<10)
|
||||
{
|
||||
GT1151_RD_Reg(GT_GSTID_REG,&mode,1);
|
||||
if(mode&0X80&&((mode&0XF)<6))
|
||||
{
|
||||
temp=0;
|
||||
GT1151_WR_Reg(GT_GSTID_REG,&temp,1);
|
||||
}
|
||||
if((mode&0XF)&&((mode&0XF)<6))
|
||||
{
|
||||
temp=0XFF<<(mode&0XF);
|
||||
tempsta=tp_dev.sta;
|
||||
tp_dev.sta=(~temp)|TP_PRES_DOWN|TP_CATH_PRES;
|
||||
tp_dev.x[4]=tp_dev.x[0];
|
||||
tp_dev.y[4]=tp_dev.y[0];
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
if(tp_dev.sta&(1<<i))
|
||||
{
|
||||
GT1151_RD_Reg(GT1151_TPX_TBL[i],buf,4);
|
||||
if(tp_dev.touchtype&0X01)
|
||||
{
|
||||
tp_dev.x[i]=((uint16_t)buf[1]<<8)+buf[0];
|
||||
tp_dev.y[i]=((uint16_t)buf[3]<<8)+buf[2];
|
||||
}else
|
||||
{
|
||||
tp_dev.x[i]=((uint16_t)buf[1]<<8)+buf[0];
|
||||
tp_dev.y[i]=((uint16_t)buf[3]<<8)+buf[2];
|
||||
}
|
||||
if(tp_dev.x[i]>0&&tp_dev.x[i]<480&&tp_dev.y[i]>0&&tp_dev.y[i]<800)
|
||||
printf("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]);
|
||||
}
|
||||
}
|
||||
res=1;
|
||||
if(tp_dev.x[0]>1024||tp_dev.y[0]>1024)
|
||||
{
|
||||
if((mode&0XF)>1)
|
||||
{
|
||||
tp_dev.x[0]=tp_dev.x[1];
|
||||
tp_dev.y[0]=tp_dev.y[1];
|
||||
t=0;
|
||||
}else
|
||||
{
|
||||
tp_dev.x[0]=tp_dev.x[4];
|
||||
tp_dev.y[0]=tp_dev.y[4];
|
||||
mode=0X80;
|
||||
tp_dev.sta=tempsta;
|
||||
}
|
||||
}else t=0;
|
||||
}
|
||||
}
|
||||
if((mode&0X8F)==0X80)
|
||||
{
|
||||
if(tp_dev.sta&TP_PRES_DOWN)
|
||||
{
|
||||
tp_dev.sta&=~(1<<7);
|
||||
}else
|
||||
{
|
||||
tp_dev.x[0]=0xffff;
|
||||
tp_dev.y[0]=0xffff;
|
||||
tp_dev.sta&=0XE0;
|
||||
}
|
||||
}
|
||||
if(t>240)t=10;
|
||||
return res;
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
#ifndef __TOUCH_H__
|
||||
#define __TOUCH_H__
|
||||
#include "gd32f4xx.h"
|
||||
#include "systick.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define SCL_RCU RCU_GPIOB
|
||||
#define SCL_PORT GPIOB
|
||||
#define SCL_PIN GPIO_PIN_6
|
||||
#define SCL_ON gpio_bit_set(SCL_PORT,SCL_PIN)
|
||||
#define SCL_OFF gpio_bit_reset(SCL_PORT,SCL_PIN)
|
||||
#define SCL_TOGGLE gpio_bit_toggle(SCL_PORT,SCL_PIN)
|
||||
|
||||
#define SDA_RCU RCU_GPIOB
|
||||
#define SDA_PORT GPIOB
|
||||
#define SDA_PIN GPIO_PIN_7
|
||||
#define SDA_ON gpio_bit_set(SDA_PORT,SDA_PIN)
|
||||
#define SDA_OFF gpio_bit_reset(SDA_PORT,SDA_PIN)
|
||||
#define SDA_TOGGLE gpio_bit_toggle(SDA_PORT,SDA_PIN)
|
||||
|
||||
//IO方向设置
|
||||
#define CT_SDA_IN() gpio_mode_set(SCL_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP,SDA_PIN);//{GPIOF->MODER&=~(3<<(2*11));GPIOF->MODER|=0<<2*11;} //PF11输入模式
|
||||
#define CT_SDA_OUT() gpio_mode_set(SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP,SDA_PIN);//{GPIOF->MODER&=~(3<<(2*11));GPIOF->MODER|=1<<2*11;} //PF11输出模式
|
||||
//IO操作函数
|
||||
#define CT_IIC_SCL //PBout(0) //SCL
|
||||
#define CT_IIC_SDA(val) ((val)==1?SDA_ON:SDA_OFF)//PFout(11) //SDA
|
||||
#define CT_READ_SDA gpio_input_bit_get(SDA_PORT,SDA_PIN) //PFin(11) //输入SDA
|
||||
|
||||
#define RST_RCU RCU_GPIOD
|
||||
#define RST_PORT GPIOD
|
||||
#define RST_PIN GPIO_PIN_12
|
||||
#define RST_ON gpio_bit_set(RST_PORT,RST_PIN);
|
||||
#define RST_OFF gpio_bit_reset(RST_PORT,RST_PIN);
|
||||
#define RST_TOGGLE gpio_bit_toggle(RST_PORT,RST_PIN);
|
||||
|
||||
#define INT_RCU RCU_GPIOD
|
||||
#define INT_PORT GPIOD
|
||||
#define INT_PIN GPIO_PIN_11
|
||||
#define INT_ON gpio_bit_set(INT_PORT,INT_PIN);
|
||||
#define INT_OFF gpio_bit_reset(INT_PORT,INT_PIN);
|
||||
#define INT_TOGGLE gpio_bit_toggle(INT_PORT,INT_PIN);
|
||||
|
||||
//I2C读写命令
|
||||
#define GT_CMD_WR 0X28 //写命令
|
||||
#define GT_CMD_RD 0X29 //读命令
|
||||
|
||||
//GT1151 部分寄存器定义
|
||||
#define GT_CTRL_REG 0X8040 //GT1151控制寄存器
|
||||
#define GT_CFGS_REG 0X8050 //GT1151地址寄存器
|
||||
#define GT_CHECK_REG 0X813C //GT1151验和寄存器
|
||||
#define GT_PID_REG 0X8140 //GT1151产品ID寄存器
|
||||
|
||||
#define GT_GSTID_REG 0X814E //GT1151前检测到的触摸情况
|
||||
#define GT_TP1_REG 0X8150 //第一个触摸点数据地址
|
||||
#define GT_TP2_REG 0X8158 //第二个触摸点数据地址
|
||||
#define GT_TP3_REG 0X8160 //第三个触摸点数据地址
|
||||
#define GT_TP4_REG 0X8168 //第四个触摸点数据地址
|
||||
#define GT_TP5_REG 0X8170 //第五个触摸点数据地址
|
||||
|
||||
#define TP_PRES_DOWN 0x80 //触屏被按下
|
||||
#define TP_CATH_PRES 0x40 //有按键按下了
|
||||
#define CT_MAX_TOUCH 5 //电容屏支持的点数,固定为5点
|
||||
//触摸屏控制器
|
||||
typedef struct
|
||||
{
|
||||
// uint8_t (*init)(void); //初始化触摸屏控制器
|
||||
// uint8_t (*scan)(uint8_t); //扫描触摸屏.0,屏幕扫描;1,物理坐标;
|
||||
// void (*adjust)(void); //触摸屏校准
|
||||
uint16_t x[CT_MAX_TOUCH]; //当前坐标
|
||||
uint16_t y[CT_MAX_TOUCH]; //电容屏有最多5组坐标,电阻屏则用x[0],y[0]代表:此次扫描时,触屏的坐标,用
|
||||
uint8_t sta; //笔的状态
|
||||
float xfac;
|
||||
float yfac;
|
||||
short xoff;
|
||||
short yoff;
|
||||
uint8_t touchtype;
|
||||
}_m_tp_dev;
|
||||
extern _m_tp_dev tp_dev; //触屏控制器在touch.c里面定义
|
||||
|
||||
|
||||
//IIC所有操作函数
|
||||
void CT_IIC_Init(void); //初始化IIC的IO口
|
||||
void CT_IIC_Start(void); //发送IIC开始信号
|
||||
void CT_IIC_Stop(void); //发送IIC停止信号
|
||||
void CT_IIC_Send_Byte(uint8_t txd); //IIC发送一个字节
|
||||
uint8_t CT_IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
|
||||
uint8_t CT_IIC_Wait_Ack(void); //IIC等待ACK信号
|
||||
void CT_IIC_Ack(void); //IIC发送ACK信号
|
||||
void CT_IIC_NAck(void); //IIC不发送ACK信号
|
||||
|
||||
|
||||
|
||||
uint8_t GT1151_Send_Cfg(uint8_t mode);
|
||||
uint8_t GT1151_WR_Reg(uint16_t reg,uint8_t *buf,uint8_t len);
|
||||
void GT1151_RD_Reg(uint16_t reg,uint8_t *buf,uint8_t len);
|
||||
uint8_t GT1151_Init(void);
|
||||
uint8_t GT1151_Scan(uint8_t mode);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user