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

STM8 UART半双工 TX到RX的可靠转换

[复制链接]
Bryan 提问时间:2018-1-23 22:49 /


各位大侠:
               最近做一个STM8 UART半双工,发送自定义协议控制下位控制器,控制器正常有答复,测试发现数据发送和回发不稳定,
     考虑综合利用TXE和TC标志位,下面中断处理程序,大家看看是否有问题,是否能实现TX到RX的可靠转换。
  1. INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17)
  2. {
  3.     /* Write one byte to the transmit data register */
  4.    // UART1_SendData8(TxBuffer1[IncrementVar_TxCounter1()]);
  5.        if(Uart1_Send_Complete)                  
  6.                 {
  7.                 if(UART1_GetITStatus(UART1_IT_TC)==SET)
  8.                         {
  9.                         // Send last data
  10.                         UART1_SendData8(Command_Data_From_Controller_Buffer1[Uart1_Send_Counter]);
  11.                        Uart1_Send_Complete=0;
  12.                        //UART1_REC_START_CHECK=1;
  13.                       UART1_ITConfig(UART1_IT_TXE, DISABLE);       
  14.                         UART1_ITConfig(UART1_IT_TC, DISABLE);       
  15.                         // Transfer to UART1 REC STATE
  16.                         ENABLE_UART1_REC;
  17.                         Uart3_Rec_Counter=0;
  18.          UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);
  19.          //UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);
  20.                         }
  21.                 }
  22.            else
  23.                    {
  24.                    if(UART1_GetITStatus(UART1_IT_TXE)==SET)
  25.                            {
  26.                       UART1_SendData8(Command_Data_From_Controller_Buffer1[Uart1_Send_Counter]);       
  27.                        Uart1_Send_Counter++;
  28.                   if (Uart1_Send_Counter >= NbrOfDataToTransfer2)
  29.                    {         
  30.                   //Uart1_Send_Counter=0;
  31.                    
  32.                     // NbrOfDataToTransfer2=0;
  33.                    Uart1_Send_Complete=1;
  34.                     // UART1_ITConfig(UART1_IT_TXE, DISABLE);
  35.           //while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET);
  36.          //while( UART1_GetFlagStatus(UART1_FLAG_IDLE) == RESET);
  37.           
  38.                       }
  39.                            }
  40.                    }
  41.                
  42. }

复制代码


收藏 评论4 发布时间:2018-1-23 22:49

举报

4个回答
疯de_恒 回答时间:2018-1-24 09:59:46
检测到TC发送完成后再切换到RX吧。中断程序不用那么复杂,平常让主机处于RX状态,如果需要发送数据了,就切换到TX,发送数据完之后切换会RX。中断只接收数据即可。

评分

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

查看全部评分

Bryan 回答时间:2018-1-24 13:25:05
す疯Ⅱ恒す 发表于 2018-1-24 09:59
检测到TC发送完成后再切换到RX吧。中断程序不用那么复杂,平常让主机处于RX状态,如果需要发送数据了,就切 ...

感谢回复,第一次用。
从细节上,看各种资料,比如要发N个数据,N-1个利用TXE标志发,最后一个用TC标志发,直接完成标志清零!
不知道你做过吧? 有验证过的代码,可以分享一部分!谢谢!
Bryan 回答时间:2018-1-24 15:45:58
す疯Ⅱ恒す 发表于 2018-1-24 09:59
检测到TC发送完成后再切换到RX吧。中断程序不用那么复杂,平常让主机处于RX状态,如果需要发送数据了,就切 ...

感谢答复!
这个可能跟具体应用有关系!
疯de_恒 回答时间:2018-1-25 09:59:22
Bryan 发表于 2018-1-24 13:25
感谢回复,第一次用。
从细节上,看各种资料,比如要发N个数据,N-1个利用TXE标志发,最后一个用TC标志发 ...

看你是怎么发的,如果你是一个个发的,你可以前N个都利用TXE检测发,只需再最后切换模式前检测一下TX即可。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版