网上做兼职正规网站有哪些/国内最开放的浏览器
文章目录
- 1.前言
- 2.TJA1101简介
- 3.TJA1101调试
- 3.1 硬件
- 3.1.1 整体框图
- 3.1.2 评估板
- 3.1.2.1 参考原理图
- 3.1.2.2 引脚说明
- 3.1.3 转接板
- 3.1.3.1 参考原理图
- 3.1.3.2 模式配置
- 3.1.3.3 原理介绍
- 3.2 软件
- 3.2.1 物理层(TJA1101):
- 3.2.2 数据链路层(S32K148):
- 3.2.3 主要代码
- 3.3 测试
- 3.3.1 测试normal mode
- 3.3.2 测试link up 和 link down
- 3.3.3 测试wake up
- 4.参考资料
1.前言
如上图所示,为了适应车身越来越多的ECU节点,汽车电子架构正在从传统的分布式往集中式(Domain、Zonal)转变。在这转变的过程中,除了传统的CAN,LIN节点变多之外,汽车以太网也开始被广泛的使用。
以下图(传统的分布式架构)为例,汽车以太网主要用于大数据传输的场合,如摄像头,雷达,显示,网关等。
在CAN、LIN收发器占据大部分市场份额的NXP也早在2017年推出了百兆车载以太网PHY芯片-TJA1100,随后又推出了TJA1101,TJA1102等产品,roadmap如下所示,下文将介绍如何快速调试TJA1101。
2.TJA1101简介
TJA1101为单端口IEEE 802.3bw(100BASE-T1) PHY,符合功能安全ASIL-A。可通过非屏蔽双绞线(UTP)电缆提供100Mbit/s的发送和接收能力,同时针对耦合到UTP线路的容性信号耦合进行了优化,支持至少15米的电流长度。TJA1101与介质访问控制单元(MAC)的通信接口为MII或者RMII。
TJA1101支持符合OPEN联盟TC10标准的睡眠和唤醒转发解决方案,具体如下,同时拥有和唤醒线路相关的本地唤醒引脚。
- 全局系统唤醒
- 通过总线进行可靠的远程唤醒检测
- PHY层级唤醒转发
- 进入睡眠时的握手确认
- 节省一个额外的唤醒线路
3.TJA1101调试
目前TJA1101系列主推的是TJA1101BHN,但是笔者手上只有S32K148+TJA1101AHN的板子,TJA1101AHN和TJA1101BHN是软硬件兼容的,这里就以TJA1101AHN为例,介绍调试相关的内容。
3.1 硬件
测试环境主要由两块板子组成,一块S32K148评估板,用于驱动TJA1101,并发送数据;一块以太网转接板,将车载以太网信号转为工业以太网信号,方便在电脑上查看。
3.1.1 整体框图
整个测试环境的框图如下所示:
3.1.2 评估板
对于TJA1101的调试工作在S32K148评估板完成,如下是S32K148评估板有关以太网部份的介绍。
3.1.2.1 参考原理图
TJA1101的推荐电路图如下所示,
其中使用本地25MHz晶振的MII和RMII连接方式如下图所示,
3.1.2.2 引脚说明
TJA1101和S32K148的接口主要是®MII和SMI,S32K148用到的引脚以及功能定义如下:
同时,TJA1101有一些引脚具有pin strapping的功能,如下所示:(红框中是S32K148板子的实际配置)
3.1.3 转接板
以太网转接板主要元器件为一颗工业以太网PHY+以太网PHY,然后都配置成Reverse MII模式,用来实现车载以太网的信号转换成传统的工业以太网的信号
3.1.3.1 参考原理图
Reverse MII模式下的TJA1101推荐原理图如下:
3.1.3.2 模式配置
参考上一章节有关pin strapping的描述,转接板上TJA1101的配置为:Master,自主模式,Reverse MII。
3.1.3.3 原理介绍
如果需要深入了解转接板的原理图,可以查看胡工的公众号文章,链接如下:
- 汽车以太网(100BASE-T1)转工业以太网(100BASE-TX)转换器工作原理介绍 (qq.com)
3.2 软件
接下来是软件的配置介绍,本次对于TJA1101的调试基于S32DS 2.2自带的如下例程进行修改。
打开例程后,图形化界面相关的组件有三个,其中GPIO口的配置参考3.1.2.2章节进行设置,phy和mac的设置介绍如下。
3.2.1 物理层(TJA1101):
打开phy组件的图形化界面,如下所示:
其中,有四项配置说明下:
- Address设置需要和pin strapping的设置匹配,或者使用广播地址0x00
- PHY Role,设置为自动,跟随pin strapping,为从机模式
- link Up Event Callback,填充link up事件发生时调用的回调函数名称
- link Down Event Callback,填充link down事件发生时调用的回调函数名称
3.2.2 数据链路层(S32K148):
打开ethernet组件的图形化界面,如下所示:
其中,有两项配置说明下:
- MAC Address,测试时随便填充即可,实际使用时车厂统一分配
- MII configuration,选择模式,速度以及全双工/半双工
3.2.3 主要代码
#define GPIO_PORT PTE
#define PCC_CLOCK PCC_PORTE_CLOCK
#define LED1_RED (1 << 21U)
#define LED2_YELLOW (1 << 22U)
#define LED3_BLUE (1 << 23U)
#define PTB_PHY_INT (1 << 20U)
#define PTC_BTN0 (1 << 12U)
#define PTC_BTN1 (1 << 13U)#define PHY_CONFIG1 18U
#define PHY_CONFIG1_FWDREM 0x0004U
#define PHY_EXTENDED_CTRL_ADDR 17U
#define PHY_EXTENDED_CTRL_CONFIG_EN 0x0004U
#define PHY_COM_CONFIG 27U
#define PHY_COM_CONFIG_WAKE 0x0040Ustatic uint8_t srcMacaddress[]={0x11,0x22,0x33,0x44,0x55,0x99};typedef struct {uint8_t destAddr[6];uint8_t srcAddr[6];uint16_t length;uint8_t payload[1500];
} mac_frame_t;void copyBuff(uint8_t *dest, uint8_t *src, uint32_t len)
{uint32_t i;for (i = 0; i < len; i++){dest[i] = src[i];}
}void rx_callback(uint8_t instance, enet_event_t event, uint8_t ring)
{(void)instance;if (event == ENET_RX_EVENT){enet_buffer_t buff;status_t status;status = ENET_DRV_ReadFrame(INST_ETHERNET1, ring, &buff, NULL);if (status == STATUS_SUCCESS){mac_frame_t *frame;frame = (mac_frame_t *) buff.data;/* You can process the payload here */(void)frame->payload;// /*turn off Blue led*/
// PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);ENET_DRV_ProvideRxBuff(INST_ETHERNET1, ring, &buff);}}
}/* Port C IRQ handler */
void portc_Handler(void)
{uint32_t flags;static bool loopback;static phy_role_t phyRole = PHY_ROLE_MASTER;uint32_t delay = 1000000U;do{/* wait some time to allow capturing pushing multiple buttons at once */delay--;}while(delay != 0);flags = PINS_DRV_GetPortIntFlag(PORTC);if ((flags & (PTC_BTN1 | PTC_BTN0)) == (PTC_BTN1 | PTC_BTN0)){/* both buttons pressed - change master/slave settings */PHY_SetRole(0, phyRole);phyRole = (phyRole == PHY_ROLE_MASTER) ? (PHY_ROLE_SLAVE) : (PHY_ROLE_MASTER);}else{if ((flags & PTC_BTN1) != 0U){PHY_Sleep(0);}if ((flags & PTC_BTN0) != 0U){if (loopback){PHY_SetLoopback(0, PHY_LOOPBACK_NONE);}else{PHY_SetLoopback(0, PHY_LOOPBACK_INTERNAL);}loopback = !loopback;}}/* Clear interrupt flag */PINS_DRV_ClearPortIntFlagCmd(PORTC);
}/* Link up callback */
void link_up(uint8_t phy)
{if (phy == 0U){/* if link up,turn off red led and turn on yellow led*/PINS_DRV_ClearPins(GPIO_PORT, LED2_YELLOW);PINS_DRV_SetPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);}
}/* Link down callback */
void link_down(uint8_t phy)
{if (phy == 0U){/* set PTE21 to low for turning on Red led*/PINS_DRV_ClearPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED2_YELLOW);PINS_DRV_SetPins(GPIO_PORT, LED3_BLUE);}
}/*!\brief The main function for the project.\details The startup initialization sequence is the following:* - startup asm routine* - main()*/
int main(void)
{/* Write your local variable definition here */enet_buffer_t buff;mac_frame_t frame;uint8_t i;status_t ENET_status;static uint16_t extCtrl = 0;/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
#ifdef PEX_RTOS_INITPEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
#endif/*** End of Processor Expert internal initialization. ***//* Initialize and configure clocks* - see clock manager component for details*/CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);/* Initialize pins* - See PinSettings component for more info*/PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);/* Initialize ENET instance */ENET_DRV_Init(INST_ETHERNET1, ðernet1_State, ðernet1_InitConfig0, ethernet1_buffConfigArr0, ethernet1_MacAddr);ENET_DRV_EnableMDIO(INST_ETHERNET1, false);/* turn on Red led for init */PINS_DRV_ClearPins(GPIO_PORT, LED1_RED);PHY_FrameworkInit(phyConfig, phyDrivers);PHY_Init(0);/* make custom settings */PHY_RMR(0, PHY_EXTENDED_CTRL_ADDR, PHY_EXTENDED_CTRL_CONFIG_EN, PHY_EXTENDED_CTRL_CONFIG_EN);PHY_RMR(0, PHY_CONFIG1, PHY_CONFIG1_FWDREM, PHY_CONFIG1_FWDREM);PHY_RMR(0, PHY_COM_CONFIG, PHY_COM_CONFIG_WAKE, PHY_COM_CONFIG_WAKE); /* ratio metric threshold on wake pin */PHY_RMR(0, PHY_EXTENDED_CTRL_ADDR, 0, PHY_EXTENDED_CTRL_CONFIG_EN);INT_SYS_InstallHandler(PORTC_IRQn, portc_Handler, (isr_t *)0);INT_SYS_EnableIRQ(PORTC_IRQn);// /* set tja1101 into internal loopback mode */
// PHY_SetLoopback(0, PHY_LOOPBACK_INTERNAL);/* prepare for sending data */for (i = 0; i < 50U; i++){frame.payload[i] = i;}copyBuff(frame.destAddr, ethernet1_MacAddr, 6U);copyBuff(frame.srcAddr, srcMacaddress, 6U);frame.length = 50U;buff.data = (uint8_t *)&frame;/* Length == 12 bytes MAC addresses + 2 bytes length + 50 bytes payload */buff.length = 64U;ENET_DRV_SendFrame(INST_ETHERNET1, 0U, &buff, NULL);OSIF_TimeDelay(500);while (1){/* Provides polling support, by handling specific events */PHY_MainFunction(0);ENET_status = ENET_DRV_GetTransmitStatus(INST_ETHERNET1,0,&buff, NULL);if (ENET_status == STATUS_SUCCESS){ENET_DRV_SendFrame(INST_ETHERNET1, 0U, &buff, NULL);/* if send ok, toggle yellow led*/PINS_DRV_TogglePins(GPIO_PORT, LED2_YELLOW);}PHY_Read(0, PHY_EXTENDED_CTRL_ADDR, &extCtrl);if (extCtrl == 0xD000U){/* when tja1101 go to sleep mode, toggle on blue led*/PINS_DRV_TogglePins(GPIO_PORT, LED3_BLUE);PINS_DRV_SetPins(GPIO_PORT, LED1_RED);PINS_DRV_SetPins(GPIO_PORT, LED2_YELLOW);}OSIF_TimeDelay(500);}
3.3 测试
3.3.1 测试normal mode
连上S32K148开发板、以太网转接板以及电脑,然后上电,红色LED短暂亮一下,然后黄色LED闪烁,在电脑的抓包软件wireshark上能看到S32K148循环发送的以太网数据。
wireshark抓取的部分数据如下图:
3.3.2 测试link up 和 link down
两种中断状态进入的条件如下:
测试情况为:
-
上电之后,先打开红色LED,然后进入link_up回调函数,关闭红色LED,打开黄色LED。wireshark显示数据正常发送的同时,黄色LED闪烁。
-
接着断开双绞线(TRX_P和TRX_N),进入link_down回调函数,关闭黄色LED,打开红色LED。wireshark面板上没有数据显示。
-
最后接上双绞线(TRX_P和TRX_N),进入link_up回调函数,关闭红色LED,打开黄色LED。wireshark显示数据正常发送的同时,黄色LED闪烁。
3.3.3 测试wake up
通过在WAKE_IN_OUT引脚产生上升沿去产生唤醒事件,从而唤醒TJA1101。
测试情况为:
-
上电之后红色LED短暂亮一下,然后黄色LED闪烁。按下开发板的按钮,配置TJA1101进入sleep模式,黄色LED熄灭,蓝色LED点亮,wireshark面板上没有数据显示。
-
在WAKE_IN_OUT引脚短接一下VDD,产生一个上升沿,唤醒TJA1101,进入normal模式,关闭蓝色LED,黄色LED闪烁,wireshark显示数据正常发送。
4.参考资料
- TJA1101B, 100BASE-T1 PHY for automotive Ethernet – Data Sheet (nxp.com)
- Automotive Ethernet Switches & PHY Transceivers Brochure (nxp.com)
本文主要介绍了如何快速调试TJA1101,对于很多细节的东西没有展开。后面有时间会专门写几篇文章分别介绍TJA1101的硬件设计,软件驱动以及测试注意事项。
如果觉得本文对你有用,不妨给个一键三连!!!
相关文章:

基于S32K148快速调试TJA1101
文章目录1.前言2.TJA1101简介3.TJA1101调试3.1 硬件3.1.1 整体框图3.1.2 评估板3.1.2.1 参考原理图3.1.2.2 引脚说明3.1.3 转接板3.1.3.1 参考原理图3.1.3.2 模式配置3.1.3.3 原理介绍3.2 软件3.2.1 物理层(TJA1101):3.2.2 数据链路层&#x…...

万字长文详解webpack知识图谱
webpack概念 概念 Webpack 是一种用于构建 JavaScript 应用程序的静态模块打包器,它能够以一种相对一致且开放的处理方式,加载应用中的所有资源文件(图片、CSS、视频、字体文件等),并将其合并打包成浏览器兼容的 Web…...

模板测试(Stencil Test)
模板测试可以用来针对特殊的区域进行渲染控制,实现有趣的效果,例如绘制物体轮廓。在 使用模板测试的时候,一般的步骤如下: 启用模板测试,以便写入数值到模板缓冲中渲染物体,根据渲染的物体将特定的数值写入到模板缓冲中禁用模板缓冲写入设置模板函数,根据于模板缓冲中的…...

【Go语言学习】安装与配置
文章目录前言一、Go语言学习站二、安装与配置1.安装2.环境变量配置3.Gland编辑器安装与配置Hello, World!总结前言 Go语言特性 Go,又称为 Golang,是一门开源的编程语言,由 Google 开发。Go 语言的设计目标是提供一种简单、快速、高效、安全…...

HCIP-5OSPF区域类型学习笔记
1、OSPF区域类型 OSPF提出了区域的概念(AREA),区域是将所有运行OSPF 的路由器人为的分成不同的组,以区域ID来标示。在区域内路由计算的方法不变,由于划分区域之后,每个区域内的路由器不会很多,…...

C语言再学习第三章
例题3-1 编写一个函数,实现华氏度和摄氏度的转化。 已知公式:c (5/9)*(f-32) #include <stdio.h>double f_value 0; double c_value 0; int main(void) {printf("请输入华氏温度\n");scanf("%lf",&f_valu…...

【aiy篇】小目标检测综述
小目标检测(Small Object Detection)是指在图像中检测尺寸较小的目标物体,通常是指物体的尺寸小于图像大小的1/10或者更小,COCO为例,面积小于等于1024像素的对象维下目标。小目标检测是计算机视觉领域的一个重要研究方…...

常用Linux命令的基本使用
序号 命令 对应英文 作用 1 ls list 查看当前文件夹下的内容 2 pwd print work directory 查看当前所在文件夹 3 cd[目录名] changge directory 切换文件夹 4 touch[文件名] touch 如果文件不存在,新建文件 5 mkdir[目录名] make directory …...

对跳表的深入理解
一,如何理解跳表 简单说跳表(Skip list)就是链表的“二分查找”。redis 的有序集合用的就是跳表算法。跳表是一种各方面性能都比较优秀的动态数据结构,可以支持快速地插入、删除、查找操作,写起来也不复杂,…...

C++017-C++冒泡排序与插入排序
文章目录C017-C冒泡排序与插入排序冒泡排序与插入排序目标冒泡排序排序规则冒泡排序优化插入排序题目描述在线练习:总结C017-C冒泡排序与插入排序 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 冒泡排序与插入排序 参考:…...

数据结构基础之链表
目录 前言 1、什么是链表 2、添加元素 3、虚拟头结点 4、查询&修改元素 5、删除元素 附:完整代码 前言 又到周末了,修整了一天,继续来写点东西吧,今天,我们来学习数据结构中的另一种基础的数据结构——链表…...

css 的渲染层合成是什么,浏览器如何创建新的渲染层
在 DOM 树中每个节点都会对应一个渲染对象(RenderObject),当它们的渲染对象处于相同的坐标空间(z 轴空间)时,就会形成一个 RenderLayers,也就是渲染层。渲染层将保证页面元素以正确的顺序堆叠&a…...

nacos-sdk-rust binding to NodeJs
广告时间 nacos-sdk-rust-binding-node : nacos-sdk-rust binding to NodeJs with napi. Tip: nacos-sdk-nodejs 仓库暂未提供 2.x gRPC 交互模式,为了能升级它,故而通过 node addon 方式调用 nacos-sdk-rust npm 包 -> https://www.npmjs.com/packa…...

MySQL下载安装以及环境配置教程
目录MySQL 下载MySQL 安装配置环境变量MySQL 下载 进入官方网站 https://www.mysql.com/ 点击 DOWNLOADS 进入下载页面 免费版本点击下方的 MySQL Community (GPL) Downloads 点击 MySQL Community Server 点击 Go to Download Page 进入下载页面 点击 Download 点击 No thank…...

概率论 1.3 古典概型与几何概型
1.3.1 排列与组合排列从n个不同元素任取r(r<n)个元素排成一列(考虑元素出现的先后次序),称此为一个排列,此种排列的总数为n(n-1)....(n-r1)n!/(n-r)!,若rn,则称为全排列,2.重复排列从n个不同元素中每次取出一个,放回…...

HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。HTML DOM (文档对象模型)当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM 定义了用于 HTML 的一系列标准的对象,以及访问和处…...

Vue组件-$refs、$nextTick和name属性的使用
Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…...

【Spark】Spark的DataFrame向Impala写入数据异常及源码解析
背景 事情是这样的,当前业务有一个场景: 从业务库的Mysql抽取数据到Hive 由于运行环境的网络限制,当前选择的方案: 使用spark抽取业务库的数据表,然后利用impala jdbc数据灌输到hive。(没有spark on hive 的条件&…...

学习笔记-架构的演进之限流-3月day03
文章目录前言限流的目标流量统计指标限流设计模式流量计数器模式滑动时间窗模式漏桶模式令牌桶模式分布式限流总结附前言 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建…...

动态规划 背包问题
动态规划 背包问题 问题描述: 有一个背包,总容量为12。有6件物品,每件物品的重量和价值不同,求在背包总容量12的前提下,装进物品的最大价值以及装进物品的编号 单个物品重量和价值: 为方便进行思考&#…...

C++ Primer Plus 学习笔记(四)—— 内存模型和名称空间
1 单独编译 C允许将组件函数放在独立的文件即头文件中,头文件中可以包含以下内容: 函数原型;使用#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。 注意,在包含…...

详解基于 Celestia、Eclipse 构建的首个Layer3 链 Nautilus Chain
以流支付为主要概念的Zebec生态,正在推动流支付这种新兴的支付方式向更远的方向发展,该生态最初以Zebec Protocol的形态发展,并从初期的Solana进一步拓展至BNB Chian以及Near上。与此同时,Zebec生态也在积极的寻求从协议形态向公链…...

列表与数组的转化
目录用np.array(a)将列表转换为数组列表转数组的特殊情况(一)列表转数组的特殊情况(二)针对子元素个数不一致的解决办法用a.tolist()函数将数组转化为列表在python的学习中,经常会用到数组与列表的相互转化,本文主要介绍下关于数组与列表转化的问题。用n…...

docker 运行花生壳实现内外网穿透
环境:centos 7 ,64位 1、创建一个指定的文件夹作为安装示例所用,该示例文件夹为“hsk-nwct”。“hsk-nwct”内创建“app”文件夹作为docker容器挂载出来的文件。 2、在“app”内下载花生壳linux安装包,下载花生壳应用:花生壳客户…...

操作系统——16.时间片轮转、优先级、多级反馈队列算法
这篇文章我们来看一下进程调度算法中的时间片轮转、优先级、多级反馈队列算法 目录 1.概述 2.时间片轮转调度算法(RR,Round-Robin) 3.优先级调度算法 4.多级反馈队列调度算法 5.分析对比 1.概述 首先,我们来看一下这篇文章…...

Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap-命令行操作
文章目录1.认识Redis1.1.优点1.2.缺点2.在Django中Redis的连接3.Redis的基础用法3.1.hashmap结构3.2.list结构4.命令行查看数据库5.作者答疑1.认识Redis Remote DIctionary Server(Redis) 是一个key-value 存储系统,是跨平台的非关系型数据库。是一个开源的使用 AN…...

Android kotlin 系列讲解(进阶篇)高级项目架构模式 - MVVM
<<返回总目录 1、MVVM是什么 MVVM是Model-View-ViewModel的缩写,是一种高级项目架构模式。 MVVM架构可以将程序结构主要分成三个部分: Model:数据模型部分,包括从服务端获取的json数据或者从本地获取的数据等等View&…...

8. 查找
1 题目描述 查找成绩10开启时间2021年09月24日 星期五 18:00折扣0.8折扣时间2021年11月15日 星期一 00:00允许迟交否关闭时间2021年11月23日 星期二 00:00 输入 n(n ≤ 10^6)个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数 &#…...

二分查找算法
感谢“五点七边”工作室的算法讲解,详细内容可以参考视频讲解 二分查找为什么总是写错?_哔哩哔哩_bilibili 此处仅是个人学习总结 以target等于5为例,输入: 1 2 3 5 5 5 8 9 1. 找到第一个 > target 的元素 判断条件 < target&am…...

Git(3)之远程服务器
Git基础之远程服务器 Author:onceday date:2023年3月5日 满满长路有人对你微笑过嘛… windows安装可参考文章:git简易配置_onceday_CSDN博客 參考文档: 《progit2.pdf》,Progit2 Github。《git-book.pdf》 文章目…...