LAN9252芯片控制资料

2023-10-29

一,整个ethercat项目开发流程

    通过STM32相关学习板,理解EtherCAT协议栈和通信步骤。根据项目需求构建XML,该XML将会由TwinCAT2解析,将相关特STM32程序烧写,修改应用层协议的程序。STM32作为SPI主模式与ZYNQ LAN9252进行数据交互,对其交互流程在复杂协议栈逐渐理解。

二,ZYNQ LAN9252

1,LAN9252四种工作模式:

自我工作模式(数字I/O模式),8入8出

SPI 串口通信模式,4线串行数据(或更多SQI)

并行通信模式(HBI),16/8位数据交互

扩展模式,LAN9252与MCU之间SPI通信,同时对外再提供一组MII接口,可扩展连接另一组PHY芯片,多接一个RJ45端子。

2,整个工程中,LAN9252作用:

    PHY的作用:所有跟以太网RJ45交互的工作由LAN9252完成。

网络交换作用:EtherCAT要求从站必须有一拖一的能力,不可以终结总线,LAN9252有2端口/3端口模式,内部做网络交换。

三,zynq block design IP核搭建连线注意事项

1,zynq根LAN9252的通信用的就是SPI四根线的使能。

2,PS端口增加一个定时器中断,1ms周期,调用ECAT_CheckTimer()函数,但不要一上来就初始化使能这个中断,根据接口定义好使能入口,让协议栈调用,以上电就开启这个定时器中断会导致连接失败。

3,三个外部中断:IRQ,SCY0,SCY1。其中IRQ必须实现连接到IRQ_F2P中断。SCY0和SCY1是分布式时钟同步用的,可以选择使用(也一起连接到IRQ_F2P),也可不使用(不用连接)。注意这三个中断的使能同样要根据代码中的接口定义入口,由协议栈使能和失能中断,不能上电就直接使能中断。

为LAN9252和PIC24设置相同的中断极性。例如,如果PIC24 ESC中断线为-则LAN9252 IRQ线路应配置为活动低。还应为LAN9252和PIC24配置SYNC0/SYNC1中断极性。例如,如果PIC24 SYNC0/SYNC1线配置为负沿,则LAN9252 SYNC0/SYNC1应为配置为有效低。SYNC0/SYNC1配置可通过EEPROM更改。

SPI从接口支持两种地址模式:2字节寻址模式和3字节寻址模式。在2字节寻址的情况下,较低的13个地址位A[12:0]由SPI主控器选择,而较高的3个位A[15:13]假设为SPI从控器内的000b,因此只能访问EtherCAT从控器地址空间中的前8k字节。3字节寻址用于访问EtherCAT从机的整个64K字节地址空间。

中断中处理的函数示范:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

 if (GPIO_Pin == LAN9252_IRQ_Pin)

{

         PDI_Isr();

         return;

 }

 if (GPIO_Pin == LAN9252_SYC0_Pin)

{

     DISABLE_ESC_INT();

     Sync0_Isr();

     ENABLE_ESC_INT();

     return;

 }

 if (GPIO_Pin == LAN9252_SYC1_Pin)

{

     DISABLE_ESC_INT();

     Sync1_Isr();

     ENABLE_ESC_INT();

     return;

 }

}

4,ps端中断读取处理:开启线程,轮询读取。linux下中断号是31+30=61

axi_quad_spi_0: axi_quad_spi@41e00000

{

bits-per-word = <8>;

clock-names = "ext_spi_clk", "s_axi_aclk";

clocks = <&clkc 15>, <&clkc 15>;

compatible = "xlnx,axi-quad-spi-3.2", "xlnx,xps-spi-2.00.a";

fifo-size = <16>;

interrupt-names = "ip2intc_irpt";

interrupt-parent = <&intc>;

interrupts = <0 31 1>;

num-cs = <0x1>;

reg = <0x41e00000 0x10000>;

xlnx,num-ss-bits = <0x1>;

xlnx,spi-mode = <2>;

};

  • 函数分析

LAN9252代码是由三个大任务函数构成

int main(void)

{

   HW_Init();  /*PDI(过程数据接口)初始化,这里用的是MCI接口*/

   MainInit(); /*主函数初始化包含:ESC和COE*/

   bRunApplication = TRUE; /*处于运行状态标志*/

   do

   {

       MainLoop();/*主循环函数,实现周期性和非周期性数据交换*/

   } while (bRunApplication == TRUE);  /*检查是否处于运行状态*/    

   HW_Release();     //无意义的函数

   return 0;         //设置正确返回

}

1,HW_Init(void)函数,定义了PDI接口,定义了ESC到PDI中断的映射:

ESC的PDI(过程数据接口)有这几种情况:

(1)Up to 32 bit digital I/O——32位数字量I/O

(2)Serial Peripheral Interface ——SPI总线

