SENT协议深度解析-----使用STM32发送SENT信号

一、SENT信号的结构

在上一期中,我们介绍了SENT信号的接收,这一期我们来讲解一下SENT信号的发送,在讲解之前,我们需要先了解一下SENT信号的结构,SENT信号分为两种类型:快速通道类型、慢速通道类型,慢速通道分为短串行数据、增强串行数据,一共三种信号结构发送方式,在汽车MCU领域中,SENT信号一般采用快速通道类型,慢速通道相比于快速通道更加的复杂,常常用于一些需要非常精确定义的数据的传输。
本篇文章将会注重讲解快速通道消息的发送。
SENT快速消息的结构

同步时间段 对比时间段 数据段(6个半字节) 校验段

二、SENT信号发送前的准备

逻辑分析仪、STM32F405开发板、keil、stm32cubemx

三、原理讲解

相比较于接收信号,SENT的发送是非常简单的,只需要控制IO口翻转就能够做到信号的传输,而发送的难点在于校验和时间控制,stm32的定时器为我们提供了us级别的定时,通过使用定时器,我们可以做到精确的定时,而校验,在SENT的官方文档中给出了一些关于CRC校验的方法,展开式为X4+X3+X2+1,也就是多项式D,初始值为0101,但是这样子计算比较繁琐,所以我推荐通过查表法来进行的。
官方文档的校验方法

四、具体操作步骤

下面我们开始具体的操作步骤,首先肯定是我们的老三样配置,因为没有这三样配置单片机根本动不起来。
1、RCC配置
RCC配置
2、SYS配置
SYS配置
3、时钟树配置
时钟树配置
经过上述的三板斧后,我们的单片机也是有了正确的时钟,下面开始配置定时器,在这里我们使用定时器5进行计时,使用PA2来作为发送的串口。
4、TIM配置
定时器5配置
定时器中断配置

其实,根据上图可以看到我们基本上不需要这么配置定时器的数据,只需要给他打开就行,Prescaler调整为定时器对应挂载的APH上面的数据即可,计算能够得到1秒的计时就行。
5、IO口配置
配置IO口
在IO口的配置中,需要将输出改为高电平,因为我的SENT是高电平闲置,这取决于你的SENT协议是高电平还是低电平。
下面我们开始代码的编写

还是老规矩,一个结构体把需要的变量全给他定义了

typedef struct
{
   
  uint8_t buff;       // 发送到第几个数据
  uint32_t data[6];   // 发送数据的数组
  uint32_t send_time; // 发送的时间
  bool send_flag;     // 发送标志位
  bool send_crc;      // 发送校验位标志位
  bool send_end;      // 发送结束标志位
  uint8_t checksum;   // 校验和
} SENT_SEND_DATA;

因为是使用定时器中断来进行数据转换的,我们可以让他在不需要发送消息的时候把定时器关闭,不开启就行。然后通过下述函数来发送数据

void sent_send(uint32_t data[6])
{
   
  if (SEND_DATA.send_flag == false)
  {
   
    for (uint8_t i = 0; i < 6; i++)
    {
   
      if (data[i] < 16)
      {
   
        SEND_DATA.data[i] = data[i];
      }
    }
    SEND_DATA.send_flag = true;
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 拉高电平
    __HAL_TIM_ENABLE(&htim5);                             // 开启定时器5
  }
}

下面我们编写中断函数

void HAL_TIM_PeriodElapsedCallback<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

珊瑚中的吃虎鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值