ERTEC200P-2 PROFINET设备完全开发手册(4-1)

news2025/1/18 10:07:33

ERTEC200P-2作为应用处理器,既可以单独使用,通过GPIO扩展实现基本的IO功能。也可以配合外部主机(例如单片机)实现更复杂的应用。ERTEC200P-2与外部主机接口的示意图如下。常用的接口包括UART,SPI,XHIF接口。从通讯速率来看,UART最低,XHIF最高。所以如果在主机和200P之间有大量的周期数据交换(例如伺服驱动器),建议使用XHIF。

 评估板支持两种方式的主机接口:SPI和XHIF。由于UART和SPI属于常见的外设,使用起来比较简单,可以参考对应的代码,所以这里不做过多介绍。接下来重点介绍一下XHIF。

4.1 XHIF接口说明

外部的处理器可以使用XHIF以静态存储的方式访问芯片内部的地址空间。XHIF可以通过AHB总线访问EMC,APB… 等片上资源。一般情况下,可以把EMC(SDRAM)配置为XHIF访问地址空间,这样就可以通过XHIF与主机共享SDRAM中的数据。由于主机和200P会同时访问相同的片上资源,因此XHIF会通过插入等待或就绪(WAIT/RDY)信号控制读写访问的周期,因此在配合XHIF的CPU选型时,一定选则支持WAIT/RDY信号的CPU。

首先,XHIF必须在芯片复位时通过CONFIG引脚使能和配置,因此需要在对应的配置管脚上添加上拉、下拉电阻使能和配置主机接口。

 

当前评估板的配置是:XHIF=on,16位模式,XHIF_XRD和XHIF_XWR分开,XHIF_XRD高有效。模式的选择需要和主机的外设一致。需要注意的是,XHIF_XRDY是开漏输出,因此需要根据其有效方式添加上拉、下拉电阻。一般情况下XHIF_XRDY低有效加下拉电阻、高有效加上拉电阻。参考设计板采用的模式为高有效加上拉电阻。如果主机为其他型号单片机可以参考如下时序:

读操作,XHIF_XRDY时序:

 

 

接下来需要初始化XHIF,在200P用户程序中指定SDRAM中的一个区域用于XHIF访问,

static PNIO_UINT16    xhif_mem[XHIF_SIZE_WORD] __attribute__((section(".xhif_mi_cyclic_in_buf")));

".xhif_mi_cyclic_in_buf"是在target.ld文件中定义的(注意:主机接口的起始地址必须对齐到0x100000)。这样xhif_mem的起始地址就被编译器分配到0x21000000

接下来初始XHIF寄存器,由于评估板已经将XHIF_PAGE[0-2]固定配置为011b

因此单片机访问的是PAGE3。当然,自己设计电路时可以任意选择PAGE。XHIF初始化函数为:

static void xhifInit(void)

在该函数中,首先使能REMAP REG32(0x4000F030) = 0x01; REMAP之后SDRAM会被重新映射到0x00000000,这样0x21000000起始的数据与0x01000000起始的数据是一致的。通过实验表明,只有访问REMAP之后的数据才能保证XHIF的数据更新(具体原因不明,芯片手册中也没写)。通过XHIF_0_P3_OF寄存器配置页面3(PAGE3)的起始地址。例如:

REG32(U_HOSTIF__XHIF_0_P3_OF) = (PNIO_UINT32)xhif_mem;

这样,200P通过读写0x01000000起始的数据,就可以实现与单片机共享数据。

单片机STM32F407通过FSMC访问XHIF,具体配置如下下图,注意Wait信号的使能。其中读写时间要与200P数据手册保持一致。

这里FSMC使用片选信号NE1, 起始地址为0x60000000。单片机读写0x60000000相当于读写200P 0x21000000。200P的用户程序通过访问0x01000000也可以读写0x21000000。这样就实现了在两个处理器之间共享程序。

 

在示例程序中,XHIF前32个WORD(64 bytes)用于存放输出数据,后32个WORD (64 bytes)用于存放输入数据。需要注意的是,尽管当前XHIF为16位模式,在单片机写操作时,必须对齐32位才能生效。举了例子:uint16_t xhif_buffer_out_data[32]映射到主机接口,如果依次执行以下程序:

xhif_buffer_out_data[0] = 0x0001;
xhif_buffer_out_data[1] = 0x0002;
xhif_buffer_out_data[2] = 0x0003;

如果执行完第三行,其实0x0003并没有写入到SDRAM,0x0001和0x0002会被写入到SDRAM。如果再执行:xhif_buffer_out_data[3] = 0x0004; 0x0003 0x0004才会被写入到SDRAM。因此在开发时一定要注意写操作对齐的问题。

