ZYNQ双核运行控制外设(CAN、GPIO)时需要注意的点_为什么zynq can ip 无法进入config配置模式,xcan_selftest函数失效

解决方案:

提示:这里填写该问题的具体解决方案:

1.首先对CPU0下的Linux系统配置与CAN相关的设备树和内核
对ZYNQ来说,进入到 Linux 内核源码目录,打开 arch/arm/boot/dts/zynq-7000.dtsi 设备树文件,在这个设备树文件当中有两个 CAN 节点,分别为 can0 和 can1,如下所示:

在这里插入图片描述
这是 xilinx 官方提供的 CAN 总线控制器节点配置信息,两个设备节点的 status 属性的值都是"disabled",也就是说默认情况下 CAN 外设是没有使能的,当我们在 vivado 软件中打开了相应的 CAN 控制器外设的时候,编译 hdf 文件得到pcw.dtsi 设备树文件中就会将 CAN 节点的 status 属性设置为"okay";我们打开arch/arm/boot/dts/pcw.dtsi 设备树文件,如下所示:
在这里插入图片描述
因为我们使用 vivado 工程只打开了 CAN0 控制器外设,所以 pcw.dtsi 设备树文件中就只
将 can0 节点的 status 设置为"okay",注意 pcw.dtsi 文件是自动生成的,我们不用对它进行
修改!
对于内核配置,我们使用的 Linux 内核源码默认已经使能了 ZYNQ CAN 驱动模块,所以这里不用再去配置了。
在这里插入图片描述
2.在CPU0的Linux系统配置完CAN后,此时在启动Linux系统后,输入ifconfig -a命令可以查看到CAN设备
在这里插入图片描述
此时如果要在CPU1下控制CNA设备,需要在CPU1下初始化,但是此初始化必须在CPU0启用CAN设备之后,否则控制失败,此处我的做法是,首先将Linux启动CAN的操作写为脚本放在Linux自启动程序下,启动CAN设备的操作为
在这里插入图片描述
然后在CPU1的程序中延迟10s左右,等Linux系统起来运行CAN控制器启动脚本之后,再在CPU1下初始化CAN
下面展示一些在ZYNQ下初始化CAN控制器的代码片。

// An highlighted block
 BOOLEAN Can0Ps\_Init(uint8\_t canid,XScuGic \*IntcInstPtr, XCanPs \*CanInstPtr)
 {
		int Status;
		XCanPs_Config \*ConfigPtr;

		/\*
 \* Initialize the Can device.
 \*/
		ConfigPtr = XCanPs\_LookupConfig(CAN0\_DEVICE\_ID);
		if (ConfigPtr == NULL) {
			return XST\_FAILURE;
		}
		XCanPs\_CfgInitialize(CanInstPtr,
					ConfigPtr,
					ConfigPtr->BaseAddr);


	/\*
 \* Enter Configuration Mode if the device is not currently in
 \* Configuration Mode.
 \*/
		XCanPs\_EnterMode(CanInstPtr, XCANPS\_MODE\_CONFIG);
		while(XCanPs\_GetMode(CanInstPtr) != XCANPS\_MODE\_CONFIG);

		/\*
 \* Setup Baud Rate Prescaler Register (BRPR) and
 \* Bit Timing Register (BTR).
 \*/
		XCanPs\_SetBaudRatePrescaler(CanInstPtr, CAN\_CFG[0].PreFreq);
		XCanPs\_SetBitTiming(CanInstPtr, CAN\_CFG[0].SyncSeg,
				CAN\_CFG[0].TimeSeg2,
				CAN\_CFG[0].TimeSeg1);


		/\*
 \* Set interrupt handlers.
 \*/
		// XCanPs\_SetHandler(CanInstPtr, XCANPS\_HANDLER\_SEND,
		// (void \*)CAN0\_SendHandler, (void \*)CanInstPtr);
		XCanPs\_SetHandler(CanInstPtr, XCANPS\_HANDLER\_RECV,
				(void \*)CAN0_RecvHandler, (void \*)CanInstPtr);
		XCanPs\_SetHandler(CanInstPtr, XCANPS\_HANDLER\_ERROR,
				(void \*)CAN0_ErrorHandler, (void \*)CanInstPtr);
		XCanPs\_SetHandler(CanInstPtr, XCANPS\_HANDLER\_EVENT,
				(void \*)CAN0_EventHandler, (void \*)CanInstPtr);


		/\*
 \* Connect to the interrupt controller.
 \*/
		Status =  SetupInterruptSystem(IntcInstPtr,
						CanInstPtr,
						CAN0\_INTR\_VEC\_ID);
		if (Status != XST\_SUCCESS) {
			return XST\_FAILURE;
		}

		/\*
 \* Enable all interrupts in CAN device.
 XCANPS\_IXR\_TXOK\_MASK
 \*/
		XCanPs\_IntrEnable(CanInstPtr, (uint32_t)XCANPS\_IXR\_RXNEMP\_MASK | XCANPS\_IXR\_ERROR\_MASK |
				 XCANPS\_IXR\_BSOFF\_MASK);

		/\*
 \* Enter Loop Back Mode.
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/d0988088e5af7f87027045365acc625f.png)

