基于S32K148快速调试TJA1101

2 篇文章 4 订阅
订阅专栏

1.前言

汽车架构演变[图片来源:NXP]

如上图所示,为了适应车身越来越多的ECU节点,汽车电子架构正在从传统的分布式往集中式(Domain、Zonal)转变。在这转变的过程中,除了传统的CAN,LIN节点变多之外,汽车以太网也开始被广泛的使用。

以下图(传统的分布式架构)为例,汽车以太网主要用于大数据传输的场合,如摄像头,雷达,显示,网关等。

分布式架构中车载网络[图片来源:NXP]

在CAN、LIN收发器占据大部分市场份额的NXP也早在2017年推出了百兆车载以太网PHY芯片-TJA1100,随后又推出了TJA1101,TJA1102等产品,roadmap如下所示,下文将介绍如何快速调试TJA1101。

NXP PHY Roadmap[图片来源:NXP]

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的推荐电路图如下所示,

TJA1101推荐电路图

其中使用本地25MHz晶振的MII和RMII连接方式如下图所示,

MII and RMII

3.1.2.2 引脚说明

TJA1101和S32K148的接口主要是®MII和SMI,S32K148用到的引脚以及功能定义如下:

MII接口和SMI接口

同时,TJA1101有一些引脚具有pin strapping的功能,如下所示:(红框中是S32K148板子的实际配置)

Pin strapping

3.1.3 转接板

以太网转接板主要元器件为一颗工业以太网PHY+以太网PHY,然后都配置成Reverse MII模式,用来实现车载以太网的信号转换成传统的工业以太网的信号

3.1.3.1 参考原理图

Reverse MII模式下的TJA1101推荐原理图如下:

Reverse MII

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自带的如下例程进行修改。

phy_tja1101_s32k148

打开例程后,图形化界面相关的组件有三个,其中GPIO口的配置参考3.1.2.2章节进行设置,phy和mac的设置介绍如下。

3.2.1 物理层(TJA1101):

打开phy组件的图形化界面,如下所示:

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配置

其中,有两项配置说明下:

  • 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          0x0040U

static 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_INIT
  PEX_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, &ethernet1_State, &ethernet1_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抓取的部分数据如下图:

wireshark抓取的数据

3.3.2 测试link up 和 link down

两种中断状态进入的条件如下:

link up and 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的硬件设计,软件驱动以及测试注意事项。


如果觉得本文对你有用,不妨给个一键三连!!!

