S32的进阶之路->9,S32DS的CAN总线配置

硬件:S32K144开发板

软件:S32DS 2.2

 1,S32K144硬件连接说明

       看门狗定时器时间到没有喂狗就会触发系统复位,反之定时时间内喂狗会正常工作,可以避免程序跑飞等软硬件问题。 IO口分配情况如下,S32K144开发板具有3个按键和4个LED灯,具体与芯片的引脚连接情况如下所示。

 * IO口分配情况
 * KEY1 PTC12
 * KEY2 PTC13
 * KEY3 PTB2

2,S32K144的CAN配置

        S32DS的外设配置通过图形配置工具Component Inspector来实现。双击Components下方的pin_mux按钮(1)打开图形配置工具Component Inspector(2)。可以双击图形配置工具Component Inspector空白处让它最大化方便我们进行配置。

        按照下图对应配置三路CAN总线的对应引脚,CAN0(1)、CAN1(2)、CAN2(3)。完成配置引脚后退出。

        双击Components(1)按钮打开图形配置工具Component Iibrary(2)进行外设添加。双击can_pal(3)按钮添加三个CAN外设,对应上方配置的三路CAN总线。配置完成如(4)所示。

3,S32K144的CAN常用函数说明

1,CAN初始化函数CAN_Init。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_Init
 * 描述 : 配置 CAN 模块
 *
 * 工具:CAN_Init_Activity
 *结束**************************************************************************/

status_t CAN_Init(const can_instance_t * const instance,
                  const can_user_config_t *config)

2,配置接收缓冲函数CAN_ConfigRxBuff。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_ConfigRxBuff
 * 描述 : 配置用于接收的缓冲区。
 *
 * 工具:CAN_ConfigRxBuff_Activity
 *结束**************************************************************************/
status_t CAN_ConfigRxBuff(const can_instance_t * const instance,
                          uint32_t buffIdx,
                          const can_buff_config_t *config,
                          uint32_t acceptedId)

3,配置发送缓冲函数CAN_ConfigTxBuff。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_ConfigTxBuff
 * 描述 :配置用于传输的缓冲区。
 *
 * 工具:CAN_ConfigTxBuff_Activity
 *结束**************************************************************************/
status_t CAN_ConfigTxBuff(const can_instance_t * const instance,
                          uint32_t buffIdx,
                          const can_buff_config_t *config)

4,缓冲区配置 ID 过滤器函数CAN_SetRxFilter。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_SetRxFilter
 * 描述 : 为特定接收缓冲区配置 ID 过滤器。
 *
 * 工具:CAN_SetRxFilter_Activity
 *结束**************************************************************************/
status_t CAN_SetRxFilter(const can_instance_t * const instance,
                         can_msg_id_type_t idType,
                         uint32_t buffIdx,
                         uint32_t mask)

5,安装 IRQ 处理程序的回调函数CAN_InstallEventCallback。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_InstallEventCallback
 * 描述 : 安装 IRQ 处理程序的回调函数。
 *
 * 工具:CAN_InstallEventCallback_Activity
 *结束**************************************************************************/
status_t CAN_InstallEventCallback(const can_instance_t * const instance,
                                  can_callback_t callback,
                                  void *callbackParam)

6,CAN接收函数CAN_Receive。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_Receive
 * 描述 : 使用指定的消息缓冲区接收 CAN 帧。
 *
 * 工具:CAN_Receive_Activity
 *结束**************************************************************************/
status_t CAN_Receive(const can_instance_t * const 实例,
                     uint32_t buffIdx,
                     can_message_t *消息)

7,CAN发送函数CAN_Send。

/*功能**********************************************************************
 *
 * 函数名称 : CAN_Send
 * 描述 : 使用指定的缓冲区发送 CAN 帧。
 *
 * 实施 : CAN_Send_Activity
 *结束**************************************************************************/
status_t CAN_Send(const can_instance_t * const instance,
                  uint32_t buffIdx,
                  const can_message_t *message)

4,S32K144的CAN实战

        实现三个按键控制三路CAN发送,按下KEY1后CAN0发送,按下KEY2后CAN1发送,按下KEY3后CAN2发送。发送的信息接收后从串口发出便于观察。这里只写出CAN0的代码示例,其余两个类似。

1,编写can_init()函数进行CAN初始化。

void CAN0_Init(void)
{
	  CAN_Init(&can_pal0_instance, &can_pal0_Config0);
	  can_buff_config_t Rx_buffCfg =  {
	      .enableFD = false,
	      .enableBRS = false,
	      .fdPadding = 0U,
	      .idType = CAN_MSG_ID_STD,
	      .isRemote = false
	  };

	  can_buff_config_t Tx_buffCfg =  {
	      .enableFD = false,
	      .enableBRS = false,
	      .fdPadding = 0U,
	      .idType = CAN_MSG_ID_STD,
	      .isRemote = false
	  };
	  CAN_ConfigRxBuff(&can_pal0_instance, RX_MAILBOX_CAN0, &Rx_buffCfg, Rx_Filter); //注册接收配置和MSGID过滤器(如过滤器配置为0x1,则只接受msgid 0x1发来的报文)
	  CAN_ConfigTxBuff(&can_pal0_instance, TX_MAILBOX_CAN0, &Tx_buffCfg); //配置发送
	  /*设置MSGID的掩码,掩码粗略可以理解为对11bit MSGID地址的过滤
	   如果某bit位需要过滤设置为1,不过滤设置为0,例如掩码设置为0x7ff则过滤全部标准id,如果设置为0x7fe,这只能接受0x01的报文(不存在0x0的地址)*/
	  CAN_SetRxFilter(&can_pal0_instance,CAN_MSG_ID_STD,RX_MAILBOX_CAN0,0); //设置MSGID掩码,
	  CAN_InstallEventCallback(&can_pal0_instance,&CAN0_Callback_Func,(void*)0); //注册回调函数
	  CAN_Receive(&can_pal0_instance, RX_MAILBOX_CAN0, &recvMsg_CAN0); //*****重点****此函数不只有接收作用 还有续订回调函数的作用.
}

2,编写回调函数

void CAN0_Callback_Func (uint32_t instance,can_event_t event,uint32_t buffIdx,void *flexcanState)
  {
	(void)flexcanState; //此处防止警报
	(void)instance;
	(void)buffIdx;
	CAN_Receive(&can_pal0_instance, RX_MAILBOX_CAN0, &recvMsg_CAN0); //接收报文并重新注册回调函数
	switch(event) //回调事件
		{
			case CAN_EVENT_RX_COMPLETE: //接收完成 事件
				IRQ_CAN0_RX =1;
				break;
			case CAN_EVENT_TX_COMPLETE: //发送完成事件
				break;
			default:
				break;
		}
  }

3,编写发送函数

		/*按键处理*/
			pinstate = KEY_Proc (0);
			if(pinstate ==BTN1_PRES )
			{
				can_message_t Tx_msg = {
							 .cs = 0U,
							 .id = 0x01,
							 .data[0] = 0x0,
							 .data[1] = 0x1,
							 .data[2] = 0x2,
							 .data[3] = 0x3,
							 .data[4] = 0x4,
							 .data[5] = 0x5,
							 .data[6] = 0x6,
							 .data[7] = 0x7,
							 .length = 8
						 };
				CAN_Send(&can_pal0_instance, TX_MAILBOX_CAN0, &Tx_msg);
				u1_printf("CAN0发送报文\r\n");

			}

4,编写接收函数

			if (IRQ_CAN0_RX ==1)
			 {
				 int i;
				 u1_printf("CAN0 RECV ID:0x%x \r\n",recvMsg_CAN0.id);
				 for(i=0; i<recvMsg_CAN0.length;i++)
				 {
					 u1_printf("Data %d : %x\r\n",i,recvMsg_CAN0.data[i]);
					 if(i==recvMsg_CAN0.length-1) u1_printf("***************\r\n");
				 }
				 IRQ_CAN0_RX=0;
			 }

5,烧录验证

### 回答1: s32ds flexcan是一款常见的车联网控制器芯片,其最大的特点是支持CAN总线通信协议。在实际应用中,一些场景需要更高的数据传输速率和可靠性,此时可以使用CAN FD(Flexiable Data)协议。 为使s32ds flexcan支持CANFD,需要进行如下配置: 1. 修改波特率配置 CANFD通信需要更高的波特率。在s32ds flexcan的配置中,需要将传输速率提高,以支持CANFD通信。具体的波特率配置需要根据应用场景进行调整。 2. 配置FD控制器 s32ds flexcan芯片集成了FD控制器,可以支持CANFD通信。需要在芯片配置中将FD控制器打开,并设置通信模式等参数。 3. 配置数据位定时器 CANFD通信采用了不同于CAN的数据位定时器。s32ds flexcan需要配置数据位定时器来支持CANFD通信。 4. 配置错误处理 由于CANFD通信的复杂性,可能会出现数据丢失、数据错误等问题。因此,s32ds flexcan需要设置合适的错误处理机制,以兼容CANFD通信。 以上就是s32ds flexcan配置CANFD的具体步骤,需要根据具体应用来进行调整。它可以实现更高的数据传输速率和可靠性,可以在车联网等应用中发挥重要作用。 ### 回答2: S32DS FlexCAN是专门用于汽车电子应用的MCU软件工具,而CANFD(CAN Flexible Data Rate)是CAN协议的升级版本,其最大的特点是可以支持更高的数据传输速率。因此,在使用S32DS FlexCAN时,需要配置CANFD以适应更高的数据传输速率。 首先,需要修改CANFD的波特率预分频器寄存器(CANFD_CCCR)和波特率分频器寄存器(CANFD_BTR)。通过设置CANFD_CCCR的CLKDIV和CANFD_BTR的BRP、SJW、TSEG1和TSEG2来调整CANFD的数据传输速率,以满足不同应用的需求。此外,还需要在配置CANFD时选择合适的中断模式、错误处理模式和工作模式等。其中,工作模式包括常规模式、测试模式和静默模式,可以根据不同的应用场景自由选择。 在完成CANFD的配置后,还需要进行数据的发送和接收操作。可以使用S32DS FlexCAN提供的API函数来实现数据的发送和接收。在数据发送时,需要先将数据写入CANFD的数据缓冲区中,然后通过发送请求命令将数据发送出去。在数据接收时,需要先设置接收缓冲区和相应的过滤器,然后通过接收缓冲区来获取接收到的数据。 总之,通过S32DS FlexCAN和CANFD的配合使用,可以实现高效、可靠、高速的数据传输,为汽车电子应用提供了重要的支持。 ### 回答3: s32ds flexcan是一款面向汽车领域的开发工具,可以帮助开发人员快速开发和调试车载电子控制系统。配置canfd是s32ds flexcan的重要功能之一,可以帮助实现更高的数据传输速率和更靠近实时的数据传输。 在s32ds flexcan中,配置canfd需要进行以下步骤: 1. 配置CAN时钟:可以选择外部时钟或内部时钟。内部时钟需要设置时钟分频比例。 2. 配置canfd时钟:canfd时钟需要使用PLL时钟,需要先配置PLL时钟。可以选择内部PLL时钟或外部时钟。 3. 配置canfd模式:可以选择classic CAN或canfd模式。如果选用canfd模式,需要设置canfd时钟分频系数。 4. 配置canfd数据速率:可以选择8M、5M、4M、2M、1M、500K或250K数据速率。同时需要设置canfd数据段长度、canfd时间段长度和canfd同步点数量。 5. 启动canfd:启动canfd后,可以开始进行数据传输。可以使用s32ds flexcan中提供的调试工具来检查数据传输质量。 总之,s32ds flexcan配置canfd需要进行多项设置和调试工作,需要有一定的开发经验和技术能力。通过理解和掌握上述配置步骤,可以实现高效可靠的canfd数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值