程序配置
01、初始化MM32F013x UART1串口
从官网下载MM32F013x例程,参考MM32F0133C7P的UART例程的初始化以及中断服务函数,这里不在赘述。
02、LIN的发送
2.1 同步间隔段的发送
UART内部有Break信号的发送,通过使能LIN,即可实现LIN的间隔段,代码如下:
bool LINSendbreak(void)
{
uint16_t Tempcnt = 0;
UART2-》CCR |= UART_CCR_LIN; //LIN Enable
UART2-》CCR |= UART_CCR_BRK; //Send Break
while ((UART2-》ISR & 0x00000080) == 0) //TXBRK_INTF
{
Tempcnt++;
if (Tempcnt 》 5000)
return (false);
}
return (true);
}
2.2 数据的发送
数据的发送沿用原有的UART接口数据发送即可:
bool LINSendChar(uint8_t ch)
{
uint16_t Tempcnt = 0;
while ((UART2-》CSR & UART_IT_TXIEN) == 0)//The loop is sent until it is finished
{
Tempcnt++;
if (Tempcnt 》 5000)
return (false);
}
UART2-》TDR = (ch & (uint16_t)0x00FF);
return (true);
}
2.3 数据包的发送
有了上面2个基础函数进行发送,现在来看下数据包的具体发送,从下图中可以看出数据包是根据保护段的定义来进行区分是发送信号帧还是诊断帧。
信号帧的数据就可以做成以下的方式:
bool LINSendMsg(void)
{
uint8_t check_sum, i;
frame_send.error = 0;
if (!LINSendbreak()) //Send Break
return (false);
if (!LINSendChar(0x55)) //Send Sync Byte
return (false);
msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
for (i = 0; i 《 9; i++)
{
if (!LINSendChar(msg_send.Data[i])) //Send Data
return (false);
}
check_sum = LINCalcChecksum(msg_send.Data, 1);
if (!LINSendChar(check_sum)) //Send Checksum
return (false);
frame_send.state = IDLE;
return (true);
}
而诊断帧的就是:
bool LINSendID(void)
{
if (!LINSendbreak())
return (false);
if (!LINSendChar(0x55))
return (false);
msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
if (!LINSendChar(msg_send.Data[i]))
return (false);
return (true);
}
这样就可以在等待UART中断函数里收到从机返回的数据。
2.4 从机的接受与发送
从机收数据与正常的串口一样,只需要做BRK信号的处理即可,从机收到数据以后按正常的返回数据,返回数据就不需要发送BRK信号。
if (LIN_RxBuff[1] == LIN_PID_60_0x3C)
{
msg_send1.Data[0] = 0x3C;
msg_send1.Data[0] = LINCalcParity(msg_send1.Data[0]);
UART2-》ICR |= UART_ICR_RXIDLE; //clear idle int bit
UART2-》IER |= UART_IER_RXIDLE; //enable uart rx idle int
for (i = 1; i 《 9; i++)
{
if (!LINSendChar(msg_send1.Data[i]))
return (false);
}
check_sum = LINCalcChecksum(msg_send1.Data, 1);
if (!LINSendChar(check_sum))
return (false);
}
程序配置
01、初始化MM32F013x UART1串口
从官网下载MM32F013x例程,参考MM32F0133C7P的UART例程的初始化以及中断服务函数,这里不在赘述。
02、LIN的发送
2.1 同步间隔段的发送
UART内部有Break信号的发送,通过使能LIN,即可实现LIN的间隔段,代码如下:
bool LINSendbreak(void)
{
uint16_t Tempcnt = 0;
UART2-》CCR |= UART_CCR_LIN; //LIN Enable
UART2-》CCR |= UART_CCR_BRK; //Send Break
while ((UART2-》ISR & 0x00000080) == 0) //TXBRK_INTF
{
Tempcnt++;
if (Tempcnt 》 5000)
return (false);
}
return (true);
}
2.2 数据的发送
数据的发送沿用原有的UART接口数据发送即可:
bool LINSendChar(uint8_t ch)
{
uint16_t Tempcnt = 0;
while ((UART2-》CSR & UART_IT_TXIEN) == 0)//The loop is sent until it is finished
{
Tempcnt++;
if (Tempcnt 》 5000)
return (false);
}
UART2-》TDR = (ch & (uint16_t)0x00FF);
return (true);
}
2.3 数据包的发送
有了上面2个基础函数进行发送,现在来看下数据包的具体发送,从下图中可以看出数据包是根据保护段的定义来进行区分是发送信号帧还是诊断帧。
信号帧的数据就可以做成以下的方式:
bool LINSendMsg(void)
{
uint8_t check_sum, i;
frame_send.error = 0;
if (!LINSendbreak()) //Send Break
return (false);
if (!LINSendChar(0x55)) //Send Sync Byte
return (false);
msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
for (i = 0; i 《 9; i++)
{
if (!LINSendChar(msg_send.Data[i])) //Send Data
return (false);
}
check_sum = LINCalcChecksum(msg_send.Data, 1);
if (!LINSendChar(check_sum)) //Send Checksum
return (false);
frame_send.state = IDLE;
return (true);
}
而诊断帧的就是:
bool LINSendID(void)
{
if (!LINSendbreak())
return (false);
if (!LINSendChar(0x55))
return (false);
msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
if (!LINSendChar(msg_send.Data[i]))
return (false);
return (true);
}
这样就可以在等待UART中断函数里收到从机返回的数据。
2.4 从机的接受与发送
从机收数据与正常的串口一样,只需要做BRK信号的处理即可,从机收到数据以后按正常的返回数据,返回数据就不需要发送BRK信号。
if (LIN_RxBuff[1] == LIN_PID_60_0x3C)
{
msg_send1.Data[0] = 0x3C;
msg_send1.Data[0] = LINCalcParity(msg_send1.Data[0]);
UART2-》ICR |= UART_ICR_RXIDLE; //clear idle int bit
UART2-》IER |= UART_IER_RXIDLE; //enable uart rx idle int
for (i = 1; i 《 9; i++)
{
if (!LINSendChar(msg_send1.Data[i]))
return (false);
}
check_sum = LINCalcChecksum(msg_send1.Data, 1);
if (!LINSendChar(check_sum))
return (false);
}
举报