内容介绍
内容介绍
FunPack3_4--基于FRDM-MCXN947板卡实现的以太网通讯实验
—— 基于恩智浦 MCXN947 MCU 的低成本设计和评估板
一、项目介绍
此次活动选择任务 2:
- 使用板卡上的以太网接口连接到电脑上并通过以太网和电脑通信,实现数据传输。要求电脑可以获取到板卡上的温度,触摸和按键信息,并可以通过电脑控制板卡上的 RGB LED 灯(有搭配扩展模块,传感器类的在电脑上显示数据,执行器类的能用电脑控制其工作)
设计思路
- 确定所需模块内容
- 以太网:Lwip、TCP协议栈
- I2C驱动、P3T1755DP 温度传感器驱动
- 触摸按键 TSI驱动
- CTIMER PWM输出
- 外置扩展 RTC 模块驱动(暂未使用)
- 软件逻辑
使用LWIP将板卡配置为TCP客户端,使用RAW方式编程,配合Vofa+ 上位机实现温度数据曲线显示、TouchPad状态上传以及上位机RGB控制。
设计框图
二、硬件信息
该板由一个 MCXN947 器件和一个 64 mbit 外部串行闪存 (由 Winbond 公司提供) 组成。
板载资源
- P3T1755DP I3C 温度传感器
- TJA1057GTK/3Z CAN PHY
- 以太网 PHY
- SDHC 电路(卡槽为 DNP)
- RGB LED
- 触摸板
- 高速 USB 电路
- 按钮等 MCU-Link 调试器电路。
板载接口
- Arduino 扩展
- PMOD 拓展
- MicroBus 总线拓展
- 该板还支持摄像头模块
- NXP 低成本 LCD 模块 PAR-LCD-S035
- 板载 MCU-Link 调试器基于 LPC55S69 MCU
MCU特性
- Arm®Cortex®-M33@150MHz(双核)
- DSP 加速器(PowerQUAD,带协处理器接口)
- SmartDMA(用于并行摄像头接口和键盘扫描等应用的协处理器)
- eIQ®Neutron N1-16 神经处理单元
- 4 个 16 位 ADC(单端)或 2 个 16 位(差分),每个 ADC 集成温度传感器
- 3 个高速比较器,带有 17 个输入引脚和 8 位 DAC 作为内部参考
- 2 个 12 位 DAC,采样率高达 1.0MSample/sec
- 1 个 14 位 DAC,采样率高达 5MSample/sec
- 3 个功率放大器
- 5 个 32 位标准通用异步定时器 / 计数器,最多支持 4 个捕获输入和 4 个比较输出、PWM 模式和外部计数输入。可选择特定的定时器事件,以生成 DMA 请求。
- SCTimer/PWM
- LPTimer
- 10 个 LP Flexcomm,每个都支持 SPI、I2C、UART
- 2 个支持 FD 的 FlexCAN 接口、2 个 I3C、2 个 SAI
- 1 个具有 QoS 的以太网接口
- 1 个 FlexIO 可编程接口,可作为各种串行和并行接口,包括但不限于显示驱动程序和摄像头接口
三、程序说明
程序流程图
主要函数说明
温度读取
从SDK Manage 内添加p3t1755驱动程序,默认初始化I3C及芯片后,可直接通过接口从芯片读取温度数据。
void APP_GetTempture(double * temperature)
{
P3T1755_ReadTemperature(&p3t1755Handle, temperature);
}
TSIO 中断函数
在TSI默认的回调函数中判断TouchPad是否被按下,并设置对应的全局变量。
void TSI0_IRQHandler(void)
{
#if BOARD_TSI_ELECTRODE_1 > 15
/* errata ERR051410: When reading TSI_COMFIG[TSICH] bitfield, the upper most bit will always be 0. */
if ((TSI_GetSelfCapMeasuredChannel(APP_TSI) | 0x10U) == BOARD_TSI_ELECTRODE_1)
#else
if (TSI_GetSelfCapMeasuredChannel(APP_TSI) == BOARD_TSI_ELECTRODE_1)
#endif
{
if (TSI_GetCounter(APP_TSI) > (uint16_t)(buffer.calibratedData[BOARD_TSI_ELECTRODE_1] + TOUCH_DELTA_VALUE))
{
KeyFlag = 1;
s_tsiInProgress = false;
}
else
{
KeyFlag = 0;
}
}
/* Clear endOfScan flag */
TSI_ClearStatusFlags(APP_TSI, kTSI_EndOfScanFlag);
SDK_ISR_EXIT_BARRIER;
}
TCP接收回调函数
1.新建连接触发函数
static err_t tcp_server_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
/* 分配内存并设置传递给TCP控制块的用户数据 */
tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));
/* 保存连接的TCP控制块 */
user_pcb = pcb;
/* 向客户端发送一个连接确认消息 */
tcp_write(pcb, "hello my dream \n\r", strlen("hello my dream \n\r"), 1);
/* 设置接收数据时的回调函数 */
tcp_recv(pcb, tcp_server_recv);
return ERR_OK; /* 返回操作成功的状态 */
}
2.接收到一个数据帧触发函数
- 大部分的处理是在此函数中完成的,主要包括客户端数据处理,并实现RGB的PWM控制。
static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)
{
struct pbuf *tcp_send_pbuf;
struct name *name = (struct name *)arg;
if (tcp_recv_pbuf != NULL) /* 检查是否接收到数据包 */
{
/* 扩大TCP接收窗口,通知协议栈已经处理了这些数据 */
tcp_recved(pcb, tcp_recv_pbuf->tot_len);
if (!name) /* 检查用户数据是否有效 */
{
pbuf_free(tcp_recv_pbuf); /* 释放接收到的数据包 */
return ERR_ARG; /* 返回参数错误 */
}
/* 处理接收到的数据 */
tcp_send_pbuf = tcp_recv_pbuf;
char identifier[20]; /* 存储标识符的缓冲区 */
int value; /* 存储数值的变量 */
/* 使用sscanf解析接收到的数据 */
if (tcp_send_pbuf->len <= sizeof(identifier))
{
sscanf(tcp_send_pbuf->payload, "%[^:]:%d", identifier, &value);
/* 根据标识符更新PWM信号 */
if (strcmp(identifier, "LED_G") == 0)
{
CTIMER_UpdatePwmDutycycle(CTIMER0, CTIMER0_PWM_PERIOD_CH, CTIMER0_PWM_3_CHANNEL, (uint8_t)value);
}
else if (strcmp(identifier, "LED_R") == 0)
{
CTIMER_UpdatePwmDutycycle(CTIMER0, CTIMER0_PWM_PERIOD_CH, CTIMER0_PWM_0_CHANNEL, (uint8_t)value);
}
else if (strcmp(identifier, "LED_B") == 0)
{
CTIMER_UpdatePwmDutycycle(CTIMER1, CTIMER0_PWM_PERIOD_CH, CTIMER0_PWM_0_CHANNEL, (uint8_t)value);
}
}
/* 释放接收到的数据包 */
pbuf_free(tcp_recv_pbuf);
}
else if (err == ERR_OK) /* 如果没有数据包但错误为ERR_OK */
{
/* 释放用户数据内存并关闭连接 */
mem_free(name);
return tcp_close(pcb);
}
return ERR_OK; /* 返回操作成功的状态 */
}
主函数
int main(void)
{
/* 将FRO 12M时钟源附加到FLEXCOMM4(调试控制台) */
CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1);
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
/* 将PLL0时钟源附加到I3C,150MHz / 6 = 25MHz */
CLOCK_SetClkDiv(kCLOCK_DivI3c1FClk, 6U);
CLOCK_AttachClk(kPLL0_to_I3C1FCLK);
/* 初始化引脚配置、时钟、外设和调试控制台 */
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitPeripherals();
BOARD_InitDebugConsole();
/* 初始化温度传感器、网络模块和触摸板 */
APP_Temp_Init();
APP_Net_Init();
APP_TouchPad_Init();
while (1)
{
static uint16_t scnt = 0;
/* 每60,000次循环周期执行一次 */
if(60000 == scnt++)
{
scnt = 0;
/* 获取环境温度并格式化字符串 */
APP_GetTempture(&EnvTemp);
char buffer[] = "test_hellowo,2";
sprintf(buffer, "Temp:%.2f,%d\r\n", EnvTemp, KeyFlag);
/* 打印温度到调试控制台 */
PRINTF("Temperature:%f \r\n", EnvTemp);
/* 发送温度数据到网络 */
APP_Net_Send(buffer, sizeof(buffer));
}
/* 处理以太网输入和系统超时检查 */
ethernetif_input(&netif);
sys_check_timeouts();
}
}
MCUXPresso Config Tool 相关配置
IO相关配置
- 在外设信号选项卡页面找到相应外设;
- 在外设引脚上选择复用的IO口;
- 保存并更新代码
外设配置
- 在组件选项卡内添加相应外设;
- 在右下角提示窗口根据错误提示添加SDK、配置对应时钟和PIN脚;
- 根据手册或教程配置参数;
- 更新代码。
四、总结
- 这是一次非常好的新MCU上手体验,官方提供了非常多的入门博客、完善的RTT资料和强大的MCUXpresso IDE 工具包,完善的外设驱动库,让开发者无痛上手。
- 这此的选题是网络协议栈相关,现工作内容与以太网没有太多接触,但是对于新的技术栈还是非常感兴趣的,在此次活动当中,对LWIP组件、以太网、TCP协议栈多了一层理解。
- 跟随大家的脚步,做了图像识别相关的实验,希望有机会将摄像头驱动、模型训练这一套玩起来。
附件下载
vofa+.tabviews.json
Funpack3_4_Code.zip
团队介绍
个人
评论
0 / 100
查看更多
猜你喜欢
Funpack3-4 基于FRDM-MCXN947的以太网通讯工具该项目使用了FRDM-MCXN947板卡,实现了通过以太网连接PC进行通信的设计,它的主要功能为:使用板卡上的以太网接口连接到电脑上并通过以太网和电脑通信,实现触摸按键,实体按键,led数据传输。。
反正都一样
104
基于FRDM-MCXN947使用以太网接口控制板卡该项目使用了FRDM-MCXN947,实现了以太网接口控制板卡的设计,它的主要功能为:以太网接口控制板卡。
冲向天空的猪
68
Funpack3-5 基于Teensy 4.1的以太网通讯工具该项目使用了Teensy 4.1,实现了通过以太网连接PC进行通信的设计,它的主要功能为:使用板卡上的以太网接口连接到电脑上并通过以太网和电脑通信,实现led数据传输。。
反正都一样
93