广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com
SBUFSerial_data; while(!TI); TI=0; }
/*发送一个字节,并进行偶校验*/
/******************************************************************** 发送一帧数据函数 原型:void TXD_Int(uchar *); =功能:发送一帧数据
入口参数:发送数据帧地址指针 出口参数:无
==
********************************************************************/
void TXD_Int(uchar *s) {
uchar CS0x68;
=
char i,j;
=
CTRL4850; /*RS-485通讯,切换为发送状态*/ =Delay_T(1);
TI0;
Send_Data(0xfe); /*发送2个前到字节*/ Send_Data(0xfe); Send_Data(0x68); /*发送帧头*/
for(i=0;i<=5;i++) /*发送电表通讯地址*/
{CS+=*(s+i);Send_Data(*(s+i));} CS+=0x68;Send_Data(0x68); /*发送数据帧头*/ CS+=*(s+6);Send_Data(*(s+6)); /*发送帧命令*/ CS+=*(s+7);j=*(s+7);Send_Data(j); /*发送数据长度*/ =
for(i0;i w.wwd15.jpten{ (*(s+i+8))+0x33; Send_Data(*(s+i+8)); CS+=(*(s+i+8)); } Send_Data(CS); /*发送校验字节*/ Send_Data(0x16); /*发送帧尾*/ RI=0;TI=0; Delay_T(1); CTRL485=1; /*一帧发送完毕,恢复信道切换功能*/ } /******************************************************************** 通讯地址判断函数 原型:uchar Serial_Address(uchar *); 35 广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com 功能:通讯地址判断,通讯地址存储E2PROM 0区0x00~0x05中 全局变量: =入口参数:s1指向从通讯地址 出口参数:=0x00=错误,0x01正确,0x02广播地址 ********************************************************************/ uchar Serial_Address(uchar *s1) { uchar i,a[6]; IRcvStr(CAT24W08,0x00,a,6); /*读取电表通讯地址*/ for(i=0;i<=5;i++) { if((*(s1+i))!0x99) /*不是广播地址*/ break; if(i==5) return(0x02); /*是广播地址*/ } = for(i0;i<5;i++) == { if((*(s1+i))!a[i]) return(0x00); /*地址不相同*/ =} return(0x01); /*地址相同*/ } /******************************************************************** 通讯密码判断函数 原型:bit Serial_Password(uchar *); 全局变量: 功能:通讯密码判断,密码存储E2PROM 0区0x06~0x09中 入口参数:s1指向从通讯密码地址 出口参数:0错误,1正确 w.ww d15.jpten********************************************************************/ bit Serial_Password(uchar *s1) { uchar i,a[4]; IRcvStr(CAT24W08,0x06,a,4); for(i0;i<3;i++) { if((*(s1+i))!a[i]) return 0; /*密码不对*/ /*密码正确*/ } } return 1; 36 广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com /******************************************************************** 通讯执行函数 原型:bit Serial_Command_Run(uchar *); 功能:执行通讯命令 入口参数:帧地址 出口参数:是否正确及是否完毕,0为错误和通讯没有完成,1为正确和通讯完成 ********************************************************************/ bit Serial_Command_Run(uchar *s) { switch(Serial_Address(s)) /*判断地址是否正确*/ { case 0x02: break; case 0x01: = = /*广播地址999999999999H*/ /*正常地址*/ switch(*(s+6)) { /*进行密码修改*/ case 0x0f: if(~Serial_Password(s+8)) /*密码是否正确*/ return 0; /*错误,返回*/ ISendStr(CAT24W08,0x06,s+12,4);/*存取新密码*/ Delay_T(5); /*构造返回数据帧*/ w break; case 0x01: /*读数据*/ break; case 0x04: /*写数据*/ break; default: break; /*其他命令*/ .wwIRcvStr(CAT24W08,0x00,s,6); /*读取电表通讯地址*/ IRcvStr(CAT24W08,0x06,s+8,4); /*读取存取的密码*/ (*(s+6))|0x80;(*(s+7))0x04; /*存入命令码及长度字节*/ TXD_Int(s); /*发送一帧数据*/ d15.jpten} break; case 0x00: /*地址错误*/ } return 1; return 0; break; /*帧执行正确,返回*/ } /******************************************************************** 37 本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com 通讯主函数 原型:void Serial_Command(); 功能:执行通讯命令 入口参数:无 出口参数:无 ********************************************************************/ void Serial_Command() { if(Command_status1&0x04) /*通讯事件发送*/ { if(~Serial_Command_Run(Serial_buf)) /*帧执行*/ {ESR=1;Command_status1&=0xfb;return;} /*帧错误,恢复信道功能*/ ESR=1; /*恢复信道功能*/ Command_status1&0xfb; /*j清除通讯处理事件*/ } } 电表程序主函数 原型:void main(); 功能:完成通讯主流程 入口参数:无 出口参数:无 /******************************************************************** = ********************************************************************/ void main() { Ini_CPU(); EA=1; while(1) { Serial_Command(); } } w.ww d15 .jp ten/*对CPU各个部件初始化*/ /*打开中断开关*/ 1.6 RS-485应用要点 1.1.1 合理选用芯片 合理地选择一个高效、合适的RS-485收发器型号,可以有效减少电路设计、网络维护 等后续阶段的工作量。 例如,对外置设备为防止强电磁(雷电)冲击,建议选用SP485E、75LBC184等集成ESD增强保护功能的RS-485收发器;对节点数要求较多的,可选用SP485R增强型1/10单位负载RS-485收发器;对于3V的应用系统,可以选用3V的RS-485收发器,比如SP3483芯片。 38 本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。广州周立功单片机发展有限公司 Tel:(020)38730977 38730977 Fax:38730925 http://www.zlgmcu.com 1.1.2 终端匹配电阻 为了匹配网络的通讯阻抗,减少由于不匹配而引起的反射、吸收噪声,有效抑制噪声干 扰,提高RS-485通讯的可靠性,需要在RS-485网络的2个端点各安装1个终端匹配电阻。终端匹配电阻的大小由传输电缆的特性阻抗所决定。例如,RS-485网络通常采用双绞线或屏蔽双绞线作为传输介质,其特性阻抗为120Ω,因此,RS-485总线上的两个端点也应各安装1个120Ω的终端匹配电阻。 匹配电阻要消耗较大电流,不适用于功耗限制严格的系统。在特殊的场合,可以考虑比较省电的并联“RC”匹配方案,可以节省大部分功率,但电容C的取值是个难点,需要在功耗和匹配质量间进行折衷。 1.1.3 应用层通信协议 RS-485收发器仅能够用于实现RS-485网络的物理层。在一个实际运行的RS-485网络中,还需要编制基于应用层的通讯协议,以完成预定功能的目标间数据通讯。 由RS-485网络的传输特性决定,任一时刻在同一物理连接网络中只能够存在一个发送节点,多节点同时发送可能会导致RS-485总线出现竞争“锁定”;因此,只可以选择单主多从通讯协议作为RS-485网络的应用层通信协议,比如ModBus协议,或者其他“单主/多从”模式的通讯协议。 一般来说,通讯协议中规定的数据包格式由引导码、长度码、地址码、命令码、数据、校验码、尾码组成。 1.1.4 3V-5V系统的连接 通常,5V的应用系统可以选择5V的RS-485收发器,比如SP485、SP485E、SP485R、SP490、SP491等RS-485收发器或RS-422收发器;而3V的应用系统应选择3V的RS-485收发器,比如SP3485、SP3481、SP3490、SP3491等RS-485收发器或RS-422收发器。合适的器件选择将提供适合的电平匹配,保障系统能够可靠工作。 同时,大多数3V、3.3V的微处理器都可以直接驱动Sipex公司的5V系列RS-485收发器芯片,例如PHILIPS的LPC900系列8位MCU芯片、LPC2000系列32位ARM芯片,技术的关键在于应用系统中微处理器的I/O电平容限。 下面以3V、5V混合系统为例,说明不同电平器件接口情况。为保证在混合电压系统中数据交换的可靠性,必须满足输入转换电平的要求,但又不能超过输入电压的限度。各种转换电平的要求如下: TTL电平:输入高电平VIH为2V以上;输入低电平VIL为0.8V以下。 CMOS电平:VIH为0.7×VCC以上;VIL为0.3×VCC以下。 例如VCC为5V±0.5V的系统,CMOS的输入电压VIH至少是3.85V,而VIL必须小于1.35V。目前大多数所接触到微处理器芯片都是采用CMOS工艺。例如,参考SP485R芯片数据手册,其逻辑输入的高电平VIH为2V以上,低电平VIL为0.8V以下;逻辑输出的高电平VOH为2.4V以上,低电平VOL为0.4V以下。因此,SP485R芯片可以与大多数微处理器芯片直接连接。 其实,可以用以下原则来考虑3V、5V混合系统:5V TTL器件可以驱动3V TTL输入;3V CMOS/TTL器件驱动5V TTL的输入端也都是完全可以的;当用5V CMOS器件来驱动3V TTL输入时,必须小心选择,当选用的3V接收器件应具有5V的I/O容限时才可以实现; w.wwd15.jpten 39