LAN9252芯片控制资料

news2025/7/13 4:58:41

一,整个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;
}

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

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

相关文章

咪蒙团队转型做短剧行业,年收入近2个亿

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 很多人不知道咪蒙是谁&#xff0c;他曾经是公众号时代的no.1&#xff0c;她发一篇带广告的推文大几十万, 那个时候不知道带动多少人去做公众号,2019年发表不恰当文章而被封禁。 但最近我看到一则新…

ABAP BAPI_ACC_DOCUMENT_POST 中 EXTENSION1的用法

BAPI_ACC_DOCUMENT_POST 在过账会计凭证时候&#xff0c;经常会发现一些标准字段在参数中并没有 可以通过CMOD/SMOD增强出口--》ACBAPI01--》EXIT_SAPLACC4_001--》ZXACCU15 示例代码&#xff1a; DATA: wa_extension TYPE bapiextc,it_extension TYPE STANDARD TABLE OF ba…

Adobe Acrobat Reader界面改版 - 解决方案

问题 日期&#xff1a;2023年9月 Adobe Acrobat Reader下文简称Adobe PDF Reader&#xff0c;此软件会自动进行更新&#xff0c;当版本更新至2023.003.20284版本后。 软件UI界面会大改版&#xff1a;书签页变成了右边、工具栏变到了左边、缩放按钮变到了右下角&#xff0c;如…

Voxel R-CNN:基于体素的高性能 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2012.15712 论文代码&#xff1a;https://github.com/djiajunustc/Voxel-R-CNN 论文背景 基于点的方法具有较高的检测精度&#xff0c;但基于点的方法通常效率较低&#xff0c;因为对于点集抽象来说&#xff0c;使用点表示来搜索最…

Spring系列文章:Spring使用JdbcTemplate

一、简介 JdbcTemplate是Spring提供的⼀个JDBC模板类&#xff0c;是对JDBC的封装&#xff0c;简化JDBC代码。 当然&#xff0c;你也可以不⽤&#xff0c;可以让Spring集成其它的ORM框架&#xff0c;例如&#xff1a;MyBatis、Hibernate等。 第一步&#xff1a;引入依赖 <d…

Vue.js 中的路由(Route)跳转

Vue.js 中的路由 官方解释 在 Vue.js 中&#xff0c;路由是一种用于导航和页面跳转的重要概念。Vue 提供了一个名为 Vue Router 的官方插件&#xff0c;用于构建单页面应用程序&#xff08;SPA&#xff09;的路由系统。Vue Router 允许您将不同的组件映射到应用程序的不同 URL…

​重生奇迹MU弓箭手PK路线​

定位远程物理输出的弓箭手职业&#xff0c;是很多女性玩家都比较喜欢的&#xff0c;操作难度非常低&#xff0c;其持续输出以及远距离攻击特性&#xff0c;都让她表现非常不错。 一般重生奇迹弓箭手在日常副本时都是选择堆输出&#xff0c;然后就是恢复能力。但是pk完全不一样…

【Spring面试】BeanFactory与IoC容器的加载

文章目录 Q1、BeanFactory的作用是什么&#xff1f;Q2、BeanDefinition的作用是什么&#xff1f;Q3、BeanFactory和ApplicationContext有什么区别&#xff1f;Q4、BeanFactory和FactoryBean有什么区别&#xff1f;Q5、说下Spring IoC容器的加载过程&#xff08;※&#xff09;Q…

自造简易版音频进度条

最近在做音乐播放器页面, 积累了很多有趣的经验, 今天先分享播放进度条的开发过程. 效果 话不多说&#xff0c;先看效果 支持点击修改进度&#xff0c;拖拽修改进度&#xff0c;当然大家肯定都知道ui库里面有现成的&#xff0c;为何要自己造一个 首先著名的ui库中确实都要这…

flask bootstrap页面json格式化

html <!DOCTYPE html> <html lang"en"> <head><!-- 新 Bootstrap5 核心 CSS 文件 --> <link rel"stylesheet" href"static/bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css"><!-- 最新的 Bootstrap5 核心 …

C++ goto 语句

goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意&#xff1a;在任何编程语言中&#xff0c;都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪&#xff0c;使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。…

【vue3】一些关于hooks的使用经验

前言 最近接到了一个需求&#xff0c;隔壁嵌入式部门希望我们用前端解析渲染Kconfig表单。这篇文章用来记录一下本次使用hook pinia vue3的经验 hooks hooks的概念最早是在 React 中听到的&#xff0c;虽然早些时间也写过一点react&#xff0c;但也只是照葫芦画瓢&#xf…

C++多线程编程(第四章 promise和future)

promise 和future promise用于异步传输变量 std::promise提供存储异步通信的值&#xff0c;再通过其对象创建的std::future异步获得结果。 std::promise只能使用一次。void set_value(_Ty&& _Val)设置传递值&#xff0c;只能调用一次std::future提供访问异步操作结果…

最新期权开户的形式有哪些?

期权目前都有哪些开户方式? 摘对于上证50etf期权的投资者来说,最关心的就是开户的问题了,而50etf期权开户方式目前主要有券商和平台开户两种,各有优缺点&#xff0c;下文介绍最新期权开户的形式有哪些&#xff1f; 一、最新的期权开户方式有多种&#xff0c;包括在线开户、手机…

自己的碎碎念集合

自己的碎碎念集合 2023-09-07 c叠加三目运算符闰年计算法2023-08-13 一个小题目 AB problem一、问题及解答关碍 总结 2023-07-26 C的2至36进制转换函数一、itoa()函数的示例代码总结 2023-07-19 平面坐标下判断三角形以及输出周长和面积一. 基本知识总结 2023-06-25 达芬奇去除…

认识伦敦银的真相,并没有那么容易

我们进行伦敦银投资&#xff0c;其实就是想利用一定的时间在这个市场中获取盈利。对于普通人来说&#xff0c;我们获得金钱的方法就是从事一份工作努力的&#xff0c;在这个职位中&#xff0c;做好自己的本职工作&#xff0c;最后老板为我们的辛勤付出&#xff0c;支付相应的工…

快速构建基于Paddle Serving部署的Paddle Detection目标检测Docker镜像

快速构建基于Paddle Serving部署的Paddle Detection目标检测Docker镜像 项目介绍需要重点关注的几个文件构建cpu版本的docker构建gpu版本的docker&#xff08;cuda11.2cudnn8&#xff09; 阅读提示&#xff1a; &#xff08;1&#xff09;Paddle的Serving项目中&#xff0c;在t…

OpenCV 06(图像的基本变换)

一、图像的基本变换 1.1 图像的放大与缩小 - resize(src, dsize, dst, fx, fy, interpolation) - src: 要缩放的图片 - dsize: 缩放之后的图片大小, 元组和列表表示均可. - dst: 可选参数, 缩放之后的输出图片 - fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比. - …

【React学习】React高级特性

1. 函数式组件和类组件区别 函数式组件 函数式组件是一种简单的组件定义方式&#xff0c;它是一个以JavaScript函数为基础的组件。 可以把函数式组件理解为纯函数&#xff0c;它的输入为props&#xff0c;输出为JSX。函数式组件没有状态&#xff0c;也没有生命周期。 functio…

java特殊文件 属性文件properties和XML文件

属性文件properties 后缀为.properties的文件&#xff0c;称之为属性文件&#xff0c;它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。 首先我们要掌握属性文件的格式&#xff1a; 1.属性文件后缀以.properties结尾 2.属性文件里面的每一行都是一个…