<div class="blockcode"><blockquote>void LIN_Init(uint32_t baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIOx = PTB; //PORT端口选择
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //选择输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //PTC 0~3
GPIO_InitStructure.GPIO_InitState = Bit_SET; //低电平
GPIO_Init(&GPIO_InitStructure); //初始化
//UART
UART_InitTypeDef UART_InitStruct;
UART_InitStruct.UART_BaudRate = baud; //波特率
UART_InitStruct.UART_WordLength = UART_WordLength_8b ; //数据长度
UART_InitStruct.UART_StopBits = UART_StopBits_1; //停止位
UART_InitStruct.UART_Parity = UART_Parity_No; //奇偶校验
UART_InitStruct.UART_Mode = UART_Mode_Rx|UART_Mode_Tx; //RX TX使能
UART_InitStruct.UART_PIN = RX_PB0_TX_PB1 ; //RX_PD6_TX_PD7
UART_Init(UART0,&UART_InitStruct); //初始化UART
UART0->S2 |= UART_S2_BRK13_MASK ;
//UART_ITConfig(UART2,UART_IT_RXNE, ENABLE); //中断使能
//NVIC_Init(UART2_IRQn,2); //中断使能 分组2
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] 发送同步间隔段
* @param
* @retval
*/
void LIN_SendBreak(UART_Type* UARTx)
{
while(!(UARTx->S1 & UART_S1_TDRE_MASK)); //等待发送数据寄存器(缓冲器)为空
UARTx->C2 |= UART_C2_SBK_MASK ; //队列待发送的中止字符
UARTx->C2 &= ~UART_C2_SBK_MASK; //返回正常发送操作
}
/**
* @brief LIN奇偶校验计算
* @param
* @retval
*/
uint8_t LIN_CalcParity(uint8_t id)
{
uint8_t parity, p0,p1;
parity=id;
p0=(BIT(parity,0)^BIT(parity,1)^BIT(parity,2)^BIT(parity,4))<<6; //偶校验位
p1=(!(BIT(parity,1)^BIT(parity,3)^BIT(parity,4)^BIT(parity,5)))<<7; //奇校验位
parity|=(p0|p1);
return parity;
}
/**
* @brief LIN校验和计算
* @param
* @retval
*/
uint8_t LIN_Checksum(uint8_t id,uint8_t *data,uint8_t length)
{
uint8_t i;
uint32_t check_sum = 0;
if(id != 0x3c && id != 0x7d) //使用增强型校验
{
check_sum = id ;
}
else //使用标准校验
{
check_sum = 0 ;
}
for (i = 0; i < length; i++)
{
check_sum += *(data++);
if (check_sum > 0xFF) //进位
{
check_sum -= 0xFF;
}
}
return (~check_sum); //取反
}
/**
* @brief LIN发送函数
* @param
* @retval
*/
uint8_t LIN_Send_Msg(UART_Type* UARTx,LIN_Msg *SendMsg)
{
uint8_t pid ,i ,check_sum;
if(SendMsg->ID == 0xff||SendMsg->ID == 0x00)
return (FALSE);
//发送间隔同步段
LIN_SendBreak(UARTx);
//发送同步场
UART_SendData(UARTx,0x55);
//计算PID
pid = LIN_CalcParity(SendMsg->ID);
//发送PID
UART_SendData(UARTx,pid);
//发送数据场
for(i=0; i <SendMsg->length ; i++)
{
// 发送数据场
UART_SendData(UARTx,SendMsg->Data[i]);
}
//计算校验和
check_sum = LIN_Checksum(pid,SendMsg->Data,SendMsg->length);
UART_SendData(UARTx,check_sum);
return(TRUE);
}
|