SJA1000的简单调试

news2025/2/22 23:46:16

文章目录

  • 基本过程
  • SJA1000波特率计算公式
  • 验收滤波器使用
  • 其他
    • 关于CLKOUT
    • 测试寄存器
    • 初始化过程中会产生中断
    • 扩展帧、标准帧的区分
    • 计算器

基本过程

SJA1000的接口连接到FPGA上,采用软核进行CAN数据的收发。调试花了1天多的时间,有点波折,下面按顺序简单梳理下过程。

  1. 最初上板调试时,发现CAN的中断一直无法响应;
  2. 于是怀疑是波特率配的有问题,梳理了几次,没发现什么问题;
  3. 又怀疑是SJA1000的寄存器读写无法正常,于是加观测,发现是寄存器的操作地址变成了实际值*4,遂改正;
  4. 之后调试发现,寄存器回读时,数据总线的值没有变化,依然保持写出的地址值不变,于是怀疑是双向IO口的操作有误,排查没发现什么问题;
  5. 回审原理图,发现SJA1000和FPGA之间有164245器件进行隔离,相关的使能引脚、方向引脚重新进行了梳理,确保代码中对164245的操作无误后,能正常进行寄存器的写入、读出;不过,中断进入的不太正常;
  6. 之前对芯片配置了中断,但只是定时查询CAN中断状态,并未设计CAN中断函数,发现如此做的话,一是可能会出现缓存溢出,二室对于数据的组包解包不太遍历,遂改正
  7. 每次bit加载后,最初几次CAN发送总是进入不了中断(约5次),之后有时是点1次能进入中断,有时是点2次能进入中断;
  8. 回读状态,发现接收缓存溢出;由于单次发送的数据是13字节,而接收缓存的深度是64字节,和5次后才能进入中断的现象类似,于是复查中断,发现中断配置有误,未使能接收中断,而是使能了溢出中断,遂改正;
  9. 在中断中进行数据的收发测试,打印接收数据,正常;
  10. 更改波特率,测试正常 。

SJA1000波特率计算公式

在这里插入图片描述
对于16M的晶振输入,可以参考下面的波特率设置代码,

/*
功能说明:   CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ*/

#define         BTR0_Rate_5k       0xBF          //5KBPS的预设值
#define         BTR1_Rate_5k       0xFF          //5KBPS的预设值

#define         BTR0_Rate_10k      0x31          //10KBPS的预设值
#define         BTR1_Rate_10k      0x1C          //10KBPS的预设值

#define         BTR0_Rate_20k      0x18          //20KBPS的预设值
#define         BTR1_Rate_20k      0x1C         //20KBPS的预设值

#define         BTR0_Rate_40k      0x87          //40KBPS的预设值
#define         BTR1_Rate_40k      0xFF          //40KBPS的预设值

#define         BTR0_Rate_50k      0x47          //50KBPS的预设值
#define         BTR1_Rate_50k      0x2F          //50KBPS的预设值

#define         BTR0_Rate_80k      0x83          //80KBPS的预设值
#define         BTR1_Rate_80k      0xFF          //80KBPS的预设值

#define         BTR0_Rate_100k     0x43          //100KBPS的预设值
#define         BTR1_Rate_100k     0x2f          //100KBPS的预设值

#define         BTR0_Rate_125k     0x03          //125KBPS的预设值
#define         BTR1_Rate_125k     0x1c          //125KBPS的预设值

#define         BTR0_Rate_200k     0x81          //200KBPS的预设值
#define         BTR1_Rate_200k     0xFA          //200KBPS的预设值

#define         BTR0_Rate_250k     0x01          //250KBPS的预设值
#define         BTR1_Rate_250k     0x1c          //250KBPS的预设值

#define         BTR0_Rate_400k     0x80          //400KBPS的预设值
#define         BTR1_Rate_400k     0xfa          //400KBPS的预设值

#define         BTR0_Rate_500k     0x00          //500KBPS的预设值
#define         BTR1_Rate_500k     0x1c          //500KBPS的预设值

#define         BTR0_Rate_666k     0x80          //666KBPS的预设值
#define         BTR1_Rate_666k     0xb6          //666KBPS的预设值

