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芯片应该时电路的问题,加上拉电阻只是抑制引脚的下拉,不会根本消除。