diff --git a/app/main.cpp b/app/main.cpp index d99e513..11c9609 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -6,6 +6,7 @@ #include "sdram_manager.h" #include "flash_manager.h" #include "lcd.h" +#include "touch.h" #include #include @@ -346,7 +347,106 @@ static void concurrent_loop(void) } // ============================================================= -// 主函数 +// Touch 测试 + // ============================================================= + + static void test_touch(void) + { + printf("\r\n===== Touch 测试 (中断驱动) =====\r\n"); + + uint8_t ret = GT1151_Init(); + if (ret != 0) + { + printf(" Touch 初始化失败 (ret=%d)\r\n", ret); + return; + } + printf(" Touch 初始化成功,等待触摸中断...\r\n"); + + LCD_Clear(0x0841); + POINT_COLOR = CYAN; + LCD_ShowString(10, 10, 460, 24, 16, 0, (uint8_t *)"=== Touch Test (IRQ) ==="); + POINT_COLOR = WHITE; + LCD_ShowString(10, 35, 460, 24, 16, 0, (uint8_t *)"Touch screen now"); + LCD_ShowString(10, 55, 300, 24, 16, 0, (uint8_t *)"IRQ driven, watch UART"); + LCD_ShowString(10, 75, 200, 24, 16, 0, (uint8_t *)"X:0 Y:0"); + + uint16_t last_x = 0xFFFF; + uint16_t last_y = 0xFFFF; + uint32_t idle_counter = 0; + bool was_touching = false; + uint32_t iter = 0; + + g_touch_irq_flag = 0; + + while (1) + { + if (g_touch_irq_flag) + { + g_touch_irq_flag = 0; + delay_1ms(5); + + GT1151_Scan(0); + + if (tp_dev.sta & TP_PRES_DOWN) + { + idle_counter = 0; + uint16_t x = tp_dev.x[0]; + uint16_t y = tp_dev.y[0]; + + printf("[TOUCH] iter=%lu sta=0x%02X x=%u y=%u\r\n", + (unsigned long)iter, tp_dev.sta, x, y); + + if (x < lcddev.width && y < lcddev.height) + { + POINT_COLOR = BLACK; + LCD_FillRectangle(10, 75, 200, 95); + POINT_COLOR = GREEN; + char buf[24]; + sprintf(buf, "X:%-3d Y:%-3d", x, y); + LCD_ShowString(10, 75, 200, 24, 16, 0, (uint8_t *)buf); + + if (was_touching && last_x != 0xFFFF) + { + POINT_COLOR = MAGENTA; + LCD_DrawLine(last_x, last_y, x, y); + } + + POINT_COLOR = YELLOW; + LCD_FillCircle(x, y, 4); + + last_x = x; + last_y = y; + was_touching = true; + } + } + else + { + was_touching = false; + last_x = 0xFFFF; + last_y = 0xFFFF; + } + + iter++; + } + else + { + idle_counter++; + delay_1ms(10); + if (idle_counter > 500) + { + printf(" 无触摸超过 5 秒,退出 Touch 测试\r\n"); + break; + } + } + } + + LCD_Clear(BLUE); + printf(" Touch 测试完成\r\n"); + delay_1ms(500); + } + + // ============================================================= + // 主函数 // ============================================================= int main(void) { @@ -438,6 +538,9 @@ int main(void) concurrent_loop(); delay_1ms(500); + test_touch(); + delay_1ms(500); + // ---- 主循环 ---- led_pattern(0x0F); printf("\r\n===== 所有外设测试完成 =====\r\n"); diff --git a/bsp/device/touch/touch.cpp b/bsp/device/touch/touch.cpp index 1123092..600c750 100644 --- a/bsp/device/touch/touch.cpp +++ b/bsp/device/touch/touch.cpp @@ -1,383 +1,265 @@ #include "touch.h" +#include "i2c_driver.h" #include "stdio.h" #include "string.h" - _m_tp_dev tp_dev; +volatile uint8_t g_touch_irq_flag = 0; -void delay_1us(uint16_t us) +#define TOUCH_I2C_PORT 0 +#define TOUCH_DEV_ADDR 0x28 + +uint8_t GT1151_WR_Reg(uint16_t reg, uint8_t *buf, uint8_t len) { - while(us--) + uint8_t tmp[2 + 256]; + tmp[0] = (uint8_t)(reg >> 8); + tmp[1] = (uint8_t)(reg & 0xFF); + for (uint8_t i = 0; i < len; i++) { - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); - __NOP(); + tmp[2 + i] = buf[i]; } + int ret = i2c_master_write(TOUCH_I2C_PORT, TOUCH_DEV_ADDR, tmp, 2 + len); + return (ret == 0) ? 0 : 1; } -void CT_Delay(void) +void GT1151_RD_Reg(uint16_t reg, uint8_t *buf, uint8_t len) { - delay_1us(2); + uint8_t reg_bytes[2]; + reg_bytes[0] = (uint8_t)(reg >> 8); + reg_bytes[1] = (uint8_t)(reg & 0xFF); + i2c_master_write_read(TOUCH_I2C_PORT, TOUCH_DEV_ADDR, reg_bytes, 2, buf, len); } -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++) +const uint8_t GT1151_CFG_TBL[] = { - if((txd&0x80)>>7) - { - gpio_bit_set(SDA_PORT,SDA_PIN); - } - else - { - gpio_bit_reset(SDA_PORT,SDA_PIN); - } + 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}; - txd<<=1; - SCL_ON; - CT_Delay(); - SCL_OFF; - CT_Delay(); +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; + } + } } -} - -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>8); - crc<<=1; - if(value!=0) - { - crc^=0x8005; - } - } - } - return crc; + 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); + 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; + 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) +static void GT1151_EXTI_Init(void) { - 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>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 0); - printf("CTP ID:GT%s\r\n",temp); + printf("CTP ID: GT%s\r\n", temp); - check_sum(); + if (strcmp((char *)temp, "1158") == 0 || strcmp((char *)temp, "1151") == 0) + { + GT1151_RD_Reg(GT_CFGS_REG, temp, 1); + printf("GT Config Version: 0x%02X\r\n", temp[0]); - if(strcmp((char*)temp,"1158")==0) - { - GT1151_RD_Reg(GT_CFGS_REG,temp,1); - printf("Default Ver:0x%x\r\n",temp[0]); + GT1151_Send_Cfg(0); + delay_1ms(50); - #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; + GT1151_EXTI_Init(); + printf("GT EXTI initialized\r\n"); + return 0; + } + + printf("GT Init: unknown ID, will still attempt to use touch\r\n"); + return 1; } -const uint16_t GT1151_TPX_TBL[5]={GT_TP1_REG,GT_TP2_REG,GT_TP3_REG,GT_TP4_REG,GT_TP5_REG}; +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<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; + 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; +} + +extern "C" +{ + + void EXTI10_15_IRQHandler(void) + { + if (exti_flag_get(TOUCH_EXTI_LINE) == SET) + { + g_touch_irq_flag = 1; + exti_flag_clear(TOUCH_EXTI_LINE); + } + } } diff --git a/bsp/device/touch/touch.h b/bsp/device/touch/touch.h index ac3bcd3..9a12a6d 100644 --- a/bsp/device/touch/touch.h +++ b/bsp/device/touch/touch.h @@ -21,87 +21,74 @@ #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鎿嶄綔鍑芥暟 +//IO方向设置 +#define CT_SDA_IN() gpio_mode_set(SDA_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, SDA_PIN) +#define CT_SDA_OUT() gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, SDA_PIN) +//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 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 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 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) -#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 //绗簲涓Е鎽哥偣鏁版嵁鍦板潃 +// EXTI 中断配置 +#define TOUCH_EXTI_LINE EXTI_11 +#define TOUCH_EXTI_IRQn EXTI10_15_IRQn +extern volatile uint8_t g_touch_irq_flag; + +//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鐐 -//瑙︽懜灞忔帶鍒跺櫒 +#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缁勫潗鏍,鐢甸樆灞忓垯鐢▁[0],y[0]浠h〃:姝ゆ鎵弿鏃,瑙﹀睆鐨勫潗鏍,鐢 - uint8_t sta; //绗旂殑鐘舵 +// 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閲岄潰瀹氫箟 +extern _m_tp_dev tp_dev; //触屏控制器在touch.c里面定义 - -//IIC鎵鏈夋搷浣滃嚱鏁 -void CT_IIC_Init(void); //鍒濆鍖朓IC鐨処O鍙 -void CT_IIC_Start(void); //鍙戦両IC寮濮嬩俊鍙 -void CT_IIC_Stop(void); //鍙戦両IC鍋滄淇″彿 -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鍙戦丄CK淇″彿 -void CT_IIC_NAck(void); //IIC涓嶅彂閫丄CK淇″彿 - - - 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 diff --git a/drv/i2c/i2c_driver.cpp b/drv/i2c/i2c_driver.cpp index 0b83ef6..e86eebf 100644 --- a/drv/i2c/i2c_driver.cpp +++ b/drv/i2c/i2c_driver.cpp @@ -4,7 +4,8 @@ #define I2C_TIMEOUT 50000 -struct i2c_hw_config_t { +struct i2c_hw_config_t +{ uint32_t i2c_periph; rcu_periph_enum rcu_clock; uint32_t gpio_port; @@ -15,60 +16,67 @@ struct i2c_hw_config_t { }; static constexpr i2c_hw_config_t i2c_hw_map[] = { - {I2C0, RCU_I2C0, GPIOB, GPIO_PIN_8, GPIO_PIN_9, GPIO_AF_4, RCU_GPIOB}, + {I2C0, RCU_I2C0, GPIOB, GPIO_PIN_6, GPIO_PIN_7, GPIO_AF_4, RCU_GPIOB}, {I2C1, RCU_I2C1, GPIOB, GPIO_PIN_10, GPIO_PIN_11, GPIO_AF_4, RCU_GPIOB}, - {I2C2, RCU_I2C2, GPIOC, GPIO_PIN_4, GPIO_PIN_5, GPIO_AF_4, RCU_GPIOC}, + {I2C2, RCU_I2C2, GPIOC, GPIO_PIN_4, GPIO_PIN_5, GPIO_AF_4, RCU_GPIOC}, }; static RetCode wait_flag(uint32_t i2c_periph, i2c_flag_enum flag) { uint32_t timeout = I2C_TIMEOUT; - while (RESET == i2c_flag_get(i2c_periph, flag)) { - if (--timeout == 0) { + while (RESET == i2c_flag_get(i2c_periph, flag)) + { + if (--timeout == 0) + { return RET_ERROR; } } return RET_OK; } -extern "C" { - -static I2cBus i2c_0(I2cPort::_0); -static I2cBus i2c_1(I2cPort::_1); -static I2cBus i2c_2(I2cPort::_2); -static I2cBus *i2c_instances[] = { &i2c_0, &i2c_1, &i2c_2 }; -static uint8_t i2c_inited[3] = {0}; - -int i2c_init(uint8_t port, uint32_t speed_hz) +extern "C" { - if (port >= 3) return -1; - I2cConfig cfg; - cfg.speed_hz = speed_hz; - RetCode ret = i2c_instances[port]->init(cfg); - i2c_inited[port] = (ret == RET_OK) ? 1 : 0; - return i2c_inited[port] ? 0 : -1; -} -int i2c_master_write(uint8_t port, uint16_t dev_addr, const uint8_t *data, uint32_t len) -{ - if (port >= 3 || !i2c_inited[port]) return -1; - I2cDevice dev(dev_addr); - return i2c_instances[port]->master_write(dev, data, len) == RET_OK ? 0 : -1; -} + static I2cBus i2c_0(I2cPort::_0); + static I2cBus i2c_1(I2cPort::_1); + static I2cBus i2c_2(I2cPort::_2); + static I2cBus *i2c_instances[] = {&i2c_0, &i2c_1, &i2c_2}; + static uint8_t i2c_inited[3] = {0}; -int i2c_master_read(uint8_t port, uint16_t dev_addr, uint8_t *data, uint32_t len) -{ - if (port >= 3 || !i2c_inited[port]) return -1; - I2cDevice dev(dev_addr); - return i2c_instances[port]->master_read(dev, data, len) == RET_OK ? 0 : -1; -} + int i2c_init(uint8_t port, uint32_t speed_hz) + { + if (port >= 3) + return -1; + I2cConfig cfg; + cfg.speed_hz = speed_hz; + RetCode ret = i2c_instances[port]->init(cfg); + i2c_inited[port] = (ret == RET_OK) ? 1 : 0; + return i2c_inited[port] ? 0 : -1; + } -int i2c_master_write_read(uint8_t port, uint16_t dev_addr, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen) -{ - if (port >= 3 || !i2c_inited[port]) return -1; - I2cDevice dev(dev_addr); - return i2c_instances[port]->master_write_read(dev, wdata, wlen, rdata, rlen) == RET_OK ? 0 : -1; -} + int i2c_master_write(uint8_t port, uint16_t dev_addr, const uint8_t *data, uint32_t len) + { + if (port >= 3 || !i2c_inited[port]) + return -1; + I2cDevice dev(dev_addr); + return i2c_instances[port]->master_write(dev, data, len) == RET_OK ? 0 : -1; + } + + int i2c_master_read(uint8_t port, uint16_t dev_addr, uint8_t *data, uint32_t len) + { + if (port >= 3 || !i2c_inited[port]) + return -1; + I2cDevice dev(dev_addr); + return i2c_instances[port]->master_read(dev, data, len) == RET_OK ? 0 : -1; + } + + int i2c_master_write_read(uint8_t port, uint16_t dev_addr, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen) + { + if (port >= 3 || !i2c_inited[port]) + return -1; + I2cDevice dev(dev_addr); + return i2c_instances[port]->master_write_read(dev, wdata, wlen, rdata, rlen) == RET_OK ? 0 : -1; + } } /* extern "C" */ @@ -89,7 +97,8 @@ I2cBus::I2cBus(I2cPort port) I2cBus::~I2cBus() { - if (initialized_) { + if (initialized_) + { deinit(); } } @@ -97,12 +106,14 @@ I2cBus::~I2cBus() RetCode I2cBus::init(const I2cConfig &config) { uint8_t port_idx = static_cast(port_); - if (port_idx >= sizeof(i2c_hw_map) / sizeof(i2c_hw_map[0])) { + if (port_idx >= sizeof(i2c_hw_map) / sizeof(i2c_hw_map[0])) + { return RET_INVALID_PARAM; } const i2c_hw_config_t &hw = i2c_hw_map[port_idx]; - if (hw.i2c_periph == 0) { + if (hw.i2c_periph == 0) + { return RET_NOT_SUPPORTED; } @@ -118,7 +129,8 @@ RetCode I2cBus::init(const I2cConfig &config) i2c_deinit(hw.i2c_periph); uint32_t speed = config.speed_hz; - if (speed == 0) { + if (speed == 0) + { speed = 100000; } i2c_clock_config(hw.i2c_periph, speed, I2C_DTCY_2); @@ -133,7 +145,8 @@ RetCode I2cBus::init(const I2cConfig &config) RetCode I2cBus::deinit() { uint8_t port_idx = static_cast(port_); - if (port_idx >= sizeof(i2c_hw_map) / sizeof(i2c_hw_map[0])) { + if (port_idx >= sizeof(i2c_hw_map) / sizeof(i2c_hw_map[0])) + { return RET_INVALID_PARAM; } @@ -149,19 +162,23 @@ RetCode I2cBus::deinit() static RetCode i2c_master_start(uint32_t i2c_periph, uint16_t addr, uint32_t direction) { uint32_t timeout = I2C_TIMEOUT; - while (i2c_flag_get(i2c_periph, I2C_FLAG_I2CBSY)) { - if (--timeout == 0) { + while (i2c_flag_get(i2c_periph, I2C_FLAG_I2CBSY)) + { + if (--timeout == 0) + { return RET_TIMEOUT; } } i2c_start_on_bus(i2c_periph); - if (wait_flag(i2c_periph, I2C_FLAG_SBSEND) != RET_OK) { + if (wait_flag(i2c_periph, I2C_FLAG_SBSEND) != RET_OK) + { return RET_TIMEOUT; } i2c_master_addressing(i2c_periph, addr, direction); - if (wait_flag(i2c_periph, I2C_FLAG_ADDSEND) != RET_OK) { + if (wait_flag(i2c_periph, I2C_FLAG_ADDSEND) != RET_OK) + { return RET_TIMEOUT; } @@ -172,30 +189,36 @@ static RetCode i2c_master_start(uint32_t i2c_periph, uint16_t addr, uint32_t dir RetCode I2cBus::master_write(I2cDevice &dev, const uint8_t *data, uint32_t len) { - if (data == nullptr || len == 0) { + if (data == nullptr || len == 0) + { return RET_INVALID_PARAM; } - if (!initialized_) return RET_NOT_INITIALIZED; + if (!initialized_) + return RET_NOT_INITIALIZED; uint8_t port_idx = static_cast(port_); const i2c_hw_config_t &hw = i2c_hw_map[port_idx]; uint32_t i2c = hw.i2c_periph; RetCode ret = i2c_master_start(i2c, dev.dev_addr_, I2C_TRANSMITTER); - if (ret != RET_OK) { + if (ret != RET_OK) + { i2c_stop_on_bus(i2c); return ret; } - for (uint32_t i = 0; i < len; i++) { - if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) { + for (uint32_t i = 0; i < len; i++) + { + if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) + { i2c_stop_on_bus(i2c); return RET_TIMEOUT; } i2c_data_transmit(i2c, data[i]); } - if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) { + if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) + { i2c_stop_on_bus(i2c); return RET_TIMEOUT; } @@ -206,34 +229,43 @@ RetCode I2cBus::master_write(I2cDevice &dev, const uint8_t *data, uint32_t len) RetCode I2cBus::master_read(I2cDevice &dev, uint8_t *data, uint32_t len) { - if (data == nullptr || len == 0) { + if (data == nullptr || len == 0) + { return RET_INVALID_PARAM; } - if (!initialized_) return RET_NOT_INITIALIZED; + if (!initialized_) + return RET_NOT_INITIALIZED; uint8_t port_idx = static_cast(port_); const i2c_hw_config_t &hw = i2c_hw_map[port_idx]; uint32_t i2c = hw.i2c_periph; - if (len == 1) { + if (len == 1) + { i2c_ack_config(i2c, I2C_ACK_DISABLE); - } else { + } + else + { i2c_ack_config(i2c, I2C_ACK_ENABLE); } RetCode ret = i2c_master_start(i2c, dev.dev_addr_, I2C_RECEIVER); - if (ret != RET_OK) { + if (ret != RET_OK) + { i2c_stop_on_bus(i2c); return ret; } - for (uint32_t i = 0; i < len; i++) { - if (i == len - 1) { + for (uint32_t i = 0; i < len; i++) + { + if (i == len - 1) + { i2c_ack_config(i2c, I2C_ACK_DISABLE); i2c_stop_on_bus(i2c); } - if (wait_flag(i2c, I2C_FLAG_RBNE) != RET_OK) { + if (wait_flag(i2c, I2C_FLAG_RBNE) != RET_OK) + { i2c_stop_on_bus(i2c); return RET_TIMEOUT; } @@ -245,18 +277,95 @@ RetCode I2cBus::master_read(I2cDevice &dev, uint8_t *data, uint32_t len) RetCode I2cBus::master_write_read(I2cDevice &dev, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen) { - if (wlen > 0) { - RetCode ret = master_write(dev, wdata, wlen); - if (ret != RET_OK) { - return ret; - } + if (wdata == nullptr || wlen == 0 || rdata == nullptr || rlen == 0) + { + return RET_INVALID_PARAM; + } + if (!initialized_) + return RET_NOT_INITIALIZED; + + uint8_t port_idx = static_cast(port_); + const i2c_hw_config_t &hw = i2c_hw_map[port_idx]; + uint32_t i2c = hw.i2c_periph; + + // === 写阶段:发送寄存器地址(不发 STOP) === + + uint32_t timeout = I2C_TIMEOUT; + while (i2c_flag_get(i2c, I2C_FLAG_I2CBSY)) + { + if (--timeout == 0) + return RET_TIMEOUT; } - if (rlen > 0) { - RetCode ret = master_read(dev, rdata, rlen); - if (ret != RET_OK) { - return ret; + i2c_start_on_bus(i2c); + if (wait_flag(i2c, I2C_FLAG_SBSEND) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + + i2c_master_addressing(i2c, dev.dev_addr_, I2C_TRANSMITTER); + if (wait_flag(i2c, I2C_FLAG_ADDSEND) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + i2c_flag_clear(i2c, I2C_FLAG_ADDSEND); + + for (uint32_t i = 0; i < wlen; i++) + { + if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; } + i2c_data_transmit(i2c, wdata[i]); + } + if (wait_flag(i2c, I2C_FLAG_TBE) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + + // === 读阶段:以重复起始条件开始(无 STOP 间隔) === + + if (rlen == 1) + { + i2c_ack_config(i2c, I2C_ACK_DISABLE); + } + else + { + i2c_ack_config(i2c, I2C_ACK_ENABLE); + } + + i2c_start_on_bus(i2c); + if (wait_flag(i2c, I2C_FLAG_SBSEND) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + + i2c_master_addressing(i2c, dev.dev_addr_, I2C_RECEIVER); + if (wait_flag(i2c, I2C_FLAG_ADDSEND) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + i2c_flag_clear(i2c, I2C_FLAG_ADDSEND); + + for (uint32_t i = 0; i < rlen; i++) + { + if (i == rlen - 1) + { + i2c_ack_config(i2c, I2C_ACK_DISABLE); + i2c_stop_on_bus(i2c); + } + if (wait_flag(i2c, I2C_FLAG_RBNE) != RET_OK) + { + i2c_stop_on_bus(i2c); + return RET_TIMEOUT; + } + rdata[i] = i2c_data_receive(i2c); } return RET_OK; diff --git a/drv/i2c/i2c_driver.h b/drv/i2c/i2c_driver.h index 37c0667..54cd0e3 100644 --- a/drv/i2c/i2c_driver.h +++ b/drv/i2c/i2c_driver.h @@ -46,4 +46,17 @@ private: bool initialized_ = false; }; +#ifdef __cplusplus +extern "C" { +#endif + +int i2c_init(uint8_t port, uint32_t speed_hz); +int i2c_master_write(uint8_t port, uint16_t dev_addr, const uint8_t *data, uint32_t len); +int i2c_master_read(uint8_t port, uint16_t dev_addr, uint8_t *data, uint32_t len); +int i2c_master_write_read(uint8_t port, uint16_t dev_addr, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/drv/system/gd32f4xx_it.h b/drv/system/gd32f4xx_it.h index f42460e..3c4f180 100644 --- a/drv/system/gd32f4xx_it.h +++ b/drv/system/gd32f4xx_it.h @@ -63,6 +63,8 @@ void DebugMon_Handler(void); void PendSV_Handler(void); /* this function handles SysTick exception */ void SysTick_Handler(void); +/* this function handles EXTI10-15 exception */ +void EXTI10_15_IRQHandler(void); #ifdef __cplusplus }