#define         BTR0_Rate_800k     0x00          //800KBPS的预设值
#define         BTR1_Rate_800k     0x16          //800KBPS的预设值

#define         BTR0_Rate_1000k    0x00          //1000KBPS的预设值
#define         BTR1_Rate_1000k    0x14          //1000KBPS的预设值

//BPS
#define         ByteRate_5k        5
#define         ByteRate_10k       10
#define         ByteRate_20k       20
#define         ByteRate_40k       40
#define         ByteRate_50k       50
#define         ByteRate_80k       80
#define         ByteRate_100k      100
#define         ByteRate_125k      125
#define         ByteRate_200k      200
#define         ByteRate_400k      400
#define         ByteRate_500k      500
#define         ByteRate_800k      800
#define         ByteRate_1000k     1000

验收滤波器使用

在这里插入图片描述
简而言之,当AM.bx值为1时,则对应位的ID.bx值为0为1,均不会被过滤掉;当AM.bx值为1时,要求ID.bx等于AC.bx

其他

关于CLKOUT

初始化过程中,进行了如下设置,

CAN_write(0x1f,0xc8);               ///PeliCAN 模式,时钟频率2分频

最初,注释误导了我,认为时钟进行了2分频,则计算波特率是不是要用分频后的时钟,结果发现,CLKOUT与波特率计算无关;并且,0xc8中的0x8是将CLKOUT进行了关闭,而不是注释中的2分频。

测试寄存器

可以通过测试寄存器进行寄存器读写正确与否的验证。

初始化过程中会产生中断

原因不明,待查,暂不影响使用。

扩展帧、标准帧的区分

除了将SJA1000设为PeliCAN之外,未进行专门的扩展帧设置,上位机作为发送扩展帧数据时,能正常接收;下位机进行数据发送时,将识别码中的帧类型标志设为扩展帧,正确设置字节长度,填充数据区字节,即可发送,USB_CAN上位机能进行数据帧类型及数据区的显示。

计算器

网上有些can相关的计算器,能够辅助计算波特率、接收滤波器信息,可以用起来。

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

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

相关文章

最新版edge浏览器中安装xpath插件

最近在跟着尚硅谷进行爬虫的学习,老师给出了在谷歌浏览器安装Xpath插件的方法,由于电脑上面未安装谷歌浏览器,所以在网上搜索了在edge上安装Xpath插件的方法,安装完成以后发现使用快捷键 CTRL SHIFTX不能够打开,以为是…

[java安全]CommonsCollections2

文章目录 【java安全】CommonsCollections2前言Commons-Collections4版本中能否调用cc6等链子?PriorityQueue利用链PriorityQueueTransformingComparator**使用了phithon的总结:**POC 进阶POCPOC分析调用链 【java安全】CommonsCollections2 前言 Apac…

【Flutter问题记录】Android Studio不显示(右上角main.dart左边)设备栏

记录一下今天遇到的情况: 用android studio打开项目,我检查了,已经配置了flutter sdk和android sdk,但是右上角main.dart左边的设备栏就是不显示。 解决方法: 恢复如初:

【密码学】三、分组密码概述

分组密码 1.分组密码简介2.分组密码的基本原理2.1代换2.2扩散2.3混淆 3.分组密码的结构3.1Feistel网络3.1.1平衡Feistel网络3.1.2不平衡Feistel网络 3.2SP网络 4.分组密码的设计 分组密码算法是将输入数据划分成固定长度的组进行加密和解密的一类对称密码算法。本章主要介绍分组…

零基础深度学习——学习笔记1 (逻辑回归)

前言 因为各种各样的原因要开始学习深度学习了,跟着吴恩达老师的深度学习视频,自己总结一些知识点,以及学习中遇到的一些问题,以便记录学习轨迹以及以后复习使用,为了便于自己理解,我会将一些知识点用以个…

MySQL 中NULL和空值的区别

MySQL 中NULL和空值的区别? 简介NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。区别 1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0…

了解 3DS MAX 3D摄像机跟踪设置:第 4 部分

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25,将持续时间设置为 12 秒。单…

Jenkins发送的邮箱中没有带配置的压缩附件

