485芯片的坑

        

RO引脚一定要加上拉电阻!!!!!!!!

给公司写新的通讯协议,测试的时候发现的问题。当DI发送时,DE拉高的同时会把RO拉低,导致一系列奇怪的问题。UASRT发送和接受进的是同一个中断如下:                

void SendBack(void)		
{
	DE=1;
	delay_ms(3);
	uart4_send("%\r\n",3);
	delay_ms(3);
	DE=0;
}	


void UART4_IRQHandler(void)
{
	u8 res;
	if((UART4->SR&(1<<5)))
	{
		if(DE==0)
		{
		res = UART4->DR;
		TEST = 1;
		}

	}
		
}

int main(void) 
{
	u16 adc_val;//AD值
/*******************初始化部分****************************/
	Stm32_Clock_Init(2); 	//系统时钟设置
	delay_init(16);	     	//延时初始化
	uart4_init(8,9600,8,1,'N',500);
	JTAG_Set(01);           //01,使能SWD

while(1)
	{

		if(TEST == 1 )
		{
			TEST = 0;
			SendBack();
			TEST = 0;
		}
	}

}

两个TEST=0;如果TEST=0;在SendBcak()上面,那么发送一个字节会导致SendBack()执行两边。看下面时序图

上面是RO,下面是DI,DI发送时会把RO拉低(不加上拉电阻的时候),因为RO被拉低,所以RO一直认为是在接收状态,导致SendBack()执行时,接收中断又被执行,TEST又被置一了。所以在SendBack()后面加TEST=0;

如果在代码里加上对DE的判断,那么程序会直接死在中断的if判断条件。因为当发送数据时,DE拉高之后再发送,但是DE拉高的同时RO也被拉低,CPU认为接收到数据了,所以进入串口中断,因为DE==0 不满足会马上跳出,但是没有读DR可能还是会进入中断导致程序一直死在if这条语句上。


void UART4_IRQHandler(void)
{
	u8 res;
	if((UART4->SR&(1<<5))&&(DE==0))
	{
		if(DE==0)
		{
		res = UART4->DR;
		TEST = 1;
		}

	}
		
}

发送一个字节后,DE会一直高电平,RO一直低电平,TI没有反应,根本原因还是TI发送导致的RO变低电平。

485芯片应该时电路的问题,加上拉电阻只是抑制引脚的下拉,不会根本消除。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值