您尚未登录。

楼主 # 2024-06-01 09:57:14

Leotian
会员
所在地: 河南
注册时间: 2020-03-27
已发帖子: 39
积分: 136

荔枝派Nano STM32风格跑rt-thread&lvgl&fatfs&cherryusb&GPIO&IIC&SPI&电阻触摸ns2009

来源声明:
F1C100S 模仿stm32标准库风格来源  https://whycan.com/t_10475.html   
在大神的基础上增加(修改)成了电阻屏NS2009驱动,配合某宝上二手4.3寸电阻屏,真心实惠

操作系统:
windows(linux平台未测试,请自行测试)

编辑环境:
vscode

编译器:
arm-none-eabi-gcc (需要安装make工具)

硬件修改:
Nano的IIC SDA  SCL  没上拉电阻,需手工焊接(另一根飞线是烙铁焊接NS2009时焊盘脱落,正常板子无需焊接):
注意:硬件设计通常3.3K-10K选作为上拉电阻
QQ图片20240601092953.png


完整版程序源码:F1C100SMDK_NS2009.rar

1.安装VScode
2.安装arm-none-eabi-gcc,安装过程记得勾选添加环境变量为:
    2.1所谓的arm-none-eabi-gcc其实是借助win版的mingw,因此arm-none-eabi-gcc并不是用的Readme的arm-none-eabi-gcc,而是arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi,百度安装版本,记得勾选添加环境变量
    2.2安装mingw-w64并添加系统环境变量
3.下载大神的工程文件:
源码地址
github平台链接: https://github.com/lhdjply/f1c200s_library/
gitee平台链接: https://gitee.com/lhdjply/f1c200s_library/
4.按照README.md
安装Make和Task Buttons工具
5.大神串口打印使用的是A2和A3,这时能看到A2  A3打印出报文:

F1C200S demo test!
---------------------------
开机打印内容在task.c中,可自行修改,到这里已经完成基础程序验证,源程序屏幕使用的是800*480的电容屏,触摸芯片GT911,接下来尝试把程序修改为480*272电阻触摸屏,触摸芯片NS2009
6.先修改屏幕分辨率
找到hardware->inc->lcd.h修改:

// LCD驱动参数设置
//4.3寸 480*272
#define LCD_FREQ 9000000 //9Mhz 屏幕时钟
#define MY_DISP_HOR_RES 480 //屏幕水平分辨率
#define MY_DISP_VER_RES 272 //屏幕垂直分辨率

#define LCD_HOR_PULSE_WIDTH 4 // 水平脉宽
#define LCD_HOR_BACK_PORCH 43 // 水平后廊
#define LCD_HOR_FRONT_PORCH 8 // 水平前廊

#define LCD_VER_PULSE_WIDTH 4 // 垂直脉宽
#define LCD_VER_BACK_PORCH 12 // 垂直后廊
#define LCD_VER_FRONT_PORCH 8 // 垂直前廊

//4.3寸 800*480
// #define LCD_FREQ 30000000 //30Mhz 屏幕时钟
// #define MY_DISP_HOR_RES 800 //屏幕水平分辨率
// #define MY_DISP_VER_RES 480 //屏幕垂直分辨率

// #define LCD_HOR_PULSE_WIDTH 8 // 水平脉宽
// #define LCD_HOR_BACK_PORCH 8 // 水平后廊
// #define LCD_HOR_FRONT_PORCH 4 // 水平前廊

// #define LCD_VER_PULSE_WIDTH 8 // 垂直脉宽
// #define LCD_VER_BACK_PORCH 10 // 垂直后廊
// #define LCD_VER_FRONT_PORCH 4 // 垂直前廊

7.根据帖子下cqwangsf评论,可对GT911.C、gt911.h、f1cx00s_i2c.c、f1cx00s_i2c.h做修改,即可完成NS2009的功能

最近编辑记录 Leotian (2024-06-01 15:05:36)

离线

楼主 #1 2024-06-01 14:59:06

Leotian
会员
所在地: 河南
注册时间: 2020-03-27
已发帖子: 39
积分: 136

Re: 荔枝派Nano STM32风格跑rt-thread&lvgl&fatfs&cherryusb&GPIO&IIC&SPI&电阻触摸ns2009

@Leotian
8.对NS2009驱动做整理如下:
8.1f1cx00s_i2c.c中对I2C读指令不符合NS2009的操作习惯,因此,在f1cx00s_i2c.c结尾增加:

void I2C_Read_Reg2(I2C_TypeDef * I2Cx, uint8_t cmd, uint8_t Reg, uint8_t * Data, uint32_t data_len)
{
  //**********地址+读指令*********//
  I2C_Start(I2Cx);
  I2C_Send_Data(I2Cx, (uint8_t)I2Cx->ADDR);
  I2C_Send_Data(I2Cx, cmd);
  I2C_Stop(I2Cx);
  //**********寄存器地址+读数据*********//
  I2C_Start(I2Cx);
  I2C_Send_Data(I2Cx, Reg);
  I2C_Receive_Data(I2Cx, Data, data_len);
  I2C_Stop(I2Cx);
}

在f1cx00s_i2c.h中增加声明

void I2C_Read_Reg2(I2C_TypeDef * I2Cx, uint8_t cmd, uint8_t Reg, uint8_t * Data, uint32_t data_len);

8.2在hardware分别添加ns2009.c和ns2009.h驱动文件

