5440|9

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

浪淘沙请进,关于USART发送时出现IDLE中断 [复制链接]

前两天看别的东西了,没来得及写,现在发上来,请看一下。
问题如下:使用USART1发送一串数据(这里是30个),发送到不定个数量时(有时12,有时18,有时其他),会产生一个IDLE中断。
main function: 
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System Clocks Configuration */
  RCC_Configuration();
       
  /* NVIC configuration */
  NVIC_Configuration();

  /* Configure the GPIO ports */
  GPIO_Configuration();
  GPIO_SetBits(GPIOC,GPIO_Pin_7);

  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_InitStructure.USART_Clock = USART_Clock_Disable;
  USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
  USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
  
  /* Configure USART1 */
  USART_Init(USART1, &USART_InitStructure);
  

  /* Enable the USART1 */
  USART_Cmd(USART1, ENABLE);
  i = USART_ReceiveData(USART1);
  USART_SendData(USART1, TxBuffer[TxCounter]);
  TxCounter += 1;
  USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);

  USART_ITConfig(USART1,USART_IT_TC,ENABLE);
  
  while (1)
  {
  }
}
interrupt function: 
void USART1_IRQHandler(void)
{
 if((USART_GetITStatus(USART1, USART_IT_TC) != RESET) && (GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7) == 1))
  {
    USART_ClearITPendingBit(USART1, USART_IT_TC);
    USART_SendData(USART1, TxBuffer[TxCounter]);
    TxCounter += 1;
    if(TxCounter > 29)
    {
      USART_ITConfig(USART1, USART_IT_TC, DISABLE);
      TxCounter =0;
    }
  }
 else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)
 {
   TxCounter = 40;
 }
}

此帖出自stm32/stm8论坛

最新回复

                                 软件控制的半双工。感谢香主的指导,等先把手头的活弄完了,再研究一下产生的原因。   详情 回复 发表于 2008-9-24 10:04
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

GPIOC7是什么?

你的中断处理程序中多次调用了库函数,要知道库函数的效率不高,请尝试把中断程序中的处理改为直接的寄存器操作。

我还是不明白为什么你在发送时要打开IDLE中断?
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

试过直接寄存器的操作

GPIOC_7是用来打开发送的开关的。
调用函数的话,波特率那么低,难道调用函数需要几百us的时间?
另外,昨天看了一下,没有开IDLE中断时用示波器来观察,并没有产生1个byte的空闲时间,30个数据能够正常发送。但是一打开IDLE中断的话,就会进入IDLE中断程序。
至于为什么需要发送的时候打开IDLE中断,我现在使用时没有打开,可以使用。只是遇到这样的问题,只是想搞清楚而已。到底是不是使用方法上存在的问题。
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 

IDLE中断是在检测到RX线上的Idle Frame的时候产生,与发送无关

                                 楼主的问题我们没有碰到过,要试验过才知道,但你自己可以监视一下RX信号看看是否是对方开始发送了。
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 

idle frame

                                 idle frame的话是在接受一次之后出现的,这个我目前是没有问题的。香主的意思是不是说我在接受之后,发送数据的时候,对方又发送了一串数据,那么又产生了一个idle frame?再去看看,呵呵
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 

我使用的是半双工的

                                 似乎不存在上面说到的那种问题- -!
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 

半双工?可是你的程序中并没有初始化为半双工!

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 

我并没有使用芯片中有的半双工模式

                                 只是发送的时候这么做而已,难道和这个有关系吗?
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 

你的硬件连接是单线还是双线

                                 如果是双线,那么所谓的半双工就是软件控制的,既然是软件控制的就有可能误动作。判断到底问题在哪里的根本办法是用示波器观察。请问在发送时,你的RX线上是否有数据或干扰信号?当有IDLE中断时USART_SR的内容是什么?
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 

是双线的

软件控制的半双工。感谢香主的指导,等先把手头的活弄完了,再研究一下产生的原因。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表