![img](https://img-blog.csdnimg.cn/img_convert/b1a26efa592c896a0344e54a51526007.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/2b5f2b93b7bc7dbc2be3cad75e66b983.png)

 **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

![img](https://img-blog.csdnimg.cn/img_convert/ade883fe68cba89e45029330967792b8.png)

![img](https://img-blog.csdnimg.cn/img_convert/4025d6e6ece6d55e322faf56e56f9e23.png)

 

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)**

<img src="https://img-community.csdnimg.cn/images/73bb5de17851459088c6af944156ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

6ee24.jpg" alt="img" style="zoom: 67%;" />



# 最后

**资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~**

**你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!**

**[更多资料点击此处获qu!!](https://bbs.csdn.net/topics/618376385)**
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Zynq是一款由Xilinx开发的嵌入式处理器。在使用Zynq进行裸机开发,我们可以利用其集成的CAN控制器来实现CAN总线的通信。 首先,我们需要了解CAN协议的基本原理。CAN(Controller Area Network)是一种高性能的实通信总线协议,广泛应用于汽车电子、工业控制、航空航天等领域。CAN总线由两条信号线(CANH和CANL)组成,利用差分信号来传输数据。 在Zynq裸机开发中,我们可以通过配置Zynq的CAN控制器来进行CAN通信。首先,我们需要初始化CAN控制器的寄存器,设置CAN的工作模式、波特率等参数。 然后,我们可以编写代码来实现CAN的发送和接收功能。对于发送,我们可以将待发送的数据写入CAN控制器的发送缓冲区,并设置相关的寄存器,使CAN控制器开始发送数据。对于接收,我们可以通过轮询或中断的方式,不断检查CAN控制器的接收缓冲区是否有新的数据到达,如果有则读取并进行相关处理。 在CAN通信中,需要注意的是数据的格式和协议的遵守。CAN通信使用帧的形式进行数据传输,包括标识符、数据域、控制域等部分。在数据处理,我们需要对CAN帧进行解析和封装。 总之,通过在Zynq裸机中使用CAN控制器,我们可以实现与其他CAN设备的通信。这样,我们就可以在嵌入式系统中使用CAN总线来进行数据传输,实现实、稳定的通信功能。 ### 回答2: Zynq是一种高性能可编程芯片,集成了处理器和可编程逻辑,可以在裸机环境下使用CAN(Controller Area Network)进行通信。 首先,为了在裸机环境下使用CAN,我们需要配置ZynqGPIO引脚,以及CAN控制器的寄存器。 其次,我们需要编写CAN通信的相关代码。这包括初始化CAN控制器、设置CAN的参数(如波特率)、发送CAN帧和接收CAN帧等功能。 在发送CAN帧方面,我们需要将要发送的数据写入CAN控制器的缓冲区,并设置相应的标识符和数据长度,然后触发发送。 在接收CAN帧方面,我们需要轮询CAN控制器的接收缓冲区,如果有新的CAN帧到达,我们可以读取标识符和数据,然后进行相应的处理。 在整个CAN通信过程中,我们还需要考虑错误处理,如通信超、数据错误等。 需要注意的是,裸机环境下使用CAN需要对硬件进行配置和编写底层驱动程序,相对比较复杂。因此,如果初次接触CAN通信,建议先熟悉裸机环境下的驱动编程和硬件配置,再进行CAN通信的实现。 总结起来,使用Zynq裸机进行CAN通信需要对硬件进行配置和编写相应的驱动程序,包括初始化CAN控制器、设置参数、发送和接收CAN帧等操作。这需要一定的硬件和软件知识,对于初学者来说可能稍微有些难度。 ### 回答3: Zynq是Xilinx公司推出的一款高性能可编程逻辑设备,它集成了ARM Cortex-A9双核处理器和可编程逻辑资源,并且具备了丰富的外设接口,如CAN控制器。 在Zynq平台上实现CAN通信的裸机开发,需要进行以下步骤: 1. 硬件配置:首先,需要连接CAN控制器与目标设备,例如汽车中的CAN总线。通过硬件连接,可以实现数据的收发。 2. 确定CAN参数:根据具体的应用需求,确定CAN的波特率、数据帧格式等参数。这些参数需要在CAN控制器和外设之间进行设置,并且保持一致。 3. 初始化CAN控制器:在裸机环境下,需要编写相应的初始化函数配置并使能CAN控制器。这些初始化函数需要设置CAN控制器的寄存器,包括波特率控制模式选择、过滤器设置等。 4. 数据收发:编写发送和接收函数,用于CAN数据的收发。发送函数中,需要将待发送的数据加载到CAN控制器的发送缓冲区,并且触发发送事件。接收函数中,需要实现CAN数据的接收和解析,处理接收到的数据。 5. 中断处理:为了提高系统的实性和效率,可以使用中断处理,即在数据到达或发送完成触发中断来提醒CPU进行处理。在中断处理函数中,可以读取/写入CAN控制器的寄存器来处理数据。 6. 测试与调试:完成上述步骤后,可以进行CAN通信的测试与调试工作,包括发送、接收数据的正确性和稳定性等。 总结起来,裸机环境下使用Zynq进行CAN通信的关键步骤包括硬件配置、CAN参数设置、初始化CAN控制器、数据收发、中断处理以及测试与调试。通过这些步骤的实现,可以在裸机环境下成功实现Zynq的CAN通信功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值