ns2009.c针对cqwangsf的功能增加了读ns2009  X、Y、Z值的中间值滤波算法,其余模仿GT911进行初始化:
//*********************************电阻屏的滤波中间值滤波法********************//

uint16_t TP_Read_XOY(uint8_t xy)
{
	uint8_t READ_TIMES = 15;//读取次数
	uint8_t LOST_VAL = 5;//丢弃值(去掉高低各10个数)
	uint16_t i, j,temp,buf[READ_TIMES];
	uint32_t sum=0;
	for(i=0;i<READ_TIMES;i++)
  {
		buf[i]=ns2009_read(xy);
	}
	for(i=0;i<READ_TIMES-1; i++){//排序
		for(j=i+1;j<READ_TIMES;j++){
			if(buf[i]>buf[j]){//升序排列
				temp=buf[i];
				buf[i]=buf[j];
				buf[j]=temp;
			}
		}
	}
	sum=0;
	for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++){
		sum+=buf[i];
	}
	temp = sum/(READ_TIMES-2*LOST_VAL);
	return temp;
}

//********************增加ns2009读取*****************//
uint16_t ns2009_read(uint8_t _cmd)
{
  uint8_t buf[2];     //用于存储读取到的数值,
  uint16_t tp_adc;    //返回数值
  I2C_SetSlaveAddress(NS2009_I2C, NS2009_ADDR_WRITE);        //设置写地址NS2009_ADDR_WRITE=0X90
  I2C_Read_Reg2(NS2009_I2C,_cmd, NS2009_ADDR_READ, buf, 2);  //设置读地址NS2009_ADDR_READ=0X91
  tp_adc=((uint16_t)buf[0]<<8)+buf[1];
  tp_adc=(tp_adc>>4)&0xfff; 
  return tp_adc;
}

ns2009.h修改定义如下内容为了区分GT911电阻触摸屏宏定义为rtp_dev_t:

#ifndef _NS2009_H
#define _NS2009_H
#include "sys.h"
#include "delay.h"
#include "lcd.h"
//*********************************增加NS2009***************************//
#define NS2009_I2C I2C0
//增加NS2009定义
#define NS2009_ADDR_READ  0x91
#define NS2009_ADDR_WRITE 0x90
#define X_Adapt_Width    480//分辨率X
#define Y_Adapt_Heigth   270//分辨率Y

#define MAX_12BIT    0xfff
#define TOUCH_I2C_NAME            "i2c0"
#define NS2009_Device_ID        "ns2009"
#define NS2009_READ_X_LOW_POWER_12BIT      0xc0
#define NS2009_READ_Y_LOW_POWER_12BIT      0xd0
#define NS2009_READ_Z1_LOW_POWER_12BIT    0xe0
#define NS2009_READ_Z2_LOW_POWER_12BIT    0xf0
#define NS2009_DEF_X_FUZZ    32
#define NS2009_DEF_Y_FUZZ    16
#define NS2009_PEN_UP_Z1_ERR    70//触摸最小值
#define TP_THREAD_PRIORITY 25
#define TP_THREAD_STACK_SIZE 512
#define TP_THREAD_TIMESLICE 5
#define X_Origin         300
#define X_Width          (3870-300)
#define Y_Origin        380
#define Y_Heigth        (3900-380)
//*************************************NS2009增加完成****************//
// I2C读写命令
#define GT_CMD_ADDR 0x14
typedef struct
{
  uint16_t x;     /*!< 当前x坐标 */
  uint16_t y;     /*!< 当前y坐标 */
  uint8_t status; /*!< 触摸状态 */
  uint16_t sta;
} rtp_dev_t;

void NS2009_Init(void);
void NS2009_Read_XY(rtp_dev_t * rtp_devx);
uint16_t TP_Read_XOY(uint8_t xy);
uint16_t ns2009_read(uint8_t _cmd);
#endif

9.接下来是该LVGL触摸的接口函数:
找到third_party->lvgl->porting->lv_port_indev.c修改接口函数:
9.1引用部分修改为:

//**************电阻屏**********//
#include "ns2009.h"
extern rtp_dev_t rtp_dev;

9.2static void touchpad_init(void)函数的初始化函数
GT911_Init();修改为NS2009_Init();
9.3static void touchpad_read(lv_indev_t *indev_drv, lv_indev_data_t *data)中修改电容屏读取为电阻屏读取:

static void touchpad_read(lv_indev_t *indev_drv, lv_indev_data_t *data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;
    //******************电容屏读取***********//
    // GT911_Read_XY(&tp_dev);
    // if (tp_dev.status == 1)
    // {
    //     last_x = tp_dev.x;
    //     last_y = tp_dev.y;
    //     data->point.x = last_x;
    //     data->point.y = last_y;
    //     data->state = LV_INDEV_STATE_PR;
    // }
    //******************电阻屏读取***********//
    NS2009_Read_XY(&rtp_dev);
    if (rtp_dev.status == 1)
    {
        last_x = rtp_dev.x;
        last_y = rtp_dev.y;
        data->point.x = last_x;
        data->point.y = last_y;
        data->state = LV_INDEV_STATE_PR;
    }
    else
    {
        data->point.x = last_x;
        data->point.y = last_y;
        data->state = LV_INDEV_STATE_REL;
    }
}

10.修改完成,编译-烧录-上屏测试:

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn