在线时间352 小时
UID2053419
注册时间2014-11-27
NXP金币0
TA的每日心情 | 衰 2016-10-20 09:45 |
---|
签到天数: 1 天 [LV.1]初来乍到
版主
- 积分
- 2223
- 最后登录
- 2023-11-20
|
本帖最后由 花溪村长 于 2015-12-25 08:49 编辑
LIN的基础知识就不介绍了!前面已发过帖子!需要的可以去看看
[S12G系列]LIN通讯协议及LIN发送程序实现
今天这个主要在KEA128上实现LIN通讯
先上电路图:
然后使用UART进行LIN通讯,同样需要设置UART_S2的BRK13位为1设置13位断点字符长度,然后设置UART_C2的SBK进行发送断点已进行同步间隔段的发送!
这次测试直接使用CANoe进行测试!
使用LIN板子供电需要12V(直接用小鱼夹夹上掉下来12V把OpenSDA给烧了!板子没法下载程序了!!!真尼玛郁闷!)
然后打开CANoe进行监控LIN报文:
500ms发送一次!
最后直接上程序进行分析:
- <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
-
- }
- /**
- * @brief 发送同步间隔段
- * @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);
- }
复制代码
附上工程:
TRK-KEA128 - LIN.rar
(834.6 KB, 下载次数: 607)
|
评分
-
查看全部评分
|