我试过,作为LIN从节点时可以判断LIN断开帧后进入中断接收数据的,现在问题是我要做一个控制器,作为LIN的主节点,向从节点发送一个break+0x55+从节点ID(带校验)后,从节点返回break+0x55+从节点ID(带校验)+一个字节的数据,我是再发送完后将主节点设置为接收模式,但是无法进入中断接收这个数据,是不是这种方式不对,还是说我这中操作太慢导致来不及接收数据呢,因为我用示波器看到的情况不是主节点数据{break+0x55+从节点ID(带校验)}然后从节点接收到数据后返回{break+0x55+从节点ID(带校验)+一个字节的数据},从示波器上看到的情况只有从节点返回的数据{break+0x55+从节点ID(带校验)+一个字节的数据},所以从这里考虑是不是我STM8里发送完数据后将模式改为接收太慢了,导致错过了断开帧呢。 备注:同样的程序,如果将LIN配置中将主节点设置为从节点即可接收到这个数据,但是也不可能发送数据时为主节点,发送完更换为从节点后接收数据吧,有经验的大神麻烦帮忙处理一下这个问题。 |
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
如何使用ST官网例程_LIN总线通讯_STM8AF
STM8 LIN
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
想问一下各位大佬,IAR下载调试代码时出现 warning: is an illegal data sample expression IAR是什么意思啊?
STM8S标准库TIM1编码器功能不计数,请大师帮我看看
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);
这个是我这边的程序,麻烦大神帮忙看看哪里有问题
谢谢!
评分
查看全部评分
具体也说不好,感觉主节点设置的有问题,是否节点地址设置不对
附个资料看看----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。
评分
查看全部评分