微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > RS485只能发送数据,无法接收数据,CC2530收不到串口调试助手发来的信息。

RS485只能发送数据,无法接收数据,CC2530收不到串口调试助手发来的信息。

时间:10-02 整理:3721RD 点击:

用示波器测试了一下,发现串口到RS485之前有波形,RS485之后也有波形。。。就是CC2530收不到信号。。发现进不去那个接收中断。。。。求解。。。

Hi guang,

  你在IAR的属性设置里面有没有设置HAL_UART= TRUE(Defined symbols 选项). 如果没有的话,UART模块就不会使能,从而用不了UART模块。

谢谢

ken

用了还是不行。就是不用协议栈也不行。。。难道是我的电路图有问题?帮我看看rs485有问题吗?

 

设置了还是不行。。。。是不是我的rs485电路有问题。。。你帮我看一下吧

抛开485电路,直接串口TX接CC2530的P0.2试试呢?接收中断是否开启?应该加上IEN0 |= (1<<2);

我也遇到跟楼主类似的问题了。原本只是用了USB转TTL的转换器接收发送数据都没问题。后来硬件加了TTL转485的接口,用P0.1作为485的使能控制,P0.4和P1.0作为指示灯,修改了Hal文件的设置后,USART只能接收不能发送;奇怪的是如果把LED的宏定义也设置成P0.1,就变成只能发送不能接收了。

请高手指点问题出在哪里?485原理图如下,很简单的接法

问题解决了,原因可能是DMA发送有一个响应时间,我调用HalUARTWrite函数之前将DC_485置高,调用完立刻置低,这时候DMA还没有发送完成,从示波器上可以看出发送的波形时间比DC_485的高电平时间长。后来尝试在拉低DC_485之前加延时,想尽量等DMA操作完成,还是不成功。

最终的解决方法是在DMA的发送完成中断函数的最后才将DC_485拉低,485就可以正常发送和接收了

能不能说的再详细一些 我还是没有解决呢

MT_UartInit(); //串口初始化

MT_UartRegisterTaskID(task_id); //登记任务号

IEN0 |= (1<<2);                 //使能USART0 RX

然后就可以进 HAL_ISR_FUNCTION( halUSART0Isr, URX0_VECTOR )了

你的485使能控制正常吗?在空闲状态时是低电平吗

我用协议栈不行,不用协议栈自己编程序还是不行。。。一上电就是高电平啊。。。

发送之前将485控制引脚设为高电平,发送完之后再设成低电平啊,要不485芯片一直处于发送使能状态,肯定不能接收的

对呀  就是那样设置的呀  还是不行啊    接收的那个中断都进不去。。。。费解   可是用示波器看是有数据的

能不能留个联系方式啊   我的问题还没有解决   希望你能帮我看看   多谢了   依然是无法接收数据只能发送数据

你留给QQ吧我加你   我也是菜鸟   不一定能帮上你

372160080.。谢谢了

你的那个问题现在解决了吧?

你好,我在做uart转485的通讯上也遇到了这个问题,可是现在还没找到你说的“DMA的发送完成中断函数”在哪里,希望指点一下。谢谢!

能不能详细说明一下!谢谢好人!

能不能把你你写的demo给我看看呀 我是做超声波探头接RS485转换器的不懂这个

 zigbee用串口发送数据给rs485的超声波探头该怎么做呀
我直接 用uart0 tx rx gnd接rs485转换器
我发现接上收不到数据



先调用协议栈函数HalUARTInit(void)初始化

然后控制485的方向引脚,使其处于发送或接收模式

下面是发送函数,

 void UARTSend(uint8 PortNum, uint8 * Buf, uint16 Len)
{
  Tx485_Enable(); 
  HalUARTWrite(PortNum,Buf ,Len);
}


发送时因为协议栈是利用DMA发送的,所以要等到DMA发送结束才可以把方向引脚设为接受模式,以下是DMA发送完成中断函数,

