S32K3学习笔记---S32K3之LIN模块

S32K3学习笔记—S32K3之LIN模块

1.前言

​ LIN相对于CAN来说成本低、传输速率低,且LIN控制器相对简单。对于一些局部传输,用CAN比较浪费,并且很多传感器也是支持LIN通信的,所以就会选择用LIN。本文是记录在两个核分别注册一路lin,采用中断的形式,并基于MCAL代码进行调试,暂时不涉及协议栈内容。

2.原理

​ LIN规范里面有详细介绍,此处简单了解一下帧格式。 一个完整的LIN 总线报文帧“Message Frame”包含 报头“Header”和响应“Response”,主机任务负责发送帧头;从机任务接收帧头并对帧头所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。 帧头包括同步间隔段同步段以及PID(受保护ID)段,应答包括数据段校验和段。

image-20231224214926490

LIN Block diagram
image-20231224105513870

image-20231224105533410

LIN的时钟
image-20231224092328678

注意:通道0和8是80M,其他的都是40M

LIN的波特率
image-20231224105057653

特征
image-20231224110338117
image-20231224110356036

​ 其他更细节的参考芯片手册和LIN规范文档。

3.EB配置

​ LIN依赖模块:Mcu、Port、Platform、Lin

​ Mcu主要是配置LIN的时钟和使能外设,具体配置如下,关于Mcu的详细配置,请参考S32K3学习笔记—S32K3之MCU模块

image-20231224093840069

image-20231224094025592

注意:此处勿忘使能

​ Port模块

image-20231224103241003

​ 1.选择PIN的模式 LPUART5_LPUART5_TX_OUT,其他的配置项请参考S32K3学习笔记—S32K3之Gpt、Dio、Platform

image-20231224103401495

​ 1.选择PIN的模式 LPUART5_LPUART5_RX_IN

​ 至此,LIN收发器的TX、RX就配置完成,将这一组LIN的通道映射到对应的核就行。

​ platform模块
image-20231224102428736

​ 1.使能对应的中断并注册对应的回调,platform具体配置可参考S32K3学习笔记—S32K3之Gpt、Dio、Platform

​ Lin模块
image-20231224101250019

​ 1.是否支持多核

​ 2.超时方式:如果选择了SystemTimer或CustomTimer,请确保在OsIf中启用了相应的计时器

​ 3.如果LinTimeoutMethod是OSIF_COUNTER_SYSTEM或OSIF_COUTER_CUSTOM,则LinTimeoutDuration以微秒为单 位。如果LinTimeoutMethod是OSIF_COUNTER_DUMMY,则LinTimeoutDuration是等待循环的次数。

​ 4.主帧将接受比TFrame_Maximum长的帧

image-20231224101929421

​ 1.LIN模式选择,主模式或者从模式

​ 2.波特率设置,最大20K

​ 3.LIN的硬件通道绑定

​ 4.时钟参考

​ 5.Lin通道映射到到核0分区

类似的,将另外一路Lin注册到核1

image-20231224103003490

​ 1.此处用到通道8,所以是在需要选择80M

​ 2.Lin通道映射到到核1分区

至此,Lin配置完成,Lin的配置相对比较简单,

4.代码调试

​ 测试代码是NXP官方demo,可以看一下中断是否能进,数据是否有发出。

#include "Mcu.h"
#include "Lin_43_LPUART_FLEXIO.h"
#include "Port.h"
#include "Platform.h"
#include "OsIf.h"
#include "Mcl.h"
/*==================================================================================================
*                                       LOCAL MACROS
==================================================================================================*/
#define LIN_MASTER_RESPONSE LIN_FRAMERESPONSE_TX
#define T_LIN_TEST_NUM_CHANNELS ((uint8)2U)
#define T_LIN_TEST_FRM_NUM      ((uint8)1U)
#define T_LIN_TIME_OUT 400000

