Linux驱动-SPI-mcp2515 复位函数
Linux驱动-SPI-mcp2515 复位函数文章目录前言一、参考文档二、读懂原理图和操作手册原理图分析Can 模块GPIO/CAN/485 Interfcae 原理图数据手册分析器件概述工作模式SPI接口三、设备树配置四、SPI 复位函数编写1、复位函数编写定义一个SPI设备指针定义复位指令SPI设备指针 赋值MCP2515 SPI软件复位函数对比两种复位操作-写入函数2、带复位函数完整驱动编写总结前言这里只简单写一个复位函数为什么要写复位函数是通过外设数据手册来的所以要先搞懂数据手册通过数据手册来分析驱动业务流程然后一步一步进行外设的驱动的业务 无外乎读写外设寄存器进行控制。一、参考文档Linux驱动-初步认识SPILinux驱动-SPI外设代码框架编写Linux驱动-SPI-框架中添加字符设备Linux 驱动-I2C输入子系统相关知识点二、读懂原理图和操作手册原理图分析Can 模块mcp2515 模块有很多功能的spi 转can,spi 转485. 如下 spi 如何转换的呢 就是通过ic 芯片进行转换了一次而已。我们直接看一下spi 转can 的原理图。看U1 部分左边不就是SPI 相关的内容吗 pin 脚标记的16 、15/14/13/12 这些就是SPI 的四根线右边看 RXCAN 、TXCAN 输出的就是can 信号。目标就是你要看懂原理图这个太基本了。 或者通过相关资料来读懂原理图。这里有特别容易忽略的问题就是IC 的原理图和实际的物理要对应上千万不要搞错。GPIO/CAN/485 Interfcae 原理图如如下红丝标记的J1 原理图要和实际的对上这样才能正确接线。数据手册分析收据手册本身要读懂要搞明白机制每一块的内容都特别重要下面初步看一下目录有哪些内容本身就是一个说明使用书器件概述工作模式所以驱动连接外设后在驱动第一步就是复位 进入配置模式。SPI接口这里特别重要数据手册里面都说了支持00 和 11 两种模式所以在实际设备树配置的时候要配置好不然无法通信。同时要关注一下数据手册里面有误发送数据介绍说明默认优先高位。三、设备树配置我们看看我们之前的设备树基本配置、必备配置 参考 Linux驱动-SPI外设代码框架编写spi0{statusokay;pinctrl-0spi0m1_cs0spi0m1_pins;pinctrl-1spi0m1_cs0spi0m1_pins_hs;mcp2515:mcp25150{compatiblemy-mcp2515;reg0;spi-max-frequency10000000;statusokay;};};说一下 设备树配置外设时候针对SPI 关注几个点compatible 匹配外设驱动reg 片选信号spi-max-frequency : 始终频率 也就是传输速度去手册里面找。10MHzspi-cpha; spi-cpol; 极性和相位外设默认是0,0 支持的就是0,0 或者 1,1 。 就按默认的来匹配不要配置这两个属性。spi-lsb-first; 低位优先传输默认是高位优先传输所有不要配置这个属性。spi-cs-high 片选极性高电平有效。 mcp2515 默认是低电平有效所有不要写这个属性。两点特别注意你自己要学会看懂操作手册如果有特别的说明 那么对应的就要在设备树上体现如果没有特别体现就用默认同时不要写不必要的属性。四、SPI 复位函数编写1、复位函数编写定义一个SPI设备指针staticstruct spi_device*g_mcp2515_spiNULL;定义复位指令#defineMCP2515_CMD_RESET0xC0// 复位指令 1100 0000SPI设备指针 赋值在mcp2515_probe回调函数中赋值// MCP2515设备初始化函数staticintmcp2515_probe(struct spi_device*spi){intret;printk(This is mcp2515 probe\n);// 保存spi设备指针g_mcp2515_spispi;// 【上电首先执行MCP2515软件复位】retmcp2515_hw_reset(spi);if(ret){printk(mcp2515 hw reset fail!\n);returnret;}// // 后续可以在这里继续添加寄存器初始化代码return0;}MCP2515 SPI软件复位函数/* MCP2515 SPI软件复位函数 */staticintmcp2515_hw_reset(struct spi_device*spi){u8 cmdMCP2515_CMD_RESET;intret;if(!spi){printk(mcp2515 spi dev is NULL!\n);return-EINVAL;}// 发送单字节复位命令retspi_write(spi,cmd,sizeof(cmd));if(ret0){printk(mcp2515 reset cmd send failed, ret:%d\n,ret);returnret;}printk(mcp2515 send reset command(0xC0) success\n);msleep(10);// 等待MCP2515内部复位完成参考数据手册要求return0;}对比两种复位操作-写入函数如上是一种写操作写了复位如下给出另外一种方案// MCP2515芯片复位函数voidmcp2515_reset(void){intret;charwrite_buf[]{0xc0};// 复位指令0x11000000即0xc0retspi_write(spi_dev,write_buf,sizeof(write_buf));// 发送复位命令if(ret0){printk(spi_write is error\n);// 打印错误信息}}这两种实现方案的底层逻辑其实是一摸一样的一个是标准写法一个是极简写法推荐第一套写法。其实 这里最核心特别注意的一点是如何声明的问题charvsu8char write_buf[]{0xc0}在 ARM 平台可能是有符号 char规范驱动代码统一使用内核linux/types.h的u8无符号字节类型避免符号扩展带来的隐性问题。2、带复位函数完整驱动编写#includelinux/init.h#includelinux/module.h#includelinux/spi/spi.h#includelinux/fs.h#includelinux/kdev_t.h#includelinux/cdev.h#includelinux/uaccess.h#includelinux/delay.h// 新增msleep 头文件staticdev_t dev_num;staticintmajor;staticintminor;staticstruct cdev mcp2515_cdev;structclass*mcp2515_class;struct device*mcp2515_device;staticstruct spi_device*g_spi_dev;// 新增全局保存spi设备指针/* MCP2515 SPI复位函数 */staticintmcp2515_reset(void){intret;uchar cmd0xC0;// MCP2515 复位指令 11000000 0xC0if(!g_spi_dev){printk(mcp2515_reset: spi dev pointer is NULL!\n);return-ENODEV;}retspi_write(g_spi_dev,cmd,sizeof(cmd));if(ret0){printk(mcp2515_reset spi_write failed, ret%d\n,ret);returnret;}msleep(10);// MCP2515复位后等待芯片稳定手册建议延时printk(mcp2515 send reset cmd success\n);return0;}/*打开设备函数*/staticintmcp2515_open(struct inode*inode,struct file*file){printk(This is mcp2515_open \n);return0;}staticssize_tmcp2515_read(struct file*file,char__user*buf,size_t size,loff_t*off){printk(This is mcp2515_cdev read\r\n);return0;}/*向设备写入数据函数*/staticssize_tmcp2515_write(struct file*file,constchar__user*buf,size_t size,loff_t*off){printk(This is mcp2515_cdev_write\r\n);return0;}staticintmcp2515_release(struct inode*inode,struct file*file){printk(This is chrdev_release\r\n);return0;}staticstruct file_operations mcp2515_fops{.ownerTHIS_MODULE,.openmcp2515_open,.readmcp2515_read,.writemcp2515_write,.releasemcp2515_release,};// MCP2515 设备初始化函数staticintmcp2515_probe(struct spi_device*spi){printk(This is mcp2515 probe\n);g_spi_devspi;// 保存spi设备指针mcp2515_reset();// ✅ 进入probe后执行芯片复位return0;}// MCP2515 设备移除函数staticintmcp2515_remove(struct spi_device*spi){printk(This is mcp2515 mcp2515_remove\n);g_spi_devNULL;// 移除时清空全局指针防止野指针return0;}// MCP2515 设备匹配表用于设备树匹配staticconststruct of_device_id mcp2515_of_match_table[]{{.compatiblemy-mcp2515},{/* sentinel */}};// MCP2515 设备 ID 匹配表用于总线匹配staticconststruct spi_device_id mcp2515_id_table[]{{mcp2515,0},{/* sentinel */}};// MCP2515 SPI 驱动结构体staticstruct spi_driver spi_mcp2515{.probemcp2515_probe,.removemcp2515_remove,.driver{.namemcp2515,.ownerTHIS_MODULE,.of_match_tablemcp2515_of_match_table,},.id_tablemcp2515_id_table,};// 驱动初始化函数staticint__init mcp2515_init(void){intret;retalloc_chrdev_region(dev_num,0,1,mcp2515);if(ret0){printk(alloc_chrdev_region is error\n);gotoerr_out;}printk(alloc_chrdev_region is ok\n);majorMAJOR(dev_num);minorMINOR(dev_num);printk(major is %d\n,major);printk(minor is %d\n,minor);cdev_init(mcp2515_cdev,mcp2515_fops);mcp2515_cdev.ownerTHIS_MODULE;retcdev_add(mcp2515_cdev,dev_num,1);if(ret0){printk(cdev_add is error\n);gotoerr_unreg_devnum;}printk(cdev_add is ok\n);mcp2515_classclass_create(THIS_MODULE,spi_to_can);if(IS_ERR(mcp2515_class)){retPTR_ERR(mcp2515_class);printk(class_create failed!\n);gotoerr_cdev_del;}mcp2515_devicedevice_create(mcp2515_class,NULL,dev_num,NULL,mcp2515);if(IS_ERR(mcp2515_device)){retPTR_ERR(mcp2515_device);printk(device_create failed!\n);gotoerr_class_destroy;}// 注册 SPI 驱动retspi_register_driver(spi_mcp2515);if(ret0){printk(spi_register_driver error\n);gotoerr_dev_destroy;}printk(mcp2515 module load complete\n);return0;// 错误回滚分支新增防止资源泄漏oopserr_dev_destroy:device_destroy(mcp2515_class,dev_num);err_class_destroy:class_destroy(mcp2515_class);err_cdev_del:cdev_del(mcp2515_cdev);err_unreg_devnum:unregister_chrdev_region(dev_num,1);err_out:returnret;}// 驱动退出函数staticvoid__exit mcp2515_exit(void){spi_unregister_driver(spi_mcp2515);device_destroy(mcp2515_class,dev_num);class_destroy(mcp2515_class);cdev_del(mcp2515_cdev);unregister_chrdev_region(dev_num,1);printk(module exit \n);}module_init(mcp2515_init);module_exit(mcp2515_exit);MODULE_LICENSE(GPL);总结本篇内容核心知识点会看使用手册、原理图、通过原理图接线设备树的配置相关技能必须根据使用手册来针对性配置复位函数通过spi 的 相关方法spi_write进行写操作