汽车网卡驱动之TJA1101B
让学习成为一种习惯
07-13 932
一旦在线路上检测到超过tdet(PHY)的有效以太网空闲脉冲(使用REMWUPHY =)1), TJA1101B在待机模式下唤醒,并通过INH控制信号接通主电源单元。在上电时,当引脚VBAT上的电压高于欠压恢复阈值(Vuvr(VBAT)), TJA1101B进入Standby模式,INH控制输出(INH HIGH引脚)闭合。当引脚RST_N保持低电平至少tdet(rst)(max)时,只要Vop(io)上的电压高于欠压阈值,TJA1101B从任何模式切换到复位模式(除Power-off)。
S32K148 AutoSar BSW开发笔记之—ModeManagement(ECUM)
lix1990110的博客
04-15 835
2、S32K148 休眠前必需关闭系统滴答定时器中断(system tick)否则无法进入休眠模式。Mode Management 休眠唤醒依赖模块:PORT、ICU 、ECUM、OS、MCU。2、ICU 唤醒源配置为外部中断下降沿触发模式并将ICU唤醒源映射到ECUM模块。1、S32K148 休眠唤醒时钟配置必需和RUN模式系统时钟配置独立开。2、AutoSar Mode Management参考帖子。1、PORT 唤醒源配置为输入模式。4、Os 配置中断回调函数。3、ECUM 唤醒源配置。
TJA1101汽车网卡调试
林深的小创作
06-12 7135
linux 驱动:从官网下载source code git clone https://source.codeaurora.org/external/autoivnsw/tja110x_linux_phydev uboot驱动调试 原理图 需要查看datasheet的接口模式,支持 这两种模式 MII: RMII: 这两种接口的接法不一样,可以...
[S32K]S32K148入门笔记(1)FTM
最新发布
weixin_45372981的博客
09-02 253
FTM配置
TJA1101B的硬件设计
北极熊的脖子(16605192620@163.com)
04-01 2645
本文主要介绍TJA1101B的硬件设计,重点讲解各个模块的原理图设计注意事项
S32K148 SDK3.0 PE配置 看门狗(WDOG)
weifengdq的专栏
12-03 2942
文章目录前言建立工程ProcessorExpert配置代码补全完整工程下载微信公众号 前言 S32K1xx Series Reference Manual的pdf文档23章给出了看门狗的框图: 先不用细看, 下面结合PE配置看. 本文中用到LPUART2(PTA8, PTA9), 用的J-Link调试, S32K148_SDK 3.0.0. 建立工程 打开S32 Design Studio fo...
S32K148开发板Ethernet相关内容
Qi_Xiaoshan的博客
10-22 2459
最近在做一些关于S32K148开发板的使用,研读了些该开发板关于ENET模块的官方文档。 2 Ethernet MAC (ENET) 2.1 Chip-specific ENET information S32K148有一个ENET模块实例。S32K1xx系列的其他产品没有ENET模块。 注意: •在使用ENET_MDIO或ENET_TMRx之前,对应的引脚需要配置GPIO_PDDR。 •通过设置PORT_PCRn寄存器的DSE字段,使能ENET传输盘的驱动强...
简易S32K148 bootloader
瓶0盖的博客
04-02 467
编写S32K148的bootloader,需要了解S32K148的内部结构和功能,并且需要使用S32K148的开发工具和相关资料。bootloader程序需要占用一定的flash空间,需要保证bootloader程序不会覆盖应用程序的代码和数据。bootloader程序需要能够检查应用程序是否需要更新,如果需要更新,则需要执行应用程序更新操作。bootloader程序需要能够跳转至应用程序的入口点,以启动应用程序的执行。bootloader程序需要具有稳定性和可靠性,以确保系统的安全性和可靠性。
S32K148----SDK笔记----LPUART_含printf支持
weifengdq的专栏
10-23 8137
文章目录前言建立工程ProcessorExpert配置发送一条消息printf支持接收中断 前言 S32K148自带3路LPUART(0/1/2), 除此之外, 还有FLEXIO中的两路(两对收发, 或者4收, 或者4发?), 从某宝淘了个最小系统板和Jlink V9, 本文就用它们做一个LPUART的笔记: 左边是Jlink V9, 支持虚拟串口(没有的话试试 J-Link Commander...
s32k148链接文件
瓶0盖的博客
03-30 473
链接文件将程序代码放置在Flash中,将已初始化数据放置在SRAM_U中,将未初始化数据放置在SRAM_U中,并定义了堆和栈的起始地址和大小。S32K148链接文件中包含了目标文件的地址分配、内存映射、符号定义等信息,是编译器生成可执行文件的关键。在编写链接文件时,需要考虑内存布局、符号定义和脚本语句等方面的问题,并进行精确的调试和优化。需要注意的是,上述链接文件只是一个简单的示例,实际应用中需要根据具体的应用场景和硬件平台进行调整和优化,并进行精确的调试和测试。
S32K144 EVB之UART
xlbtlmy的博客
10-30 6972
开发环境IAR7.8 + S32K144-EVB本次使用到的是UART1,可以使用OpenSDA的mini USB口直接接到电脑上即可看到串口信息: 使用到的端口引脚为: UART_TX -> PTC6 UART_RX -> PTC7step1:配置GPIO//config clock source PCC->PCCn[PCC_PORTC_INDEX] = 0x40000000;POR
S32K144_例程.zip
09-10
S32K144的一些例程,在moudle_example中是各例程的主函数。包括:adc,can,eeprom,flash,ftm,gpio,pit,uart,wdog。
S32K Data Sheet
04-30
S32K Data Sheet,請使用Adobe Reader開啟,該PDF有附件,可以查看Part Number List以及Power Modes相關configuration 因為當初找得很辛苦,分享給需要的人下載,記得要用Adobe Reader開啟才看得到兩個Excel附件
s32k148_nxp 用keil创建样板
10-23
nxp的s32k148基于keil5上的工程创建样板,148是刚出新片子,网上基本没有keil的样板工程,我吃了回螃蟹,刚开始一直创建不了,后来跟nxp原厂沟通后,提供的demo后稍微修改。
S32K148RTOS移植,最小系统
01-11
S32K148的FREERTOS移植,里面是最精简的系统移植,自己可以添加别的文件
S32K148----SDK笔记----CAN收发
热门推荐
weifengdq的专栏
10-24 1万+
文章目录前言建立工程ProcessorExpert配置发送CAN报文CAN接收中断工程代码 前言 S32K148自带3路CAN, 官方的SDK给了can_pal的例程, 本文更基础一点, 直接用flexcan组件相关的函数, CANFD需要相应的电平转换芯片速率上的支持, 我暂时用不到CANFD, 就只拿来做基础的CAN通信. 先测试CAN发送, 然后测试CAN的接收中断. 板子某宝淘的, 连接两...
S32K148实现250K转500K波特率的网关
yypencyclopedia3的博客
06-24 1478
功能:利用单片机的can0和can1两路can,实现不同波特率的2路can的网关路由功能。 单片机:s32k148,144pin 环境:s32ds,SDK3.0版本 安装包:S32DS_ARM_Win32_v2.2 烧写器:Jlink 总线监测工具:canoe 硬件:破解已有pcb板,can接口芯片用的是TJA1042 ...
S32K148----SDK笔记----LwIP以太网测试
weifengdq的专栏
10-25 5892
文章目录前言建立工程ProcessorExpert配置补全代码调试运行工程代码 前言 S32K148含字母E或者J的有以太网, 如FS32K148UJ, 使用RMII接口连接PHY芯片, 官方的开发板带的PHY是TJA1101, 车载以太网, 传输使用两根线而不是标准4根线的百兆以太网, 这里我们还是用传统的方式来测试, 外接的是KSZ8041PHY, 代码方面可以说没有差别, 某宝淘的板子: ...
【S32K 148】Lin组件 Slave从机配置
m0_60368817的博客
04-30 415
4.Wake _LIN------->PTB21 拉低(不用唤醒)先配置GPIO口为output,在配置初始值0 如上----(但是可配可不配)ZLG USBCANFD-100U -----发送ID为0x 01,数据段为0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18。1.Lin由Lpuart2配置-------> 我的板子原理图对应的Lpuart2 Pin口为PTD6,PTD7 (需要修改)用的ZLG USBCANFD-100U盒,当主机时,本来需要。
基于S32K342芯片与TJA1145AT/FD收发器,怎么实现FlexCAN通信,具体代码和详细解释
06-05
FlexCAN是一种常用的CAN通信协议,支持多种工作模式和数据传输速率。在S32K342芯片和TJA1145AT/FD收发器的组合中,可以通过FlexCAN协议实现高效的数据通信。以下是实现FlexCAN通信的具体代码和详细解释。 1. 初始化CAN模块 ```c void Init_FlexCAN(void) { /* Enable clock for FlexCAN module */ PCC->PCCn[PCC_FlexCAN1_INDEX] |= PCC_PCCn_CGC_MASK; /* Set FlexCAN clock source */ CLOCK_SetIpSrc(kCLOCK_FlexCan1, kCLOCK_IpSrcSircAsync); /* Reset FlexCAN module */ FLEXCAN1->MCR |= FLEXCAN_MCR_SOFTRST_MASK; while ((FLEXCAN1->MCR & FLEXCAN_MCR_SOFTRST_MASK) == FLEXCAN_MCR_SOFTRST_MASK); /* Set FlexCAN module to normal mode */ FLEXCAN1->MCR &= ~FLEXCAN_MCR_MDIS_MASK; /* Configure FlexCAN module */ FLEXCAN1->CTRL1 |= FLEXCAN_CTRL1_PRESDIV(0x01) | FLEXCAN_CTRL1_PROPSEG(0x03) | FLEXCAN_CTRL1_PSEG1(0x03) | FLEXCAN_CTRL1_PSEG2(0x03); FLEXCAN1->CTRL1 &= ~FLEXCAN_CTRL1_CLK_SRC_MASK; FLEXCAN1->CTRL1 |= FLEXCAN_CTRL1_ERR_MSK_MASK | FLEXCAN_CTRL1_BOFF_MSK_MASK; /* Set CAN bus to FD mode */ FLEXCAN1->MCR |= FLEXCAN_MCR_FDEN_MASK; FLEXCAN1->CTRL1 |= FLEXCAN_CTRL1_FDEN_MASK | FLEXCAN_CTRL1_TDCEN_MASK | FLEXCAN_CTRL1_TDCOFF(0x03); /* Enable FlexCAN module */ FLEXCAN1->MCR &= ~FLEXCAN_MCR_HALT_MASK; while ((FLEXCAN1->MCR & FLEXCAN_MCR_FRZACK_MASK) != FLEXCAN_MCR_FRZACK_MASK); } ``` 在初始化FlexCAN模块之前,需要先开启FlexCAN模块的时钟,并设置FlexCAN模块时钟源。初始化过程中,需要进行以下操作: - 重置FlexCAN模块; - 将FlexCAN模块设置为正常模式; - 配置FlexCAN模块的预分频、传播段、相位缓冲段1和相位缓冲段2; - 设置CAN总线为FD模式; - 启用FlexCAN模块。 2. 发送CAN数据 ```c void Send_FlexCAN(uint32_t id, uint8_t *data, uint8_t len) { flexcan_frame_t frame; /* Set CAN message ID */ frame.id = id; frame.format = kFLEXCAN_FrameFormatStandard; frame.type = kFLEXCAN_FrameTypeData; /* Set CAN message data */ memcpy(frame.data, data, len); frame.length = len; /* Send CAN message */ while ((FLEXCAN1->IFLAG1 & FLEXCAN_IFLAG1_BUF5I_MASK) == FLEXCAN_IFLAG1_BUF5I_MASK); FLEXCAN1->MB[5].CS |= FLEXCAN_MB_CS_CODE(kFLEXCAN_TxData) | FLEXCAN_MB_CS_DLC(frame.length) | FLEXCAN_MB_CS_SRR_MASK; FLEXCAN1->MB[5].ID = FLEXCAN_ID_STD(id); memcpy((void *)&FLEXCAN1->MB[5].DATA[0], (void *)&frame.data[0], frame.length); FLEXCAN1->MB[5].CS |= FLEXCAN_MB_CS_TXIE_MASK; } ``` 发送CAN数据时,需要先创建一个flexcan_frame_t类型的数据结构,用于设置CAN消息ID、格式、类型、数据和长度。然后,需要将数据结构中的数据复制到CAN消息缓冲区中,并设置CAN消息的长度和发送方式。最后,启动CAN消息发送,并等待发送完成。 3. 接收CAN数据 ```c void Receive_FlexCAN(void) { flexcan_frame_t frame; /* Check if there is a new message available */ if ((FLEXCAN1->IFLAG1 & FLEXCAN_IFLAG1_BUF4I_MASK) == FLEXCAN_IFLAG1_BUF4I_MASK) { /* Read new message from buffer */ frame.format = kFLEXCAN_FrameFormatStandard; frame.type = kFLEXCAN_FrameTypeData; memcpy((void *)&frame.data[0], (void *)&FLEXCAN1->MB[4].DATA[0], FLEXCAN1->MB[4].CS & FLEXCAN_MB_CS_DLC_MASK); /* Print received message */ printf("Received message: ID=0x%x, Data=%s\n", FLEXCAN1->MB[4].ID & FLEXCAN_MB_ID_EXT_MASK, frame.data); /* Clear interrupt flag */ FLEXCAN1->IFLAG1 = FLEXCAN_IFLAG1_BUF4I_MASK; } } ``` 接收CAN数据时,需要先检查CAN消息缓冲区是否有新的消息。如果有新消息,则需要从缓冲区中读取消息数据,并根据需要进行解析和处理。最后,需要清除中断标志位以允许处理下一条CAN消息。 以上是基于S32K342芯片与TJA1145AT/FD收发器实现FlexCAN通信的代码和解释。需要注意的是,在实际应用中,还需要根据具体的应用场景进行相应的配置和优化。同时,为确保数据传输的可靠性和安全性,还需要考虑CAN消息的加密、校验和等方面的问题。
写文章

热门文章

  • CAN(FD)收发器选型及替换指南(一) 29488
  • S32 Design Studio for ARM 2.2 快速入门 20372
  • CAN(FD)收发器选型及替换指南(二) 14516
  • FreeMASTER快速入门 13730
  • 利用pyinstaller将Python3.6文件打包成exe程序 12816

分类专栏

  • 域控制器 1篇
  • 电机 3篇
  • S32K1xx 16篇
  • 车灯 11篇
  • TLE987x 1篇
  • Tkinter 2篇
  • S32K3xx 1篇
  • 信息安全 1篇
  • 车载以太网 2篇
  • FreeMASTER 2篇
  • LIN总线 4篇
  • KEA 6篇
  • S32DS For ARM 4篇
  • 单片机 6篇
  • Python 6篇
  • CAN总线 5篇

最新评论

  • FreeMASTER快速入门

    可可可ke: 为什么我的comm通讯方式那里是空白啊?

  • S32 Design Studio for ARM 2.2 快速入门

    Auto FAE进阶之路: 感谢肯定

  • 基于S32K144驱动NSD8381

    Auto FAE进阶之路: 你看一下文末的例程,是一次性发3个字节的。主要是对spi驱动函数的参数进行赋值

  • 基于S32K144驱动NSD8381

    陳190: 你好 我请问一下 这个s32ds中 spi怎么读写多个字节啊

  • S32 Design Studio for ARM 2.2 快速入门

    Auto FAE进阶之路: 看看设备管理器那边,调试器的接口驱动有没有装上

最新文章

  • 盘点BDC/ZCU方案常用的芯片
  • 【技术支持案例】使用S32K144+NSD8381驱动电子膨胀阀
  • 基于S32K144驱动NSD8381
2024年7篇
2023年12篇
2022年15篇
2021年8篇
2020年4篇
2018年2篇
2017年6篇
2016年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auto FAE进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家北京黄色斜纹状玻璃钢花盆河南超市商场美陈采购丽江玻璃钢雕塑制作南京耐高温玻璃钢雕塑摆件湖州步行街玻璃钢雕塑优势济宁玻璃钢雕塑制作公司池州个性化玻璃钢雕塑优势宁夏抽象人物玻璃钢雕塑公司扬州玻璃钢雕塑生产厂家天津商场创意商业美陈报价广东户外商场美陈供应商茂名玻璃钢主题雕塑玻璃钢花盆组景承德玻璃钢雕塑定制三门峡景观玻璃钢卡通雕塑天津多彩玻璃钢雕塑价位玻璃钢恐龙雕塑专业鹤壁房地产水景玻璃钢雕塑公司淮南玻璃钢雕塑制作厂家遵化玻璃钢雕塑安阳市玻璃钢雕塑定制永州玻璃钢雕塑生产公司报价遵义玻璃钢雕塑厂哪家好室外大型树脂玻璃钢雕塑新余大型玻璃钢雕塑定做价格湖州小区玻璃钢雕塑公司湖州玻璃钢花盆铸造校园玻璃钢雕塑小品户外玻璃钢雕塑服务电话佛山玻璃钢雕塑造型香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化