|
本帖最后由 jinshaopu 于 2014-4-18 11:14 编辑
PC端的程序和C51在多机通信(模式3 SM2=1)模式下工作正常
但是在Protues下仿真的时候
AVR下的接收,不论是发的地址还是数据 IsAdd()都是真,也就是RX8总是1,大侠来指导下是什么情况
#define IsAdd() (UCSRB&2)
void SerialInit(void)
{
//设置波特率
UBRRL = 0x33;
UBRRH = 0x00;
//RXC TXC UDRE FE DOR PE U2X MPCM
//RXC:接收结束
//TXC:发送结束
//UDRE:数据寄存器空
//FE:帧错误
//DOR:数据溢出
//PE:校验错误
//U2X:倍速发送
//MPCM:多处理器通信模式 1:接收有地址 0:接收数据
UCSRA=1;
//接收发送使能
//RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
//RXCIE:接收结束中断使能
//TXCIE:发送结束中断使能
//UDRIE:数据寄存器空中断
//RXEN:接收使能
//TXEN:发送使能
//USCZ2:字符长度
//RXB8:接收数据位8
//TXB8:发送数据位8
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN)|(1<<UCSZ2);
//URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
//URSEL:寄存器选择
//UMSEL:串口模式选择 0:异步 1:同步
//UPM1,UPM0:奇偶校验模式。00:禁止 01:保留 10:偶校验 11:奇校验
//USBS:停止位选择 0:1位 1:2位
//UCSZ2,UCSZ1,UCSZ0:字符长度。111:9位 011:8位 010:7位 001:6位 000:5位
//UCPOL:时钟极性 (仅在同步模式下有用)
//
//
UCSRC=0x80|(3<<UCSZ0); //设置数据格式:无校验, 9个数据 1个停止位
R485();
}
ISR(SIG_UART_RECV)
{
uint8 add,temp;
if( DataError() )//接收出错就重新打开地址帧筛选功能
{
temp=UDR;
OSQFlush(SerialInData);
AddOn();
}
else
{
if (IsAdd()) //地址
{
add=UDR;
if (add==address)
{
AddOff();
}
else
{
AddOn();
}
}
else //数据
{
temp=UDR;
#if EN_OS_Q_POST > 0
OSQPost(SerialInData,temp);
#endif
#if EN_OS_Q_POST_FRONT > 0
OSQPostFront(SerialInData,temp);
#endif
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|