在200P上,示例程序在通讯结束回调函数(PnUsr_cbf_IoDatXch)中通过调用IODataToXHIF 将周期输出数据缓存 OutData[2][1] (对应64bytes output) 拷贝到xhif_mem_remap [0 - 63]  (xhif_mem_remap 类型是byte[]);并且将xhif_mem_remap [64 - 127] 拷贝到周期输入数据缓存InData [1][1] (对应64bytes input)

这样,在407上,单片机程序就可以从xhif_buffer[ 0 – 31 ] (xhif_buffer 类型是 short[]) 读取输出数据,更新到外设的输出上(GPIO 或者 DAC);或者读取外设(GPIO或ADC)的输入值写入到xhif_buffer[ 32 –  63]。举例来说:在接收到EXIT0(连接在200P的同步输出SYNC上)中断后,中断服务程序将数据从xhif_buffer读出,然后将xhif_data[0] bit 0-7 (OutData [2][1][0]) 设置为GPIOG的输出。

for(tmpIdx = 0 ; tmpIdx < 32 ; tmpIdx++)
{
   xhif_data[tmpIdx] = xhif_buffer[tmpIdx];
   delay_clk(5);
}
set_reg = xhif_data[0];
set_reg <<= 8;
set_reg &= 0x0000ff00;
GPIOG->ODR = set_reg;

 从原理图上看:

 

 

LED分别对应 GPIOG8 – GPIOG15,因此PLC通过写入slot 2 sub 1 字节0,即可设置LED的输出。

同理, 在接收到EXIT0中断后,中断服务程序读取GPIOC的DI输入,将输入值写入到xhif_buffer[32] (对应InData [1][1][0])

input_reg = GPIOC->IDR;
input_reg &= 0xff;
xhif_data[32] = input_reg;
for(tmpIdx = 32 ; tmpIdx < 64 ; tmpIdx++)
{
  xhif_buffer[tmpIdx] = xhif_data[tmpIdx];
  delay_clk(5);
}

 从原理图上看:

 

拨码开关分别对应 GPIOC0 – GPIOC7,因此拨码开关的拨码值,可以通过slot 1 sub 1 字节0由PLC读取。这样,通过XHIF共享数据,实现了主机外围设备与200P的数据交互。

下一篇:XHIF接口实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSI: 基于多元同步索引的SSVEP频率识别算法

MSI: 基于多元同步索引的SSVEP频率识别算法1.算法背景2.算法原理3.Python代码实现1.算法背景 脑机接口&#xff08;Brain-Computer Interface, BCI&#xff09;因其在神经工程与神经科学中的广泛应用价值而备受研究者们的关注。BCI系统可以在人类或动物被试与外部设备之间提供…

“深元AI”赋能传统加油站智能化转型,全力打造新一代智慧加油站

历届的全国两会和党代会上&#xff0c;“安全生产”始终是核心议题。党的二十大报告提出&#xff1a;推动公共安全治理模式向事前预防转型&#xff0c;并强调要加强重点行业、重点领域安全监管&#xff0c;提高防灾减灾救灾和重大突发公共事件处置保障能力。同时&#xff0c;国…

Linux_vim编辑器

Vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;类似于windows系统下的notepad&#xff08;记事本&#xff09;编辑器&#xff0c;由于在Unix及Linux系统的任何版本&#xff0c;Vi编辑器是完全相同的&#xff0c;因此可以在其他任何介绍vi的地方都能进一步了解它&…

Java的CPU 飙升700%优化的真实案例

最近负责的一个项目上线&#xff0c;运行一段时间后发现对应的进程竟然占用了700%的CPU&#xff0c;导致公司的物理服务器都不堪重负&#xff0c;频繁宕机。 那么,针对这类java进程CPU飙升的问题&#xff0c;我们一般要怎么去定位解决呢&#xff1f; 采用top命令定位进程 登…

spring初始项目创建

首先进入http://spring.p2hp.com/projects/spring-framework.html&#xff0c;点击git按钮 点击Access to Binaries中的链接 找到里程碑版本&#xff0c;要引入仓库地址 这里的spring-context依赖只是基础的spring框架的依赖 在resources目录下创建spring的xml文件&#xff0c…

中国31个主要城市绿地数据(空间分辨率为1m)

近年来&#xff0c;为了满足生态文明和可持续发展的理念&#xff0c;科学的城市绿地规划和管理在中国越来越受到重视。因此&#xff0c;提高UGS分类体系和布局布局的合理性&#xff0c;建设绿色宜居城市&#xff0c;是近年来政府和学者关注的重点。为此&#xff0c;本文选取中国…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域

专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二、ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与…

Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

