S32K144-11.can

CAN有接收邮箱和发送邮箱

”发送邮箱“是用于CAN总线数据发送的,总共有3个,并且存在优先级关系。优先级越高表示其里面的数据会被优先发送。数据在发送前都会被送到优先级最高且空闲的发送邮箱,然后依次发送。最后说明一点:发送邮箱有3个,且每个邮箱只能装一个报文

”接收邮箱“是用于CAN总线数据接收用的,在接收数据端会有一个过滤器处于”接收邮箱“的前面,过滤器使用于删选”标识符“的,只有标识符符合的报文才会被放入到”接收邮箱“当中。注意:”接收邮箱不同于发送邮箱,接收邮箱只有2(FIFO0FIFO1)个,但是每一个有三层,每层都可以存放一个报文,即每一个接收邮箱可以接收三个报文。但读取时只能读到最先收到的报文,等这个读完之后,才能读下一个报文”。

1.can 的pin设置

2.can初始化;

#define tx_mailbox 1 邮箱

#define rx_mailbox 0

#define rx_filter 0 筛选器不过滤

void can_init(void){

CAN_Init(&can_pal1_instance, &can_pal1_Config0);

// 接收结构体配置

can_buff_config_t can_buffrx_config={

.enableBRS =0,

.enableFD=0,

.fdPadding=0,

.idType = CAN_MSG_ID_STD,

.isRemote = 0,

};

//发送结构体配置

can_buff_config_t can_bufftx_config={

.enableBRS =0,

.enableFD=0,

.fdPadding=0,

.idType = CAN_MSG_ID_STD,

.isRemote = 0,

};

CAN_ConfigTxBuff(&can_pal1_instance,tx_mailbox,&can_bufftx_config);

CAN_ConfigRxBuff(&can_pal1_instance,rx_mailbox,&can_buffrx_config,rx_filter);

//设置筛选器接收ID的全局掩码设置

CAN_SetRxFilter(&can_pal1_instance,CAN_MSG_ID_STD,rx_mailbox,rx_filter);

//安装中断回调函数

CAN_InstallEventCallback(&can_pal1_instance,&can_callback,NULL);

}

//配置接收函数

void can_callback(uint32_t instance,can_event_t eventType,uint32_t buffIdx, void *flexcanState)

{

switch(eventType){

case CAN_EVENT_RX_COMPLETE:

break;

case CAN_EVENT_TX_COMPLETE:

break;

default:

break;

}

}

//发送函数

void can_send(uint32_t data,uint32_t id,uint8_t len){

can_message_t can_msg;

can_msg.cs = 0;

can_msg.data[0] =data;

can_msg.id= id;

can_msg.length=len; //字节

CAN_Send(&can_pal1_instance,tx_mailbox,&can_msg);

}

//接收函数

CAN_Receive(&can_pal1_instance,rx_mailbox,&can_msg);

以下是S32K144-EVB开发板CAN的示例代码,包括初始化和发送数据的函数: ```c #include "S32K144.h" void CAN_Init(void) { // 开启CAN时钟 PCC->PCCn[PCC_FlexCAN0_INDEX] |= PCC_PCCn_CGC_MASK; // 复位CAN模块 FLEXCAN0->MCR |= FLEXCAN_MCR_SOFT_RST_MASK; while (FLEXCAN0->MCR & FLEXCAN_MCR_SOFT_RST_MASK); // 设置CAN为32位宽度 FLEXCAN0->MCR |= FLEXCAN_MCR_MAXMB(0x1F); // 最大邮箱号 FLEXCAN0->MCR |= FLEXCAN_MCR_FRZ_MASK; // 进入冻结模式 FLEXCAN0->MCR |= FLEXCAN_MCR_HALT_MASK; // 进入停止模式 FLEXCAN0->CTRL1 |= FLEXCAN_CTRL1_CLKSRC_MASK; // 选择系统时钟作为CAN时钟 FLEXCAN0->CTRL1 |= FLEXCAN_CTRL1_PRESDIV(0); // 分频系数为1 FLEXCAN0->MCR &= ~FLEXCAN_MCR_FRZ_MASK; // 退出冻结模式 FLEXCAN0->MCR &= ~FLEXCAN_MCR_HALT_MASK; // 退出停止模式 // 配置邮箱 FLEXCAN0->MB[0].CS |= FLEXCAN_MB_CS_IDE_MASK; // 使用扩展帧 FLEXCAN0->MB[0].CS |= FLEXCAN_MB_CS_SRR_MASK; // 启用自发自收 FLEXCAN0->MB[0].CS |= FLEXCAN_MB_CS_RTR_MASK; // 启用数据请求 FLEXCAN0->MB[0].ID |= FLEXCAN_MB_ID_EXT_MASK; // 使用扩展标识符 FLEXCAN0->MB[0].ID |= FLEXCAN_MB_ID_IDSTD(0x123); // 标准标识符 FLEXCAN0->MB[0].ID |= FLEXCAN_MB_ID_IDEXT(0x456); // 扩展标识符 FLEXCAN0->MB[0].WORD0 |= 0x11223344; // 数据字0 FLEXCAN0->MB[0].WORD1 |= 0x55667788; // 数据字1 // 开启邮箱接收中断 FLEXCAN0->IMASK |= (1 << 0); NVIC_EnableIRQ(CAN0_ORed_Message_buffer_IRQn); } void CAN_Send(uint8_t *data, uint8_t len) { uint32_t i; // 等待邮箱空闲 while (FLEXCAN0->IFLAG1 & (1 << 0)); // 发送数据 FLEXCAN0->MB[0].CS &= ~(FLEXCAN_MB_CS_DLC_MASK); FLEXCAN0->MB[0].CS |= FLEXCAN_MB_CS_DLC(len); for (i = 0; i < len; i++) { FLEXCAN0->MB[0].DATA_BYTE(i) = data[i]; } FLEXCAN0->MB[0].CS &= ~(FLEXCAN_MB_CS_CODE_MASK); FLEXCAN0->MB[0].CS |= FLEXCAN_MB_CS_CODE(0xC); // 发送数据帧 } ``` 在上述代码中,`CAN_Init`函数用于初始化CAN模块,包括开启时钟、复位、设置时钟、配置邮箱等操作。`CAN_Send`函数用于发送数据,首先等待邮箱空闲,然后设置数据、数据长度和发送帧类型,最后发送数据。需要注意的是,此处的邮箱号为0,如果需要使用其他邮箱,需要相应地修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YELL.DOLL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值