相关新闻

数学建模竞赛资源包深度解析:从VRP模型构建到代码实现与论文撰写

数学建模竞赛资源包深度解析:从VRP模型构建到代码实现与论文撰写

1. 项目概述:一份数学建模竞赛的“硬核”资源包如果你正在准备MathorCup、国赛、美赛这类数学建模竞赛,或者你是一位指导老师,正在为团队寻找高质量的参考资料,那么你肯定对“解题思路”、“完整代码”、“获奖论文”这些关键词极…

2026/8/14 4:55:31 阅读更多 →
数学建模竞赛解题:从思路到Python代码的完整实现指南

数学建模竞赛解题:从思路到Python代码的完整实现指南

1. 项目概述:从“可运行代码”到“解题思路”的实战转化最近在辅导学生准备数维杯这类数学建模竞赛时,我发现一个普遍现象:很多同学拿到题目后,第一反应不是去分析问题、建立模型,而是满世界寻找“可运行代码”。尤其是…

2026/8/14 4:55:31 阅读更多 →
OSS ChatGPT UI v4:从通用聊天到AI集成开发环境的部署与实战

OSS ChatGPT UI v4:从通用聊天到AI集成开发环境的部署与实战

如果你还在用官方 ChatGPT 网页版,每次打开都是一个空白的聊天窗口,需要手动切换模型、重新粘贴提示词、或者为不同项目创建重复的对话……那么,你正在浪费大量本可用于深度思考的时间。这不是 ChatGPT 不好用,而是它的交互设计本…