(3)8/16-bit synchronous/asynchronous Microcontroller Interface ——MCI接口

(4)With FPGA, specific on-board-bus——带FPGA的,特定的on-board-bus

在倍福的手册中也可以看到0x0140寄存器描述了PDI过程数据接口的几种情况。

2,MainInit(void)函数,定义了EtherCAT从站接口,COE(CANopen Over EtherCAT)相关的配置。其中的ECAT_Init()函数用于初始化从站接口。COE_ObjInit函数用于COE对象字典的初始化。

3,这样就完成了MainInit()函数,处于运行状态了,下一步就开始跑应用层的任务,只要处于运行状态就循环进行MainLoop()函数。

  • 应用层寄存器配置,   
  1. qspi初始化

  配置LAN9252中断配置寄存器

通过ZYNQ  PS读写SPI接口发送数据

地址

判断

读0x314

data[31]==1

判断当前是不是在写过程数据:是则跳转到状态b,否则跳转到状态c

写0x314

data[30]<= 1

停止当前写过程数据

写0x310

data<={length,address}

ddress <= 0x1400,这是Lan9252写过程数据区的起始地址;Length <= 待搬运的数据长度,单位为byte

写0x314

启动写操作

读0x314

判断data[0]==0?是,则开始DMA数据搬运;否,则停留在这个操作等待可用。【判断是否有可用空间,如果有,则Fifocnt <= data[8+:5]】

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
	int fd;
	int len;
	unsigned char buf[10];
	unsigned char tmp;/* 验证输入参数个数 */
	if(3 != argc)
	{
		printf("none para\n");
		return -1;
	}
	/* 打开输入的设备文件, 获取文件句柄 */
	fd = open(argv[1], O_RDWR);
	if(fd < 0)
	{
		/* 打开文件失败 */
		printf("Can't open file %s\r\n", argv[1]);return -1;
	}
	int i = 0;int j = 0;len =strlen(argv[2]);
	for(i=0;i<len;i++)
	{
		if(argv[2][i]>='0' && argv[2][i]<='9')
		{	
			tmp = argv[2][i] - '0';
		}
		else if(argv[2][i]>='a' && argv[2][i]<='f')
		{
			tmp = argv[2][i] - 'a'+10;
		}
		else if(argv[2][i]>='A' && argv[2][i]<='F')
		{
			tmp = argv[2][i] - 'A'+10;
		}
		else
		{
			printf("Invalid input parameters \r\n");
			return -1;
		}
		if(i%2==0)
			buf[j] = tmp<<4;
		else
		{
			buf[j] += tmp;
			j++;
		}
	}
	len = j;
	printf("Test wr:");
	for(i=0;i<len;i++)
	printf(" %x",buf[i]);
	write(fd, &buf[0], len);
	printf("\n");/* 操作结束后关闭文件 */
	close(fd);
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LAN9252芯片控制资料 的相关文章

  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在本地主机上使用相同的 IP 和端口创建套接字

    我在 Linux 上看到奇怪的行为 我看到远程端和本地端都显示相同的 IP 和端口组合 以下是 netstat 输出 netstat anp 网络统计grep 6102 tcp 0 0 139 185 44 123 61020 0 0 0
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 小径

    尽入夏 绕竹篱 已是桃花稀落 笑到西川 此去随所遇 不羡青山不拜仙 园中花草 草木香幽 清风独得朝暮暖 蕲水携来四季春 云岩宫阙 尽是人间 峰峦断却处 本是一脉之水 两侧命不相同 一水之门 几多思量 几多判却 一方玲珑剔透 嬉水无痕 一方藻
  • 计算机网络——第四章

    网络层 主要任务是把分组从源端传送到目的端 为分组交换网上的不同主机提供通信服务 传输单位是数据报 功能 1 路由选择与分组转发 2 异构网络互联 3 拥塞控制 若所有节点都来不及接受分组 而要丢弃大量分组的话 网络就处于拥塞状态 因此要采
  • python数据库-NumPy与Matplotlib库

    NumPy 1 导入numpy库 import numpy as np python中用import导入库 这里的意思是将怒骂朋友作为np导入 通过这样的形式 之后使用numpy相关方法用np使用 2 生成numpy数组 import nu
  • LeetCode--数组类算法:删除排序数组中的重复项 II

    题目 给定一个排序数组 你需要在原地删除重复出现的元素 使得每个元素最多出现两次 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 示例一 给定 nums 1 1 1 2 2 3
  • 梳理webpack

    一 入门 1 项目初始化 新建一个目录 初始化npm npm init 此时会需要填入一些项目的基本描述 webpack是运行在node环境中的 我们需要安装以下两个npm包 npm i D webpack webpack cli 生成no
  • 【mcuclub】扫码枪-(型号:M100(1D)-TTL)(型号:GM861S)

    一 实物图 型号 M100 1D TTL 只能扫描一维条形码 二 原理图 编号 名称 功能 1 VCC 电源正 2 GND 电源地 3 TXD 串口数据发送引脚 接单片机上的RX引脚 4 RXD 串口数据接收引脚 接单片机上的TX引脚 三
  • Unity 处理mono内存(堆内存)泄露问题

    先讲解一下mono特性 一个很重要的信息 mono内存从系统里面申请的内存不会返回给系统 mono内存不足的时候会预申请内存 内存大小不定有可能10m有可能5m 最近优化一个mono内存泄露问题 引起mono一直撑大多数都是内存泄露 要不就
  • ArrayBlockingQueue和LinkedBlockingQueue

    ArrayBlockingQueue ArrayBlockingQueue是一个用数组实现的有界阻塞队列 其是线程安全的 内部通过 互斥锁 保护竞争资源 此队列按照先进先出 FIFO 的原则对元素进行排序 队列的头部是在队列中存在时间最长的
  • el-tabs组件切换之前拦截函数异常踩坑记录

    背景 产品需求在离开当前tab之前要对页面填写信息进行校验 若没有任何改动则可以直接切换tab 若有改动 则需要在跳转之前进行拦截 提示用户 当前页面信息未保存 确定离开吗 确定或取消由用户选择 代码实现
  • 逆向工程核心原理——DLL注入——创建远程线程

    什么是DLL注入 dll注入是一种将Windows动态链接库注入到目标进程中的技术 具体的说 就是将dll文件加载到一个进程的虚拟地址空间中 对某个进程进行dll注入 也就意味着dll模块与该进程共用一个进程空间 则这个dll文件就有了操纵
  • 可变频率正弦信号发生器的FPGA实现(Quartus)

    一 说明 实现平台 Quartus17 1 MATLAB2021a和Modelsim SE 64 10 4 二 内容 1 产生一个完整周期的正弦波信号 并保存为 mif文件 2 设计一个ROM 将正弦波信号文件初始化如该ROM中 3 设计一
  • 内存分配---kmalloc

    kmalloc 内存分配引擎是一个功能强大的工具 下面我们来讲解一下这个函数 Kmalloc 函数分配内存时有几个特点 1 获取内存空间时不会对内存空间进行清零 也就是说 分配给它的区域仍然保持着原有的数据 2 它分配的区域在物理内存中也是
  • Ubuntu中火狐浏览器Firefox打不开网页

    浏览器地址栏输入 about config 搜索 general useragent override 无则新建 输入字符串 Mozilla 5 0 X11 Linux x86 64 AppleWebKit 537 36 KHTML lik
  • 2021-09-02防火墙和CDN、Ajax跨域

    欢迎大家一起来Hacking水友攻防实验室学习 渗透测试 代码审计 免杀逆向 实战分享 靶场靶机 求关注 CDN 内容分发网络 Content Delivery Network 简称CDN 是建立并覆盖在承载网之上 由分布在不同区域的边缘节
  • 如何查看mac系统是32位还是64位的操作系统

    一 点击工具栏左上角点击 苹果Logo 标志 关于本机 gt 更多信息 gt 系统报告 gt 左侧栏中 软件 二 打开终端 输入命令 uname a 回车 x86 64 表示系统为64位 i686 表示系统32位的 比如我的 三 在终端输入
  • js实现模糊搜索

    功能一 关键字搜索 总结 1 搜索出的结果 前台先要清空原有表格 tbody empty 2 后台返回的json格式字符串 js eval 专成对象var stus eval msg 在循环进行字符串拼接到表格上 tbody html st
  • Ubuntu上vsftpd安装与多用户目录配置

    vsftpd安装与多用户目录配置 文章配置使用Ubuntu进行配置 CentOS系统的配置也是大同小异 主要理解虚拟用户的加载方式和权限目录的配置 配置目标 在 home vsftpd 目录下有3个子目录分别为folder1 folder2
  • 二叉搜索树的建立和排序

    二叉搜索树的建立和排序 今天面了一家自研 有一道二叉搜索树的题目 但是自己做的不好 就是有几个学生和成绩 使用树来存储 左子树大于等于root 右节点小于root package org example public class Main
  • 《Apache MINA 2.0 用户指南》第二章:基础知识

    最近准备将Apache MINA 2 0 用户指南英文文档翻译给大家 但是我偶然一次百度 发现 Defonds 这位大牛已经翻译大部分文档 原文链接 http mina apache org mina project userguide c
  • LAN9252芯片控制资料

    一 整个ethercat项目开发流程 通过STM32相关学习板 理解EtherCAT协议栈和通信步骤 根据项目需求构建XML 该XML将会由TwinCAT2解析 将相关特STM32程序烧写 修改应用层协议的程序 STM32作为SPI主模式与