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

news/2024/11/23 23:45:18/

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.ppmy.cn/news/43589.html

相关文章

Python中的主函数

在Python代码中&#xff0c;我们常常看到主函数是以if __name__ __main__开头的&#xff0c;比如 它的原理是什么呢&#xff1f; 首先要知道&#xff0c;__name__是内置变量&#xff0c;用于表示当前模块的名字。在一个模块中运行以下语句&#xff0c;你会发现输出的是__main…

在线旅游变局:新老玩家的攻与防、危与机

配图来自Canva可画 五一小长假未到&#xff0c;大学生、职场人就早早制定了旅游路线&#xff0c;准备了旅游装备&#xff0c;还预订了机票和酒店。这边消费者们旅游之心急不可待&#xff0c;那边各地文旅局发布旅游消费券、完善旅游设施配套、花式宣传本地特色&#xff0c;使浑…

直播预告 | TDengine Apache SeaTunnel 联合应用最佳实践

TDengine 自诞生之日起&#xff0c;除产品层面的技术创新和实力提升外&#xff0c;也在大力完善自身产品生态&#xff0c;以此进一步满足用户的业务需求、提升使用体验。 近日&#xff0c;TDengine 与 Apache SeaTunnel 展开集成合作&#xff0c;双方将于 4 月 18 日 19:00 联…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符&#xff1a;*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题&#xff0c;共50分) 1. 下列说法不正确的是&#xff1f;&#xff08; &#xff09; A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析&#xff1a;针对声音可以进行导入&#xff0c;上传&…

【Python_Scrapy学习笔记(一)】Scrapy框架简介

Scrapy框架简介 前言 Scrapy 框架是一个用 python 实现的为了爬取网站数据、提取数据的应用框架&#xff0c;使用 Twisted 异步网络库来处理网络通讯&#xff0c;可以高效的完成数据爬取。本文主要介绍 Scrapy 框架的构成与工作原理。 正文 1、Scrapy安装 Windows安装&…

TCP协议内部工作机制一(确认应答,超时重传,连接管理)

目录 TCP报文结构 TCP的首部长度 保留(6位) TCP特点 TCP内部的工作机制 一确认应答 超时重传 连接管理 建立建立(三次握手) TCP断开连接(四次挥手) TCP报文结构 TCP的报文结构中,16位源端口,16位目的端口,16位校验和和UDP是一样的,本篇文章就暂不介绍了,可参考俺之前写…

Android---内存泄漏检测核心原理

目录 LeakCanary 核心原理 LeakCanary 检测对象的类型 ReferenceQueue 与 WeakReference LeakCanary 里的监控列表与保留列表 常见内存泄漏案例 1. 单例导致内存泄漏 2. 静态变量导致内存泄漏 3. 非静态内部类导致内存泄漏 4. 未取消注册或回调导致内存泄漏 5. Timer…