你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F107VCT6 LIN通信

[复制链接]
1838039453@qq.c 提问时间:2017-7-11 10:38 /
STM32F107VCT6   TJA1021接到串口4
实现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. }
复制代码


<
收藏 1 评论10 发布时间:2017-7-11 10:38

举报

10个回答
MrJiu 回答时间:2017-7-11 13:54:03
没搞过LIN,只能帮顶啦!!!!
斜阳__ 回答时间:2017-10-23 09:29:34
没调通,描述详细点。有逻辑分析仪的话吧分析数据也贴上来。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

ropepeng 回答时间:2017-10-23 11:04:17
单独串口能用么?

评分

参与人数 1ST金币 +1 收起 理由
zero99 + 1

查看全部评分

无薪税绵 回答时间:2017-10-23 13:52:48
请下载以下网址的:STM32中文参考手册.pdf
http://www.openedv.com/thread-7111-1-1.html

再打开手册,跳到第528页,LIN( 局域互联网) 模式
请按手册的步骤操作。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wenshijian 回答时间:2018-4-15 15:49:34
F1的不知道怎么搞,不过我用过F0的做LIN产品,F030+TJA1020.
校验函数有两种,LIN V1.3是经典校验,就是校验的时候不要算PID;V2.0以上采用的增强校验,要把PID算进去。对于诊断用的PID(63,64)都采用经典校验,就是不计算PID,这是为了向下兼容。你的校验函数太简单了。
串口4好像不支持LIN,你要看库文件里面的描述,串口4是普通UART,不是增强型的USART。而且你的代码中要打开串口的RXNE中断,这是每个字节接收的中断,LBD只是识别BREAK的中断,相当于帧间隔,数据内容还是要用RXNE。有些人也用IDLE中断代替LBD中断。
我的代码是F0XX+TJA1020的,估计不适用F1XX。F0XX对LIN的支持度比较好点。

1838039453@qq.c 回答时间:2019-9-25 12:32:43
软件没问题,是硬件的问题,结贴。
bucunzai 回答时间:2020-5-21 16:48:42
wenshijian 发表于 2018-4-15 15:49
F1的不知道怎么搞,不过我用过F0的做LIN产品,F030+TJA1020.
校验函数有两种,LIN V1.3是经典校验,就是校 ...

hi,请问一下,你的F030+TJA1020 方案是否可行呢?也是使用的 UART 连接TJA1020,是吧?可以分享我一下吗?谢谢。
笑对人生-2015164 回答时间:2020-7-11 21:51:43
所有STM32发送LIN帧都存在问题,对比发出帧的时序和LIN规范就明白
我卖的LIN转USB设备用了特殊的方法才实现了标准的LIN发送时序,在车上用了接近200套
笑对人生-2015164 回答时间:2020-7-11 21:52:23
STM32发送LIN时序都存在问题,不过我解决了
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版