进到这个函数就是说明DMA发送完成了,最后一句是重新设置为接收模式
void HalUARTIsrDMA(void)

  HAL_DMA_CLEAR_IRQ(HAL_DMA_CH_TX);

  // Indicate that the other buffer is free now.
  dmaCfg.txIdx[(dmaCfg.txSel ^ 1)] = 0;
  dmaCfg.txMT = TRUE;
  
  // Set TX shadow
  dmaCfg.txShdw = ST0;
  dmaCfg.txShdwValid = TRUE;

  // If there is more Tx data ready to go, re-start the DMA immediately on it.
  if (dmaCfg.txIdx[dmaCfg.txSel])
  {
    // UART TX DMA is expected to be fired
    dmaCfg.txDMAPending = TRUE;
  }
  /* 485使能引脚拉低,进入接收状态 */
  P0_1 = 0;                    //Rx485_Enable()
}

我的代码就是这样  暂时还运行正常

如果有理解不当的地方  还希望大侠们多指正

嗯,我也这样测试过,也没能成功。总是在数据还没发送完成时就拉低了485控制引脚。我当时测试的问题波形在下面的链接里http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/72525.aspx

后来我把串口改成了中断方式,在串口中断函数里处理485的控制引脚就可以了。

我认为在DMA的中断里处理不成功的原因是:DMA发送完成的中断并不代表UART已经发送完成,DMA中断发生后最后的串口数据可能还没发送。

485通讯还需要一个控制引脚,可参照下面链接里的原理图

http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/72525.aspx

我之前的修改方法跟你是一样的,但很奇怪为什么你的能正常运行,我的却不行。我现在正在使用中断方式。

提供一点参考意见:

1、我用的协议栈是2.5.1a版本,你的是更早的一个版本

2、你说在发送之前就会执行控制引脚拉低,可以设置断点仿真看是控制引脚变化先执行还是发送动作先执行

我觉得有可能你的DMA触发中断的方式设置的不一样。以下函数 if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX))这一句

是设置触发DMA中断方式的,协议栈里是选了DMA通道2。

DMA通道跟外设也是有对应关系的,我用的UART0,你可以具体查查是不是DMA通道没对应好。

/******************************************************************************
 * @fn      HalDMAInit
 *
 * @brief   DMA Interrupt Service Routine
 *
 * @param   None
 *
 * @return  None
 *****************************************************************************/
HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR )
{
  extern void HalUARTIsrDMA(void);

  HAL_ENTER_ISR();

  DMAIF = 0;

#if HAL_UART_DMA
  if (HAL_DMA_CHECK_IRQ(HAL_DMA_CH_TX))
  {
    HalUARTIsrDMA();
  }

 我觉得可能是协议栈版本的问题

1.执行的顺序是没问题的,发送单个数据时看起来是先执行了引脚拉低操作;但发送多个数据时是发送一些数据后才进行的引脚拉低操作,由此可以看出执行顺序没问题。

a.发送单个数据时波形

b.发送多个数据时波形

2.怀疑是协议栈版本的问题的另一个原因,是对比了2.5.1a版本中HAL_ISR_FUNCTION( halDmaIsr, DMA_VECTOR )这个函数和我的这个版本中该函数的区别,发现函数的开头少了

HAL_ENTER_ISR()

函数的末尾少了

CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();

有时间我升级一下协议栈试试,多谢 lihua jia ~

你好,我现在想让cc2530板子和一块单片机班子进行通信,通过RS232转TTL接口连在一起,单片机板子发数据,cc2530板子收不到,但是把它们单独和pc通信的话就可以收发自如?请您告诉我这是什么原因呢

  1. 检查一下两个板子的收发接线收发正确,一个板子的TXD应当接到另一个板子的RXD。
  2. 检查一下两个板子的串口设置是否一致,如波特率,奇偶检验位等;PC机的容错能力强些,两个单片机对通信的要求可能会苛刻些。

你好,请问下使用中断方式的话,你说在终端函数里面处理,能具体点吗?具体是的这个中断函数是在哪里能指导下吗?并且我是使用串口1进行跟485通讯的,那是否需要在初始化的时候进行串口1的中断使能之类的,谢谢了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top