[其他ST产品]

浪淘沙请进,关于USART发送时出现IDLE中断

[复制链接]
3459|10
手机看帖
扫描二维码
随时随地手机跟帖
古道122|  楼主 | 2008-9-18 15:57 | 显示全部楼层 |阅读模式
前两天看别的东西了,没来得及写,现在发上来,请看一下。
问题如下:使用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;
 }
}

浪淘沙| | 2008-9-18 20:58 | 显示全部楼层

GPIOC7是什么?

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

我还是不明白为什么你在发送时要打开IDLE中断?

使用特权

评论回复
古道122|  楼主 | 2008-9-19 09:15 | 显示全部楼层

试过直接寄存器的操作

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

使用特权

评论回复
香水城| | 2008-9-19 09:49 | 显示全部楼层

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

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

使用特权

评论回复
古道122|  楼主 | 2008-9-19 11:32 | 显示全部楼层

idle frame

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

使用特权

评论回复
古道122|  楼主 | 2008-9-19 15:22 | 显示全部楼层

我使用的是半双工的

似乎不存在上面说到的那种问题- -!

使用特权

评论回复
香水城| | 2008-9-19 15:58 | 显示全部楼层

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

使用特权

评论回复
古道122|  楼主 | 2008-9-19 17:56 | 显示全部楼层

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

只是发送的时候这么做而已,难道和这个有关系吗?

使用特权

评论回复
香水城| | 2008-9-19 18:36 | 显示全部楼层

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

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

使用特权

评论回复
古道122|  楼主 | 2008-9-24 10:04 | 显示全部楼层

是双线的

软件控制的半双工。感谢香主的指导,等先把手头的活弄完了,再研究一下产生的原因。

使用特权

评论回复
yangzj1974| | 2018-2-13 11:55 | 显示全部楼层

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

381

帖子

1

粉丝