打印
[8/16-bit MCU]

[TRK-KEA128]LIN通讯实验

[复制链接]
1057|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ideafor|  楼主 | 2016-1-14 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
<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);
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

149

帖子

1

粉丝