ba_wang_mao 发表于 2011-2-18 10:41:13

profibus-dp 学习资料:西门子提供的固态源码大致工作过程

基于MCU+SPC3的Profibus DP从站开发

1.单片机+软件
   在这种方案中,profibus-dp的数据链路层协议通过软件在单片机上实现,同时单片机还实现一些用户程序,物理层通信由异步串行通信接口完成。这种方案的优点是开发成本较低,缺点是需要开发人员透彻了解profibus技术细节,因此,开发周期长,而且波特率不能做到1.5Mb/s以上。


2.单片机+profibus通信ASIC
      在这种方案中,profibus-dp协议完全有profibus通信ASIC来实现,单片机主要处理用户程序。利用这种方案实现profibus-dp从站的开发,只要开发者了解profibus协议相关内容,特别是基本概念、基本术语,以及ASIC芯片的技术内容即可,因此,采用这种方案开发所需的时间要比第一种方案少很多。
      鉴于上述两种方案的比较,综合考虑到开发周期及成本,这里主要介绍单片机+profibus通信ASIC来实现profibus-dp从站的实现。
      西门子提供了完整的协议芯片及开发包,这里采用的ASIC是SPC3作为profibus-dp从站协议芯片,微处理器选用的是STC-89C52,硬件电路已经比较成素,参考SPC3的技术手册即可,用户可以根据需要扩展其他的功能,关键是硬件电路板的设计。
   在这里主要讨论软件的设计流程,本文所参考的程序是西门子公司提供的源码包。

   下面就程序中的关键部分作出详细的说明:

1.单片机+软件
   在这种方案中,profibus-dp的数据链路层协议通过软件在单片机上实现,同时单片机还实现一些用户程序,物理层通信由异步串行通信接口完成。这种方案的优点是开发成本较低,缺点是需要开发人员透彻了解profibus技术细节,因此,开发周期长,而且波特率不能做到1.5Mb/s以上。


   2.单片机+profibus通信ASIC
      在这种方案中,profibus-dp协议完全有profibus通信ASIC来实现,单片机主要处理用户程序。利用这种方案实现profibus-dp从站的开发,只要开发者了解profibus协议相关内容,特别是基本概念、基本术语,以及ASIC芯片的技术内容即可,因此,采用这种方案开发所需的时间要比第一种方案少很多。
      鉴于上述两种方案的比较,综合考虑到开发周期及成本,这里主要介绍单片机+profibus通信ASIC来实现profibus-dp从站的实现。

      西门子提供了完整的协议芯片及开发包,这里采用的ASIC是SPC3作为profibus-dp从站协议芯片,微处理器选用的是STC-89C52,硬件电路已经比较成素,参考SPC3的技术手册即可,用户可以根据需要扩展其他的功能,关键是硬件电路板的设计。
   在这里主要讨论软件的设计流程,本文所参考的程序是西门子公司提供的源码包。

   下面就程序中的关键部分作出详细的说明:



(一)初始化

      1、系统上电复位;
      2、设置中断优先级,关闭中断;
      3、将spc3双口RAM区域15H后的单元清0;
      4、设置SPC3的 IMR 寄存器,屏蔽相关的中断;
      5、设置SPC3看门狗初始值;
      6、将从站地址、从站Ident_number存入变量中供spc3初始化的时候使用,本次设计为不允许修改从站地址;
      7、调用spc3初始化函数,设置各个寄存器;
      8、初始化完成后启动spc3,并打开中断,spc3开始工作;

