解决方案:
提示:这里填写该问题的具体解决方案:
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)**