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

STM8 LIN主节如何接收数据

[复制链接]
lujianhao891204 提问时间:2017-12-25 14:09 /
我试过,作为LIN从节点时可以判断LIN断开帧后进入中断接收数据的,现在问题是我要做一个控制器,作为LIN的主节点,向从节点发送一个break+0x55+从节点ID(带校验)后,从节点返回break+0x55+从节点ID(带校验)+一个字节的数据,我是再发送完后将主节点设置为接收模式,但是无法进入中断接收这个数据,是不是这种方式不对,还是说我这中操作太慢导致来不及接收数据呢,因为我用示波器看到的情况不是主节点数据{break+0x55+从节点ID(带校验)}然后从节点接收到数据后返回{break+0x55+从节点ID(带校验)+一个字节的数据},从示波器上看到的情况只有从节点返回的数据{break+0x55+从节点ID(带校验)+一个字节的数据},所以从这里考虑是不是我STM8里发送完数据后将模式改为接收太慢了,导致错过了断开帧呢。
备注:同样的程序,如果将LIN配置中将主节点设置为从节点即可接收到这个数据,但是也不可能发送数据时为主节点,发送完更换为从节点后接收数据吧,有经验的大神麻烦帮忙处理一下这个问题。
收藏 2 评论5 发布时间:2017-12-25 14:09

举报

5个回答
lujianhao891204 回答时间:2017-12-25 14:14:26
下面时LIN配置
void LIN_InitCon(void)
{           
  /*UART3->BRR2 = 0X07;
  UART3->BRR1 = 0X1A;*/
  UART3_LINBreakDetectionConfig(UART3_LINBREAKDETECTIONLENGTH_11BITS);//设置LIN断开符检测长度(11位的断开符检测)
  UART3_LINConfig(UART3_LIN_MODE_SLAVE, UART3_LIN_AUTOSYNC_ENABLE, UART3_LIN_DIVUP_NEXTRXNE); // 配置LIN(主模式,自动同步,LDIV在对BRR1写入以后,在下一个接收到字符时(RXNE=1)更新)
  
  //UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);   //UART3中断配置(LIN断开符检测中断,启用)
  //UART3_ClearITPendingBit(UART3_IT_RXNE);     //清除制定的中断标志(接收数据寄存器不为空中断标志)
  UART3_Cmd(ENABLE);    //启用UART3
  UART3_LINCmd(ENABLE);
}


下面是将UART3配置为发送模式
void LIN_TX_InitCon(void)
{
  UART3_DeInit();
  UART3_Init((u32)19200,
               UART3_WORDLENGTH_8D,
               UART3_STOPBITS_1,
               UART3_PARITY_NO,
               UART3_MODE_TX_ENABLE);
  UART3_ITConfig(UART3_IT_LBDF, DISABLE);
}


