RS485只能发送数据,无法接收数据,CC2530收不到串口调试助手发来的信息。
用示波器测试了一下,发现串口到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通信的话就可以收发自如?请您告诉我这是什么原因呢
- 检查一下两个板子的收发接线收发正确,一个板子的TXD应当接到另一个板子的RXD。
- 检查一下两个板子的串口设置是否一致,如波特率,奇偶检验位等;PC机的容错能力强些,两个单片机对通信的要求可能会苛刻些。
你好,请问下使用中断方式的话,你说在终端函数里面处理,能具体点吗?具体是的这个中断函数是在哪里能指导下吗?并且我是使用串口1进行跟485通讯的,那是否需要在初始化的时候进行串口1的中断使能之类的,谢谢了