野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10291|回复: 2

STM32F107 LIN通信

[复制链接]
发表于 2017-7-11 10:10:56 | 显示全部楼层 |阅读模式
STM32F107VCT6   TJA1021接到串口4
实现LIN的主模式
目前LIN依然跑不通,希望有经验的可以给一些指导。
  1. static void lin_gpio_init(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;

  4.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

  5.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10
  6.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  7.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.   GPIO_InitGPIOC&GPIO_InitStructure);

  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11
  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  12.   GPIO_InitGPIOC&GPIO_InitStructure);

  13.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  16.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  17.   GPIO_SetBits(GPIOD,GPIO_Pin_2);  
  18. }

  19. static void lin_nvic_init(void)
  20. {
  21.   NVIC_InitTypeDef NVIC_InitStructure;

  22.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  23.   NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQ;
  24.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  25.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  26.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  27.   NVIC_Init(&NVIC_InitStructure);
  28. }

  29. static void lin_uart_init(void)
  30. {
  31.   USART_InitTypeDef USART_InitStructure;

  32. RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
  33.   USART_InitStructure.USART_BaudRate = 19200;
  34.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  35.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  36.   USART_InitStructure.USART_Parity = USART_Parity_No ;
  37.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  38.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  39.   USART_Init(macUSARTx, &USART_InitStructure);

  40.   USART_LINBreakDetectLengthConfig(macUSARTx, USART_LINBreakDetectLength_11b);

  41.   USART_LINCmd(UART4,ENABLE);
  42.   USART_ITConfig(UART4, USART_IT_LBD, ENABLE);
  43.   //USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
  44.   USART_Cmd(UART4, ENABLE);
  45. }

  46. void LINInit(void)
  47. {
  48.   lin_gpio_init();
  49.   lin_nvic_init();
  50.   lin_uart_init();
  51. }

  52. void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
  53. {
  54.   /* 发送一个字节数据到USART1 */
  55.   USART_SendData(pUSARTx, ch);

  56.   /* 等待发送完毕 */
  57.   while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
  58. }

  59. static unsigned char LINCalcParity(unsigned char id)
  60. {
  61.   unsigned char parity, p0, p1;
  62.   parity = id;
  63.   p0 = (BIT(parity, 0)^BIT(parity, 1)^BIT(parity, 2)^BIT(parity, 4)) << 6; //偶校验位
  64.   p1 = (!(BIT(parity, 1)^BIT(parity, 3)^BIT(parity, 4)^BIT(parity, 5))) << 7; //奇校验位
  65.   parity |= (p0 | p1);
  66.   return parity;
  67. }

  68. /*************************************************************/
  69. /*                       计算和校验位                        */
  70. /*************************************************************/
  71. static unsigned char LINCalcChecksum(unsigned char *data)
  72. {
  73.   unsigned int sum = 0;
  74.   unsigned char i;

  75.   for(i = 0; i < 8; i++)
  76.   {
  77.     sum += data[i];
  78.     if(sum & 0xFF00)
  79.     {
  80.       sum = (sum & 0x00FF) + 1;
  81.     }
  82.   }
  83.   sum ^= 0x00FF;
  84.   return (unsigned char)sum;
  85. }

  86. #if 0
  87.   msg_send.identifier = 0x30;
  88.   msg_send.data[0] = 'F';
  89.   msg_send.data[1] = 'R';
  90.   msg_send.data[2] = 'E';
  91.   msg_send.data[3] = 'E';
  92.   msg_send.data[4] = 'F';
  93.   msg_send.data[5] = 'L';
  94.   msg_send.data[6] = 'Y';
  95.   msg_send.data[7] = '!';
  96. #endif
  97. void LINSendTest(void)
  98. {
  99.   unsigned char check_sum, parity_id, i;

  100.   USART_SendBreak(UART4);
  101.   Usart_SendByte(UART4, 0x55);
  102.   
  103.   parity_id = LINCalcParity(msg_send.identifier);

  104.   LINSendChar(parity_id);

  105.   for(i = 0; i < 8; i++)
  106.   {
  107.     if(!LINSendChar(msg_send.data[i]))
  108.     {
  109.       return(FALSE);
  110.     }
  111.   }

  112.   check_sum = LINCalcChecksum(msg_send.data);
  113.   // 发送校验和场
  114.   LINSendChar(check_sum);

  115. }
复制代码


回复

使用道具 举报

发表于 2017-7-11 11:32:46 | 显示全部楼层
串口发送完成后加点延时,以等待tja芯片转发完成
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-11 11:39:10 | 显示全部楼层
随风 发表于 2017-7-11 11:32
串口发送完成后加点延时,以等待tja芯片转发完成

一样的结果,串口调试助手没有显示任何东西。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-7 04:54 , Processed in 0.026774 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表