2026/8/14 4:55:31 阅读更多 →

最新新闻

从小白到生产:Snipe-IT 资产管理系统容器化部署四段式升级实战

从小白到生产:Snipe-IT 资产管理系统容器化部署四段式升级实战

从小白到生产:Snipe-IT 资产管理系统容器化部署四段式升级实战 【免费下载链接】snipe-it A free open source IT asset/license management system 项目地址: https://gitcode.com/GitHub_Trending/sn/snipe-it 如果你负责的公司刚好有几百台设备要管&#…

2026/8/14 6:01:00 阅读更多 →
gh_mirrors/ae/AES核心功能解析:C语言实现AES加密解密的终极教程

gh_mirrors/ae/AES核心功能解析:C语言实现AES加密解密的终极教程

gh_mirrors/ae/AES核心功能解析:C语言实现AES加密解密的终极教程 【免费下载链接】AES AES algorithm implementation in C 项目地址: https://gitcode.com/gh_mirrors/ae/AES gh_mirrors/ae/AES是一个用C语言实现的AES加密算法项目,提供了完整的…

2026/8/14 6:01:00 阅读更多 →
跨平台开发利器Guitar:iOS/macOS/Linux全场景字符串处理方案对比

跨平台开发利器Guitar:iOS/macOS/Linux全场景字符串处理方案对比