系列文章 &#x1f449; Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用&#xff0c;相比 Terraform OSS, 用起来省心多了。 也借此总结学习下&#xff1a;Terraform Cloud 比 Terraform OSS 有哪些增强&#xff0c;…

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

为了能把之前在基础篇中学习到的Skynet的各种知识结合起来&#xff0c;所以在实战篇中&#xff0c;我们准备开发一个完整的游戏案例《球球大作战》&#xff0c;介绍分布式游戏服务端的实现方法。 1、功能需求 《球球大作战》是一款多人对战游戏&#xff0c;下图是它的战斗场景…

C语言库函数(memcpy,memmove)的模拟实现

模拟实现memcpy函数 下面是memcpy的函数声明 void *memcpy(void *str1, const void *str2, size_t n) 参数 str1 -- 指向用于存储复制内容的目标数组&#xff0c;类型强制转换为 void* 指针。str2 -- 指向要复制的数据源&#xff0c;类型强制转换为 void* 指针。n -- 要被复…

stm32当中的EXTI外部中断系统

一. 中断系统 中断 &#xff1a; 在主程序运行过程中&#xff0c;出现特定的中断触发条件&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;而去处理中断程序&#xff0c;完成后&#xff0c;又返回原来被暂停的位置继续工作 中断优先 &#xff1a; 当有多个中断开始时&…

SSR初体验-结合Vue3全家桶

SSR初体验 基础搭建 安装依赖 先开启一个服务器 let express require("express");let server express();server.get("/", (req, res) > {res.send(Hello Node Server); });server.listen(3000, () > {console.log("start node server on …

vue3引入Element plus的详细步骤

目录 一、遇到问题 二、操作步骤 一、遇到问题 在用vue3去引用Element UI的时候&#xff0c;发现了白屏不能显示&#xff0c;一直检查是不是代码的问题。后面找到了问题的所在&#xff0c;原来是vue3对应兼容的是Element Plus&#xff0c;要去下载对应的Element plus版本来引…

为什么提升客户服务是长期成功的关键

当今互联网&#xff0c;服务越来约趋向个人化&#xff0c;但在这个在线互动的时代&#xff0c;当涉及到客户支持时&#xff0c;这种个人联系的感觉可能很难形成。当事情出错时&#xff0c;当客户需要支持时&#xff0c;个人联系的感觉最为强烈。在不远的过去&#xff0c;客户支…

网络安全如何入门?有哪些学习误区?

那年我高三毕业的时候要填志愿前几天 我妈问我想学什么专业。 我说&#xff0c;想学网络设计、或者计算机、网络安全工程师 那时候还比较年轻&#xff0c;也对网络&#xff0c;计算机这方面感兴趣嘛 于是我妈和我爸决定让我学网管。 我说不想做网管&#xff0c;想直接成为一…

给想涨薪和正在学习Android的朋友们一些建议

前言 相信很多从事Android开发工作的朋友&#xff0c;在入职一年后会有申请涨薪的想法&#xff0c;但由于某些原因&#xff0c;公司拒绝了您的加薪申请&#xff0c;在我看来&#xff0c;出现这种情况主要有两种原因&#xff1a;第一个原因可能是你在工作中就只知道埋头苦干&am…

81-82-83-84-85-86 - 文件系统设计与实现

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;深入浅出操作系统 - 目录 文章目录1. 问题1.1 硬盘上最最最简单的文件系统支持方式1.2 改进思路1.3 更多细节问题1.4 文件系统概要设计1.5 硬盘数据逻辑示意图1.6 硬盘数据物理组…

文心一言 VS chatgpt (8)-- 算法导论2.3 5~6题

五、回顾查找问题(参见练习 2.1-3)&#xff0c;注意到&#xff0c;如果序列 A 已排好序&#xff0c;就可以将该序列的中点与v进行比较。根据比较的结果&#xff0c;原序列中有一半就可以不用再做进一步的考虑了。二分查找算法重复这个过程&#xff0c;每次都将序列剩余部分的规…

数据结构之七大排序

数据结构之七大排序&#x1f506;排序的概念及其运用排序的概念常见的排序算法&#x1f506;插入排序直接插入排序希尔排序&#x1f506;选择排序直接选择排序堆排序&#x1f506;交换排序冒泡排序快排&#x1f506;归并排序&#x1f506;非比较排序&#x1f506;结语&#x1f…

深度探索list

1.list的基本组成 list是一个双向链表&#xff0c;它的基本组成就是 成员作用prev指针指向上一个元素next指针指向下一个元素data用来保存数据2.list的迭代器 由于人们一般习惯于&#xff1a;迭代器是找到下一个元素&#xff0c;迭代器–是找到上一个元素。在双向链表list中…