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:
2026-04-26 16:24:42 +08:00
commit fc10ef2e10
152 changed files with 161765 additions and 0 deletions
+383
View File
@@ -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;
}
+107
View File
@@ -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