跨平台开发利器Guitar:iOS/macOS/Linux全场景字符串处理方案对比 【免费下载链接】Guitar A Cross-Platform String and Regular Expression Library written in Swift. 项目地址: https://gitcode.com/gh_mirrors/guit/Guitar Guitar是一款基于Swift开发的跨…

2026/8/14 6:01:00 阅读更多 →
如何使用howm:轻量级Vim风格窗口管理器的完整入门指南

如何使用howm:轻量级Vim风格窗口管理器的完整入门指南

如何使用howm:轻量级Vim风格窗口管理器的完整入门指南 【免费下载链接】howm A lightweight, X11 tiling window manager that behaves like vim 项目地址: https://gitcode.com/gh_mirrors/ho/howm howm是一款轻量级X11平铺窗口管理器,其设计理念…

2026/8/14 6:01:00 阅读更多 →
揭秘网站策划与建设阶段的推广的目标如何助力品牌从零到一的爆发式增长

揭秘网站策划与建设阶段的推广的目标如何助力品牌从零到一的爆发式增长

很多人有一个误区,觉得网站就像建房子一样,只要装修得漂漂亮亮、设计得高大上,客人自然就会蜂拥而至。这种想法在十年前或许还成立得稍多一点,但在今天这个流量碎片化、注意力稀缺的时代,这种“酒香不怕巷子深”的思维已经彻底行不通了。我见过太多客户,辛辛苦苦花了几十…

2026/8/14 6:01:00 阅读更多 →
从银狐恶意软件看现代终端安全:多层防御体系构建指南

从银狐恶意软件看现代终端安全:多层防御体系构建指南

最近在安全圈里流传着一个名为“银狐”的恶意软件家族,其攻击手法之狡猾、对抗能力之强,让不少安全从业者都感到头疼。你可能也看到过一些讨论:如果让市面上主流的十款杀毒软件来面对一个“超强”变种的银狐,结果会怎样&#xff1…

2026/8/14 6:00:00 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →