EB配置MCAL的CAN模块

前言

基于S32K312开发板进行配置CAN模块的收发功能。
需要的工具有:EB、S32DS、USB_CAN TooL
其中USB_CAN是进行CAN报文接收和发送的工具。
EB需要的模块有:
1.Port模块:配置can的接收和发送IO,拉高STB和EN脚
2.Can_43_FLEX模块:配置Can的收发邮箱和端口信息等
3.Canif模块:配置Can的驱动层
4.Ecuc和EcuM模块:配置相关所需配置
5.MCU和Platform模块:使能相关中断
下面是各个模块的相应的配置

1 Port模块

使用的是S32K312,只有Can0才有收发器,下面是相关引脚图。
在这里插入图片描述
所以EB的Port配置如下图
在这里插入图片描述
找到相应的引脚,并按照下图配置
在这里插入图片描述
其中STB和EN是控制CAN收发器的模式,两者都高即为正常收发模式。

2. Can_43_FLEX模块

选择模式VariantPreCompile,方便初始化
这里只需要配置两个选项即可,分别为CanController和CanHardwareObject

CanController选项

在这里插入图片描述
相关can的波特率设置
在这里插入图片描述
在这里可以通过计算相应的系数得到相应的can通信波特率。

CanHardwareObject选项

在这里可配置收发邮箱,如下图,
在这里插入图片描述
进入Can_0_RX,设置接收的信号段(每两组)
在这里插入图片描述

3.Canif模块

只需要添加这个模块即可
在这里插入图片描述

4…EcuC和EcuM模块

EcuM

在这里插入图片描述

EcuC

在这里插入图片描述

5.Mcu和Platform模块

Platform

在这里插入图片描述

Mcu

使能相应的FLEXCAN模块。

6.S32DS代码

构造can的发送函数,下面是can.c和can.文件

can.c文件

#include "can.h"

void  can_get_rx_message(const PduInfoType* PduInfoPtr , uint8_t *pRxData)
{
	uint8 lenth_cout = 0;

	for(lenth_cout = 0;lenth_cout < PduInfoPtr->SduLength;lenth_cout++)
	{
		pRxData[lenth_cout] = PduInfoPtr->SduDataPtr[lenth_cout];
	}
}

void can_send_data(uint8 Controller,Can_HwHandleType Hth,Can_IdType id,
		PduIdType swPduHandle, uint8 length, uint8* sdu)
{
    Can_PduType PduInfo;

    PduInfo.id = id;
    PduInfo.swPduHandle = swPduHandle;
    PduInfo.length = length;
    PduInfo.sdu = sdu;

    Can_43_FLEXCAN_SetControllerMode(Controller, CAN_CS_STARTED);

    Can_43_FLEXCAN_Write(Hth, &PduInfo);

}

can.h文件

#ifndef CAN_H_
#define CAN_H_

//void CAN_Analysis(const Can_HwType* Mailbox);

#include "Can_43_FLEXCAN.h"

void can_get_rx_message(const PduInfoType* PduInfoPtr , uint8_t *pRxData);

void can_send_data(uint8 Controller,Can_HwHandleType Hth,Can_IdType id,
					PduIdType swPduHandle, uint8 length, uint8* sdu);


#endif /* CAN_H_ */

在main函数调用函数即可,下面是示例

//这些是can所需要的配置,是S32调用的
uint8 CanIf_u8TxConfirmCnt = 0U;
boolean CanIf_bTxFlag = FALSE;
uint8 CanIf_u8RxIndicationCnt = 0U;
boolean CanIf_bRxFlag = FALSE;

void CanIf_ControllerBusOff(uint8 ControllerId)
{
    (void)ControllerId;
}
void CanIf_ControllerModeIndication(uint8 ControllerId, Can_ControllerStateType ControllerMode)
{
    (void)ControllerId;
    (void)ControllerMode;
}
void CanIf_TxConfirmation(PduIdType CanTxPduId)
{
    CanIf_u8TxConfirmCnt++;
    CanIf_bTxFlag = TRUE;
    (void)CanTxPduId;
}
void CanIf_RxIndication(const Can_HwType* Mailbox, const PduInfoType* PduInfoPtr )
{
    CanIf_u8RxIndicationCnt++;
    CanIf_bRxFlag = TRUE;
    (void)Mailbox;
    (void)PduInfoPtr;
}

Can_PduType Can_CreatePduInfo(Can_IdType id, PduIdType swPduHandle, uint8 length, uint8* sdu)
{
    Can_PduType PduInfo;

    PduInfo.id = id;
    PduInfo.swPduHandle = swPduHandle;
    PduInfo.length = length;
    PduInfo.sdu = sdu;

    return PduInfo;
}


int main(){
	uint8 sdu[8U]= {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
	can_send_data(Can_0,Can0_TX_001,0x001,0U,8U,sdu);
}

上诉代码即可发送can数据,然后利用USB_CAN TOOL 查看发送的数据。

7.总结

1.学习到can模块的配置,使用can的收发功能
2.K3的功能开发打下基础,基于Autosar8架构
3.加油!后续写一个can收发的上位机!!!

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值