【问题描述】:Jenkins中明明配置了邮箱发送时要带压缩附件,收到的邮箱中却没有附件内容 【问题定位】:压缩附件没有放在Jenkins工作空间下,所以发送的邮件并未发送附件 【解决办法】: 1)把压缩附件放到J…

Scoop安装配置MySQL最详细版(含Navicat连接MySQL)

这是在DataWhale的第一次打卡文章,也是时隔三年再动笔,希望持续下去。 我没想到花费了一整天的时间来配置我的写作环境(TyporaPicGo腾讯云oss),因为我不想我的文字局限在某个平台上,很被动,想要…

如何在小程序首页隐藏商品分类

​因为在分类页面有显示分类,所以有的商家希望在首页就不显示分类啦。下面就介绍一下如何在首页隐藏商品分类。 在小程序管理员后台->页面设置->首页,显示商品分类设置为否。设置后,在小程序首页商品分类就不会显示啦。注意&#xff1a…

手机word文档怎么转换成pdf?分享两种方法

手机word文档怎么转换成pdf?在如今信息化的时代,电子文档已经成为人们日常办公不可或缺的一部分。随着科技的不断进步,电子文档的格式也在不断发展。PDF作为电子文档的一种重要格式,被广泛使用。那么,如何将手机上的Wo…

zabbix通过JMX监控tomcat

目录 1)配置java网关 2)修改tomcat 3)修改tomcat启动脚本 4)启动tomcat 5)Zabbix-web端配置——添加JMX信息 6)导入模板​编辑 7) 为server.zabbix.com添加模板 8)图形如下 9&…

SAP从放弃到入门系列之-5种库存转储测试

​前段时间发了小蜘蛛同学写的《STO 库存转储总结》这篇文章,一直没发测试的示例,4年前写的文章了,今天才从草稿箱翻出来。 文章目录导航 一、Plant to plant 1 step二、Plant to plant 2 steps中转库存(Stock In Transfer&#…

图数据库Neo4j学习二——cypher基本语法

1命名规范 名称应以字母字符开头,不以数字开头,名称不应包含符号,下划线除外可以很长,最多65535( 2^16 - 1) 或65534字符,具体取决于 Neo4j 的版本名称区分大小写。:PERSON和:Person是:person三个不同的标签&#xff…

Unity进阶-ui框架学习笔记

文章目录 Unity进阶-ui框架学习笔记 Unity进阶-ui框架学习笔记 笔记来源课程:https://study.163.com/course/courseMain.htm?courseId1212756805&_trace_c_p_k2_8c8d7393c43b400d89ae94ab037586fc 最上面的管理层(canvas) using System…

数仓学习---12、数仓开发之ADS层

星光下的赶路人star的个人主页 知世故而不世故 是善良的成熟 文章目录 1、数仓开发之ADS层1.1 流量主题1.1.1 各渠道流量统计1.1.2 路径分析 1.2 用户主题1.2.1 用户变动统计1.2.2 用户留存率1.2.3 用户新增活跃统计1.2.4 用户行为漏斗分析1.2.5 新增交易用户统计 1.3 商品主题…

Sentinel 规则持久化到 Nacos

一、Sentinel规则管理模式🍉 Sentinel的控制台规则管理有三种模式: 原始模式🥝 原始模式:控制台配置的规则直接推送到Sentinel客户端,也就是我们的应用。然后保存在内存中,服务重启则丢失 pull模式&#…

【重点:单例模式】特殊类设计

请设计一个类,只能在堆上创建对象 方式如下: 将构造函数设置为私有,防止外部直接调用构造函数在栈上创建对象。向外部提供一个获取对象的static接口,该接口在堆上创建一个对象并返回。将拷贝构造函数设置为私有,并且…

了解 3DS MAX 3D摄像机跟踪设置:第 2 部分

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25,将持续时间设置为 12 秒。单…

该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按”获取所有权(T)”按钮获取它的所有权。否则,请按”取消(C)”按钮以防损坏。

文章目录 一、报错原因二、解决办法 一、报错原因 这是因为虚拟机未被正确关闭导致的问题。因此,在以后使用虚拟机时,我们应该确保正常关闭虚拟机系统,以避免出现这类问题。 二、解决办法 根据提示的配置文件位置,找到虚拟机安…