s32k146 flexcan 驱动
时间: 2023-07-22 16:27:24 浏览: 179
s32k146是一款汽车电子领域常用的微控制器,而FlexCAN是其内置的一个CAN总线模块。为了驱动FlexCAN模块,通常需要编写底层的驱动程序,以下是一个简单的s32k146 FlexCAN驱动程序的示例:
```c
#include "s32k146.h"
void FlexCAN_init(void)
{
// 使能FlexCAN时钟
PCC->PCCn[PCC_FlexCAN0_INDEX] |= PCC_PCCn_CGC_MASK;
// 配置引脚为CAN模式
PORTA->PCR[12] = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
PORTA->PCR[13] = PORT_PCR_MUX(2) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
// 进入初始化模式
CAN0->MCR |= CAN_MCR_MDIS_MASK;
CAN0->MCR |= CAN_MCR_FRZ_MASK;
CAN0->MCR |= CAN_MCR_HALT_MASK;
// 配置CAN时序
CAN0->CTRL1 &= ~CAN_CTRL1_PRESDIV_MASK;
CAN0->CTRL1 |= CAN_CTRL1_PRESDIV(4);
CAN0->CTRL1 |= CAN_CTRL1_PROPSEG(2);
CAN0->CTRL1 |= CAN_CTRL1_PSEG1(3);
CAN0->CTRL1 |= CAN_CTRL1_PSEG2(2);
CAN0->CTRL1 |= CAN_CTRL1_RJW(1);
// 进入正常模式
CAN0->MCR &= ~CAN_MCR_FRZ_MASK;
CAN0->MCR &= ~CAN_MCR_HALT_MASK;
}
void FlexCAN_send(uint32_t id, uint8_t *data, uint8_t len)
{
// 等待发送邮箱空闲
while (!(CAN0->IFLAG1 & CAN_IFLAG1_BUF0I_MASK)) {}
// 配置发送邮箱
CAN0->MB[0].CS |= CAN_CS_CODE(CAN_TX_MSG);
CAN0->MB[0].CS |= CAN_CS_IDE_MASK;
CAN0->MB[0].ID |= CAN_ID_STD(id);
CAN0->MB[0].DLR |= CAN_DLR_LENGTH(len);
for (int i = 0; i < len; i++)
{
CAN0->MB[0].DATA[i] = data[i];
}
// 触发发送
CAN0->MB[0].CS |= CAN_CS_TRQ_MASK;
}
```
该驱动程序的功能包括初始化CAN模块和发送CAN消息。在初始化函数中,首先使能CAN时钟并配置CAN引脚,然后进入初始化模式,配置CAN时序。最后进入正常模式。在发送函数中,等待发送邮箱空闲后,配置发送邮箱的相关参数,然后触发发送。需要注意的是,该示例程序仅供参考,实际应用时需要根据具体的需求进行修改。
阅读全文