在线时间18 小时
UID122846
注册时间2008-8-25
NXP金币0
该用户从未签到
中级会员
- 积分
- 385
- 最后登录
- 2020-8-7
|
我外部用的是485方式,485有个发送/接受使能,用口线控制。有个问题是在发送的时候我必须先使能发送口线,延时一段时间后才能真正在程序里面发送数据,否则发出的第一个数据会出现错误。 发送完后还不能立即将使能口线转为接收,需要再延时一断时间后再使能接收口线才能收到正确数据,否则最后一个数据有错误。这个时间不好控制,对方可能回得很快也可能回得慢。开始怀疑是隔离光耦问题,但我查了一个我的3个光耦(TLP114A),高低转换的最大速度都是0.8us,速度没问题。这怎么解决?
UART初始化程序:
void Init_UART1(void)
{
/* ### Init_UART1 init code */
/* UCR1: MISC=3,TC=0,RC=0 */
UCR1 = 0x30;
/* UCR1: MISC=2,TC=0,RC=0 */
UCR1 = 0x20;
/* UCR1: MISC=1,TC=0,RC=0 */
UCR1 = 0x10;
/* UACR1: IEC=0 */
UACR1 = 0x00;
/* UIMR1: COS=1,DB=1,FFULL_RXRDY=1,TXRDY=1 */
UIMR1 = 0x3;
/* UMR11: RXRTS=0,RXIRQ=0,ERR=0,PM=2,PT=0,BC=3 */
UMR11 = 0x13;
/* UBG11: Divider_MSB=0 */
UBG11 = 0x00;
/* UBG21: Divider_LSB=0xC3 */
UBG21 = 0xc3;
/* UCSR1: RCS=0x0D,TCS=0x0D */
UCSR1 = 0xDD;
/* UMR21: CM=0,TXRTS=0,TXCTS=0,SB=7 */
UMR21 = 0x07;
/* UCR1: MISC=0,TC=0,RC=0 */
UCR1 = 0x01;
}
中断程序:
__declspec(interrupt) void isrINT_UART1(void)
{
/* Write your interrupt code here ... */
if (UISR1 & UISR1_TXRDY_BITMASK) {
/* Yes. If any character to send, write it to UTB0
else disable transmitter as follows:
*/
send_char();
}
/* Character received? */
if (UISR1 & UISR1_FFULL_RXRDY_BITMASK) {
/* Yes, read character to clear interrupt
(NB: Should check for framing, parity and overrun errors here)
*/
rev_char(URB1);
}
}
/* end of isrINT_UART1 */
void send_char(void)
{
uint16 i;
if(dis_se_ptr
组织发送数据报文:
void send_ask(void)
{
uint16 sum;
uint8 i;
distxd[0]=0xeb;
distxd[1]=0x90;
distxd[2]=0xeb;
distxd[3]=0x90;
distxd[4]=0x02; //起始符
distxd[5]=0x2; //特征码 查询键盘命令
distxd[6]=11; //报文总长度
distxd[7]=dis_inf;
sum=CheckSum(distxd,8);
distxd[8]=(uint8)(sum%0x100); //代码和l
distxd[9]=(uint8)(sum/0x100); //代码和h
distxd[10]=0x03; //结束
PORTUC|=PORTUC_PORTUC0_BITMASK; //使能发送
sum=20000; //这个延时短了发出的第一个字节有问题
while(sum!=0)
{
sum--;
}
dis_rb_ptr=0;
dis_se_ptr=0;
dis_sb_ptr=distxd[6];
UCR1 = UCR1_TC0_BITMASK; //发送数据
sys_state|=0x4000;
dsfh=0; //等待发送完成
while( ((sys_state&0x4000)!=0)&&(dsfh=LP3S)
{
sys_state&=~0x4000; //超时,发送失败
comerr_num++;
}
else
{
comerr_num=0;
break;
}
}
|
|