S32K的lin组件使用(不用LDF配置LIN)

  • Post author:
  • Post category:其他



本文摘要:

本文章介绍如何使用NXP官方软件S32KDS中的lin组件(不使用LDF文件配置)


开发平台:

S32 Design Studio for ARM Version 2.2


SDK版本:

S32_SDK_S32K1xx_RTM_3.0.0


使用芯片

:S32K148



组件例程免费下载方式在文末!!!

1. 配置要使用的LIN对应的UART端口


2. 添加对应组件到工程,lin和lptmr组件

3. 配置lin(使用多条lin的就添加多个lin组件)

4. 配置lptmr定时器(lptmr组件具体应用可参考往期文章)

5. 配置好参数后点击如下图按钮或选项即可将配置数据更新至代码

6. 在代码中加入LIN初始化和lptmr初始化的代码即可使用LIN

// 系统参数 不修改
#define TIMER_COMPARE_VAL 2000
#define TIMER_TICKS_1US   4U
volatile bool wakeupSignalFlag = false;
// 超时时间 0.5ms
#define TIMEOUT   (500U)
// LIN1时基计数
uint16_t lin1timerOverflowInterruptCount = 0U;
// 发送和接收缓存
uint8_t linTxBuff[8] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
uint8_t linRxBuff[8] = {0};

// LIN0回调函数
lin_callback_t lin1CallbackHandler(uint32_t instance, lin_state_t * lin1_State)
{
	lin_callback_t callbackCurrent;
	callbackCurrent = lin1_State->Callback;
	(void)instance;

	switch (lin1_State->currentEventId)
	{
		case LIN_PID_OK:
			LIN_DRV_SetTimeoutCounter(INST_LIN1, 500);
			// user handle
			// LIN_DRV_MasterSendHeader()函数会进入到这里,在这里通过ID的不同进行不同的操作
			if(lin1_State->currentId == 0x01)
			{
				// 主机写
				LIN_DRV_SendFrameData(INST_LIN1, linTxBuff, sizeof(linTxBuff));
			}
			if(lin1_State->currentId == 0x02)
			{
				// 主机读
				LIN_DRV_ReceiveFrameData(INST_LIN1, linRxBuff, sizeof(linRxBuff));
			}
			break;
		case LIN_PID_ERROR: LIN_DRV_GoToSleepMode(INST_LIN1); break;
		case LIN_TX_COMPLETED:
		case LIN_RX_COMPLETED: LIN_DRV_GotoIdleState(INST_LIN1); break;
		case LIN_CHECKSUM_ERROR:
		case LIN_READBACK_ERROR:
		case LIN_FRAME_ERROR:
		case LIN_RECV_BREAK_FIELD_OK: LIN_DRV_SetTimeoutCounter(INST_LIN1, TIMEOUT); break;
		case LIN_WAKEUP_SIGNAL: wakeupSignalFlag = true;  break;
		case LIN_SYNC_ERROR:
		case LIN_BAUDRATE_ADJUSTED:
		case LIN_NO_EVENT:
		case LIN_SYNC_OK:
		default: break;
	}
	return callbackCurrent;
}
// LIN0初始化
void lin1_Init(void)
{
	LIN_DRV_Init(INST_LIN1, &lin1_InitConfig0, &lin1_State);
	LIN_DRV_InstallCallback(INST_LIN1, (lin_callback_t)lin1CallbackHandler);
}
// 定时器初始化
void LPTMR0_Init(void)
{
	LPTMR_DRV_Init(INST_LPTMR1, &lpTmr1_config0, false);
	INT_SYS_InstallHandler(LPTMR0_IRQn, &LPTMR_ISR, (isr_t *)NULL);
	INT_SYS_EnableIRQ(LPTMR0_IRQn);
	LPTMR_DRV_StartCounter(INST_LPTMR1);
}
// 将此函数加入到0.5ms定时器中断 为了给LIN0提供时基
void lin1_addTIM(void)
{
	LIN_DRV_TimeoutService(INST_LIN1);
	timerOverflowInterruptCount++;
}
// 0.5ms定时器中断
void LPTMR_ISR(void)
{
	lin1_addTIM();
    LPTMR_DRV_ClearCompareFlag(INST_LPTMR1);
}
// LIN0时基回调函数,该函数名在lin配置页面有定义
uint32_t lin1TimerGetTimeIntervalCallback0(uint32_t *ns)
{
	static uint32_t previousCountValue = 0UL;
	uint32_t counterValue;
	counterValue = LPTMR_DRV_GetCounterValueByCount(INST_LPTMR1);
	*ns = ((uint32_t)(counterValue + lin1timerOverflowInterruptCount * TIMER_COMPARE_VAL - previousCountValue)) * 1000 / TIMER_TICKS_1US;
	lin1timerOverflowInterruptCount = 0UL;
	previousCountValue = counterValue;
	return 0UL;
}


7. 使用以下函数发送帧头

// 使用该函数即可发送帧头,帧头在回调函数中会有写操作或读操作,参见上一步
LIN_DRV_MasterSendHeader(INST_LIN1, 0x01);



组件例程下载地址:


https://download.csdn.net/download/m0_50669075/85039291

S32K148更多例程和源码以及最新内容下载地址:


nxp_s32k148_template: 使用NXP的S32KDS软件基于S32_SDK_S32K1xx_RTM_3.0.0编写的的S32K148各组件测试例程,亲测可用,带有注释,适用于S32K14X系列的芯片。 (gitee.com)


END



版权声明:本文为m0_50669075原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。