下面是将UART3配置为接收模式
void LIN_RX_InitCon(void)
{
  UART3_DeInit();
  UART3_Init((u32)19200,
               UART3_WORDLENGTH_8D,
               UART3_STOPBITS_1,
               UART3_PARITY_NO,
               UART3_MODE_RX_ENABLE);
  UART3_ITConfig(UART3_IT_LBDF, ENABLE);      // UART3中断配置(LIN断开符检测中断,启用)
  UART3_ClearITPendingBit(UART3_IT_LBDF);


下面是主程序里一部分
if(SW == 1)
    {   
      LIN_TX_InitCon();
      LIN_InitCon();
      LIN_Send(0x24);
      LIN_RX_InitCon();
      LIN_InitCon();
      SW = 0;


下面是UART3接收中断服务子程序
UART3_ClearITPendingBit(UART3_IT_LBDF);
    Data0 = UART3_ReceiveData8();
    while(UART3_GetFlagStatus(UART3_FLAG_TC) != SET);
这个是我这边的程序,麻烦大神帮忙看看哪里有问题
a试纸 回答时间:2018-1-19 14:42:13
可以讲解说下如何配置lin 主从吗?
谢谢!
jcx0324 回答时间:2018-3-21 10:14:10
是一个字节都收不到还是无法通过校验

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-3-21 12:17:32
本帖最后由 feixiang20 于 2018-3-21 12:19 编辑

具体也说不好,感觉主节点设置的有问题,是否节点地址设置不对

附个资料看看----STM8 LIN模式功能描述

在LIN模式下,LIN标准要求的数据格式是8位数据位加1位停止位。
完成这样的设置需要将UART_CR1的M位清0,同时把UART_CR3的STOP[1:0]位也清0。

主模式
UART初始化
步骤:
1.设置UART_BRR2和UART_BRR1来选择期望的波特率。
2.将UART_CR3的LINEN位置1来使能LIN模式。
3.将UART_CR2的TEN位和REN位置1来使能发送器和接收器。

LIN报文头(header)的发送
按照LIN协议,所有在LIN总线上的通讯都由主设备通过发送报文头(header)发起,报文头之后是响应。报文头由主任务(主节点)发送,而数据由节点(主节点或者从节点)的从任务发送。

不带错误侦测的步骤:
1.将UART_CR2的SBK位置1来请求发送断开符+分界符。
2.对UART_DR写入0x55来请求发送同步域。
3.等待UART_SR的标志位TC为1。
4.对UART_DR写入被保护识别符值来请求发送识别符域。
5.等待UART_SR的标志位TC为1。


带错误侦测的步骤:
1.将UART_CR2的SBK位置1来请求发送断开符+分界符。
2.等待UART_CR4的标志位LBDF为1。
3.对UART_DR写入0x55来请求发送同步域。
4.等待UART_SR的标志位RXNE为1,并读回UART_DR。
5.对UART_DR写入被保护识别符值来请求发送识别符域。
6.等待UART_SR的标志位RXNE为1,并读回UART_DR。
只有在UART_RX管脚上接收回有效的断开符和分界符以后,标志位LBDF才会置1。

LIN断开符和分界符侦测
当STM8的LIN模式被使能时,断开符号检测电路被激活。该检测完全独立于USART接收器。断开符只要一出现就能检测到,不管是在总线空闲时还是在发送某数据帧期间。

当接收器被激活时(USART_CR1的REN=1),电路监测RX上的起始信号。监测起始位的方法同检测断开符号或数据是一样的。当起始位被检测到后,电路对每个接下来位的第8,9,10个过采样时钟点上进行采样。如果10个(当USART_CR4的LBDL=0)或11个(当USART_CR4的LBDL=1)连续位都是'0',并且又跟着一个分界符,USART_SR的LBD标志被置1。如果LBDIEN位=1,会有中断产生。
如果在第10或11个采样点之前采样到了'1',检测电路取消当前检测并重新寻找起始位。如果LIN模式被禁止(LINEN=0),接收器继续如正常USART那样工作,不需要考虑检测断开符。

如果LIN模式被激活(LINEN=1),只要一发生帧错误(例如在发送断开帧时,停止位检测到'0'),接收器就停止,直到断开符号检测电路接收到一个'1'(这种情况发生于断开符没有完整的发出来),或一个定界符(这种情况发生于已经检测到一个完整的断开符号)。
图116说明了断开符检测器状态机的行为和断开符号标志的关系。
LBDF标志用于主模式,LHDF标志用于从模式。


响应发送(主设备是响应的发布方)
响应由符合UART规范的字节组成:8位数据位,1位停止位,无校验位。
要发送n字节的数据,应当按顺序重复n次以下步骤:

对UART_DR寄存器写入数据
等待UART_SR寄存器的标志位RXNE为1
读UART_DR寄存器,检查读回值
响应接收(主设备是响应的签署方)
要接收n字节的数据,应当按顺序重复n次以下步骤:

等待UART_SR寄存器的标志位RXNE为1
读UART_DR寄存器
(响应忽略从设备对从设备通讯)
STM8在从设备与从设备的通讯,并且主设备不需要检查响应中错误的情况下,应用程序可以直到下一帧传输前都不必检查标志位RXNE。在下一次断开符发送之前,应当清除标志位RXNE和OR。

注意:接收回一个断开符也会在设置标志位LBDF前设置标志位RXNE和FE。因此,如果使用RX中断,最好在发送断开符之前关闭中断,来避免一次额外的中断。在从设备对从设备通讯的情况下,一旦报文头被发出,就可以清0标志位RIEN。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

buridan 回答时间:2019-5-24 18:41:09
楼主,我这边想要用STM8S003K3作为总线中的从设备,但是这个芯片只支持LIN主模式。我想问下这样的话可以实现吗?因为我发现文档里面主模式也可以检测Break信号,如果不发送Break也不需要同步时钟,这样可行吗?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版