页次: 1
CAN芯片是 PHY吗?
见:ESP-IDF的twai_alert_and_recovery例子:
| Supported Targets | ESP32 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 |
| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- |
# TWAI Alert and Recovery Example
(See the README.md file in the upper level 'examples' directory for more information about examples.)
This example demonstrates how to use the alert and bus recovery features of the TWAI driver. The alert feature allows the TWAI driver to notify the application layer of certain TWAI driver or bus events. The bus recovery feature is used to recover the TWAI driver after it has entered the Bus-Off state. See the TWAI driver reference for more details.
## How to use example
### Hardware Required
This example requires only a single target (e.g., an ESP32 or ESP32-S2). The target must be connected to an external transceiver (e.g., a SN65HVD23X transceiver). This connection usually consists of a TX and an RX signal.
Note: If you don't have an external transceiver, this example can still be run by simply connecting the TX GPIO and RX GPIO with a jumper.
最近项目需求,计划做一款手持式调试工具,具备工业上常用的485、CAN调试功能
1.选ESP32 S3的原因:ESP32 S3转为调试而生,专为远程调试、升级而生,想想看,项目某些地方出了问题,最好的办法就是调试,如果有一款可远程调试的工具,使用时你只需要给远程操作员一个Key,他将Key填入手持式设备,接上手持设备,你可以远程看报文。
2.设备开发预留远程升级功能的,可以远程对改工具、其它设备进行远程升级。
3.485、CAN调试助手,直接在设备触摸屏上查看报文
社区朋友们帮忙给个建议需要加232芯片么?项目目前远距离通信较多,RS232没有使用
ESP32-S3模块IO规划如下:
ESP32-S3模块IO规划2如下(485与CAN不再复用):
方案分析:首先想使用320*480的屏首先考虑的是选用的屏幕的问题,320*480的单片机接口屏价格在30-40中间,留给控制板只剩不到20块,PCB需要5块,剩下的硬件最多20块,
单片机屏(不播放图片,不要求高刷)
方案1 STM32F103RCT6+SPI串口屏+XPT2046作为触摸芯片,普通功能可实现,开发周期短,简单实用,缺点是主频有点儿低,播放JPG等图片卡顿
方案2 STM32F411CEU6+SPI串口屏+XPT2046作为触摸芯片,普通功能可实现,开发周期短,也很实用,MCU有DSP加速,播放JPG等稍微卡顿
方案3 HC32F460+SPI串口屏+XPT2046作为触摸芯片,普通功能可实现,华大的芯片性价比高,可能需要点儿开发周期,但MDK可开发,也很实用,MCU有DSP加速,播放JPG等稍微卡顿
方案4 ESP32+SPI串口屏+XPT2046作为触摸芯片,普通功能可实现,开发周期短,简单实用,播放JPG卡顿较轻,受限于GPIO限制,SPI屏的刷新频率在10-20FPS中间
RGB屏(可播放图片,可高刷)
RGB屏幕272*480分辨率成本可控制在30块左右,那么留给PCB的钱就充裕很多 综合成本约50元左右:F1C100S 13块,ESP32S3带内存版本15块
方案1:F1C100S+4.3寸RGB电阻触屏,论坛很多好的资料,使用LVGL屏幕刷新频率70FPS以上
方案2:ESP32S3模块+4.3寸RGB电阻触屏,这个方案优点很多,比如支持蓝牙,OTA等等,使用LVGL屏幕刷新频率25FPS以上,
@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.修改完成,编译-烧录-上屏测试:
来源声明:
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选作为上拉电阻
完整版程序源码: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的功能
页次: 1