(二)执行for()循环,在循环中轮询处理输入数据、输出数据及设置诊断参数
      1、读取spc3看门狗和 DP 状态;
      2、喂狗;
      3、查询是否有输出数据,如果有的话则读取next_dout_buffer_cmd寄存器交换N和U,并取得交换后U缓冲区的指针,然后将输出数据写入规定的地方,源码中是一篇I/O区域;
      4、将I/O区域的数据写入到 输入-U 中,并读取new_din_buffer_cmd寄存器交换N和U,并获取交换后U的指针,加入输入数据有更新的话,则SPC3交换N和D并将数据发送出去,否则不作任何处理;
      5、处理外部诊断和其他操作:源码中将输入数据的第一个字节作为诊断的服务字节,
          首先判断诊断缓冲区是否可用;若可用,则判断新旧服务字节是否相同,相同则不进行任何处理,否则表示诊断数据有变化;
          然后比较新旧服务字节的低三位,如果不同,则依据此修改诊断报文的第一个字节的低三位并根据诊断报文第一字节的最低位确定诊断报文的长度,并更新诊断报文6字节以后的数据;
          读取new_diag_buffer_cmd,并获取新的诊断缓冲区的指针;
          设置没有可用的诊断缓冲区;
          用心的诊断数据覆盖旧的诊断数据;
          如果spc3将诊断数据读走了,则会产生diag_buffer_change中断,通过查询中断是否产生,获得新的可用的诊断缓冲区,并设置该缓冲区可用。以便用户下一次更新诊断数据。

    单片机主要是通过中断在中断服务程序中查询SPC3中发生的事件,以作出相应的中断处理,所以这一部分主要剖析单片机如何来处理SPC3中发生的各种事件:

(一)进入或离开数据交换状态
      单片机通过查询spc3中的状态寄存器以获取当前spc3是处于何种状态(wait_prm或者data_ex)
(二)新的全局命令
      单片机通过读取r_gc_commmand寄存器获取全局命令
(三)参数报文
      先判断参数报文的长度,如果小于7,则参数报文正确;
      若长度大于7,则需要进一步判断:若第8、9字节不同时为0xAA,则将参数报文中7字节以后的数据保存到单片机中,并返回参数报文正确;并保存参数报文中的第四个字节mintsdr
      如果8、9字节均为0xAA,则返回参数报文不正确
      如果返回为PRM_CONFLICT ,则重复以上步骤
(四)配置报文
      如果配置报文长度不等于2(初始化时候设置的),则配置失败
      配置报文长度等于2,再判断接收到的配置参数与保存在SPC中的配置参数是否相等,相等则配置成功;
      如果(cfg_ptr == 0x13) && (cfg_ptr) ==0x23或者(cfg_ptr == 0x11) && (cfg_ptr) ==0x21) ,则返回配置更新,并将新的配置参数保存在单片机中;
      如果返回结果为更新配置参数,则根据新的配置参数计算输入输出缓冲区的长度和各个缓冲区指针;
      假如最后得到的信息时 CFG_CONFLICT 则重复以上步骤。
(五)从站地址设置报文
      将从站地址设置报文中的地址及地址允许修改参数保存到单片机内部定义的变量中,以便下一次重启或者复位后重新加载到SPC3中,
      读取ssa_free_cmd寄存器,使得ssa-buffer有效,以便接受下一个地址参数报文。
(六)DP模式下 看门狗溢出:
         读取看门狗的状态信息
         将诊断报文长度设置为6,并且将诊断报文第一个字节低3位清0;
         读取new_diag_buffer_cmd,并获取下一个可用的诊断缓冲区的指针。
(七)检测到波特率
         如果SPC3处于wait_cfg 或者 data_ex 状态,设置mintsdr寄存器
         最后,在中断程序最后需要设置模式寄存器中的EOI位,退出中断。

song1km 发表于 2011-2-18 11:28:43

标记。。。
有前途。

楼上的内容是自己整理的吗?

xianglai0502 发表于 2011-2-23 20:20:09

资料不错,正在学习中.

huchengjunme 发表于 2011-4-30 11:19:19

我现在和楼主的处境差不多,呵呵!正在慢慢啃书本

drydiy 发表于 2013-8-27 02:46:59

不错。。。有没有用单片机实现从站的源码!

xjtyOnly51 发表于 2013-10-9 12:59:16

单片机实现?

玉石俱焚 发表于 2019-2-26 14:33:49

drydiy 发表于 2013-8-27 02:46
不错。。。有没有用单片机实现从站的源码!

大佬用单片机实现从站了吗?
页: [1]
查看完整版本: profibus-dp 学习资料:西门子提供的固态源码大致工作过程