一、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配置
2、SYS配置
3、时钟树配置
经过上述的三板斧后,我们的单片机也是有了正确的时钟,下面开始配置定时器,在这里我们使用定时器5进行计时,使用PA2来作为发送的串口。
4、TIM配置
其实,根据上图可以看到我们基本上不需要这么配置定时器的数据,只需要给他打开就行,Prescaler调整为定时器对应挂载的APH上面的数据即可,计算能够得到1秒的计时就行。
5、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<