/*==================================================================================================
*                                      LOCAL CONSTANTS
==================================================================================================*/
uint8 T_Lin_Data[3] = {0x01, 0x02, 0x03};
const Lin_PduType T_Lin_Frame[T_LIN_TEST_FRM_NUM] =
{
    {0x1A, LIN_ENHANCED_CS, LIN_MASTER_RESPONSE, 3u, T_Lin_Data}
};
int main(void) 
{
    static uint8 linSdu[8] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
    volatile Lin_StatusType T_LinStatus;
    volatile uint32 TimeOut;
    uint8 Index_frame = 0;
    Lin_PduType linFrame;
    const uint8* linSduPtr = linSdu;
    volatile uint8 T_result = 0;
    uint8 Channel_Index = 0;
    volatile Std_ReturnType wakeUpEvent;

    /* Setup Clocks */
    /* Initialize Mcu module */
    Mcu_Init(NULL_PTR);

    /* Initialize Mcu clock */
    Mcu_InitClock(McuClockSettingConfig_0);

    while (Mcu_GetPllStatus() != MCU_PLL_LOCKED){};

    /* Use PLL clock */
    Mcu_DistributePllClock();

    Mcu_SetMode(McuModeSettingConf_0);
#if (LIN_43_LPUART_FLEXIO_FLEXIO_USED == STD_ON)
    Mcl_Init(NULL_PTR);
#endif
    /* Initialize all pins */
    Port_Init(NULL_PTR);
    /* Initialize Mcu module to enable interrupts and install handler */
    Platform_Init(NULL_PTR);

    /* Init osif */
    OsIf_Init(NULL_PTR);

    /* Initialize LIN module */
    Lin_43_LPUART_FLEXIO_Init(NULL_PTR);

    for (Channel_Index = 0; Channel_Index < T_LIN_TEST_NUM_CHANNELS; Channel_Index++)
    {
        /* Wakeup LIN channels for ASR 4.3.1 */
        Lin_43_LPUART_FLEXIO_WakeupInternal(Channel_Index);
        /* Check Lin channel wakeup */
        wakeUpEvent = Lin_43_LPUART_FLEXIO_CheckWakeup(Channel_Index);
        
        /* Get frame data */
        linFrame = T_Lin_Frame[Index_frame];

        /* Send LIN frame */
        Lin_43_LPUART_FLEXIO_SendFrame(Channel_Index, &linFrame);

        /* Wait for the transmission done */
        TimeOut = 4*T_LIN_TIME_OUT;
        do
        {
            T_LinStatus = Lin_43_LPUART_FLEXIO_GetStatus(Channel_Index, &linSduPtr);
        } while (LIN_TX_OK != T_LinStatus && 0 != TimeOut--);

        /* Verify that the LIN frame is sent successfully */
        if (LIN_TX_OK == T_LinStatus)
        {
            T_result = T_result + 1;
        }
    }

    return (0U);
}

5.展望

​ 关于FLEXIO_IP目前没用到,后续研究一下再补上。

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S32K3x4EVB-Q257是一款基于ARM Cortex-M内核的汽车电子控制系统的评估板。以下是入门指南: 1. 硬件准备:首先,确保你有一块S32K3x4EVB-Q257评估板、一台电脑和必要的USB连接线。 2. 软件安装:在电脑上安装相关的开发工具和软件。这可能包括S32 Design Studio集成开发环境(IDE)、S32 SDK软件开发套件、S32K Power Software Examples等。 3. 连接电源:将评估板插入电脑上的USB接口,并连接电源线到评估板上。 4. 下载示例代码:在S32 Design Studio中创建一个新项目,并下载示例代码到评估板上。这些示例代码将帮助你了解基本的功能和操作。 5. 硬件连线:根据需要,使用连接线将评估板与其他外部设备(例如传感器、显示屏等)连接起来。评估板上的引脚和接口可以通过手册查阅获得。 6. 运行代码:编译和下载代码到评估板上,并运行它。通过调试器或串口等方式,观察代码的执行情况和输出结果。 7. 进一步学习:通过阅读相关文档、手册和参考资料,了解评估板的更多功能和特性。你可以尝试修改示例代码或编写自己的代码,以实现特定的功能。 注意事项:在使用评估板时,务必遵循相关的安全操作规程,不要超过硬件的额定电压和电流,并保持设备的正确连接和操作。 以上是关于S32K3x4EVB-Q257入门的简要指南。希望这些信息对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值