转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记

一口君最近移植了一款SPI转CAN的芯片CSM300A,在这里和大家做个分享。

一、CSM300概述

CSM300(A)系列是一款可以支持 SPI / UART 接口的CAN模块。

1. 简介

CSM300(A)系列隔离 SPI / UART 转 CAN 模块是集成微处理器、 CAN 收发器、 DC-DC 隔离电源、 信号隔离于一体的通信模块, 该芯片可以很方便地嵌入到具有 SPI 或 UART 接口的设备中, 在不需改变原有硬件结构的前提下使设备获得 CAN 通讯接口, 实现 SPI 设备或 UART 设备和 CAN 总线网络之间的数据通讯。

外观

6f480566735bb0ebd211771273dcfe5f.png
CSM300

2. 参数

  1. 实现 SPI 或 UART 与 CAN 接口的双向数据通信;
  2. CAN 总线符合“ISO 11898-2”标准;
  3. 集成 1 路 SPI 接口, 支持用户自定义的速率, 最高可达 1.5Mbit/s(非自定义协议转换) ,或 1Mbit/s(自定义协议转换) ;
  4. 集成 1 路 UART 接口, 支持多种速率, 最高可达 921600bps;
  5. 集成 1 路 CAN 通讯接口, 支持多种波特率, 最高可达 1Mbps;
  6. 隔离耐压 2500VDC;
  7. 工作温度:-40℃~+85℃;
  8. 电磁辐射 EME 较低;
  9. 电磁抗干扰 EMS 较高;
a03d576a803bac9d6299879e285bfafc.png
型号

如上图所示 CSM300是5V工作电压,CSM300A是3.3V工作电压。

如果MCU、MPU侧工作电压不是1.8V那么就需要增加一个level shift来进行电压转换。

此次调试的板子使用的是CSM300A,只使用其中的SPI接口。

可以在如下搜索框中搜索需要的内容:

3. 引脚定义及参考电路

使用SPI转CAN功能时, 需要将MODE引脚接至高电平。MCU的SPI接口与CSM300(A)的 SPI 接口连接,同时 MCU 需要提供 GPIO 与 RST、 INT、 CTL0、 CTL1 引脚连接,实现对 CSM300(A)的有效监测与控制。若需要通过 MCU 对CSM300(A)进行配置,则需要额外的 GPIO 与 CFG 引脚连接。

4998832c19073b9dd3f38ed47393bba2.png
SPI 转 CAN 参考电路(CSM300A)

引脚说明:

4283fdc77b8e7978f3f54e4657fc2396.png
引脚说明

引脚功能说明如下:

  1. MODE脚直接接高电压(高电平对应SPI模式,低电平对应UART模式);
  2. 10、11、12外接CAN总线,主要用于CAN通信;
  3. 3、6、7、24、19引脚接MCU/MPU,配置CSM300A的模式和读写操作都要依靠这几个引脚;
  4. 18、21、22、23这4个引脚需要接到MCU/MPU的SPI控制器引脚,主要是CPU侧发送配置信息和读写数据的SPI通路;
  5. 20 是INT引脚,CSM300A收到数据后,满足一定条件就会下拉该引脚,产生中断信号,通知CPU读取数据。

二、工作模式

1. 工作模式分类

CSM300(A)上电后, MODE、 CFG 引脚电平会决定产品处于 4 种不同的工作模式的其中一种:SPI 转 CAN 模式、 UART 转 CAN 模式、 SPI 配置模式、 UART 配置模式。

90ec7e4edd57a83b65caa97e87e5a710.png
CSM300(A)工作模式

如上表所示:

  1. 如果我们要配置CSM300A,就是要设置CSM300A模式为SPI配置模式,那么就需要将MODE引脚置为1,CFG置为0,RST置为1;
  2. 如果我们要通过CSM300A读写数据,就是要设置CSM300A模式为SPI转CAN模式,那么就需要将MODE引脚置为1,CFG置为1,RST置为1;
  3. 读写数据的操作,都属于SPI转CAN模式,不需要切换模式。
  4. 若需要切换产品的工作模式,更改引脚电平后,必须对产品进行复位,才能使其进入设 定的工作模式。需要注意的是,为保证成功复位, 复位保持时间最少为 100us,复位后, 产品初始化等待时间最少 3ms,待产品初始化完成后,才能进行正常操作。

下图是不同模式切换的时序图。

034263f02fb339736a197e76f947be37.png
工作模式切换时序

2. SPI 转 CAN 模式(数据读写)

在此工作模式下, CSM300(A)始终作为 SPI 从机, SPI 限定工作在模式 3(CPOL、 CPHA 均为 1),数据长度限定为 8 位, MSB 高位先传输。透明转换、透明带标识转换下最高通信 速率为 1.5Mbps,自定义协议转换最高通信速率为 1Mbps。

SPI 主机可以发送数据至 CAN 总线端, 且可接收 CAN 总线端收到的数据。此时 UART 接口无效,不会处理任何出现在 UART 接口的数据,也不会返回 CAN 总线端接收到的数据 至 UART。

  1. SPI 帧 SPI 一次片选有效至片选无效之间的数据定义为一帧数据。帧与帧之间读写缓冲区数据应有 40us 的时间间隔。
ac8d68d87969072692dd228eec72ca1e.png
主机读数据帧
b70266ccf00ea5e9f33ac2bf12014cd1.png
主机写数据帧

3. SPI 配置模式

在此模式下, CSM300(A)处于等待配置状态, 无法向 CAN 端发送或接收数据。此模式下仅能通过 SPI 接口进行配置。

三、主机控制

CSM300(A)有两个 SPI 主机控制引脚 CTL0, CTL1, 受主机端控制。主机通过控制 CTL0, CTL1 引脚, 使 CSM300(A)进入不同的功能状态,实现对 CSM300(A)不同操作目的。主机端控制引脚电平不同对应功能如下表所示:

7b68bdffdd705360adb69ce697c1e9fd.png
SPI 模式下主机控制功能

主机可以通过读从机当前状态来获取产品当前可以读取的字节数以及可以写入的字节 数。主机将功能选择为主机读状态,然后通过 SPI 读出 4 个字节,即为状态码。状态码由 32 个位构成,具体定义如下表所示。

fda13e621af52cdd96e97165a6cd3bde.png
状态码

若定义 status[]数组为 8 位整型, 通过 SPI 读状态依次读出的数据为 status[0]、 status[1]、 status[2]、 status[3],则其数据结构如下图:

d07fffc0d5b935914120a4a3e771ed52.png
状态字节数据结构

四、反馈机制(中断)

CSM300(A)只能作为 SPI 从机,不能主动地控制其他 SPI 总线设备,所以如果接收CAN数据帧之后,必须主动返回给CPU侧。

CSM300(A)硬件上的 INT 反馈引脚, 此引脚与主机连接,出现以下两种情况时, INT 引脚会由高电平变成低电平,通知主机进行读数据操作(为避免数据丢失,建议主机使用低 电平触发方式检测):

  1. CAN 缓冲区 CAN 帧数达到设置的触发点时 当产品 CAN 总线端接收缓冲区接收到的 CAN 帧数达到触发点时, INT 引脚电平置低, 直到缓冲区清空, INT 引脚才会恢复高电平。用户可以在获得 INT 信号之后查询 CSM300(A) 的状态,获取可读字节数,然后读取缓冲区 CAN 数据。

  2. CAN 缓冲区数据少于触发帧数,且在设定时间内主机未读取时 CAN 缓冲区有数据但少于触发帧数时,若总线长时间未有新增数据,且主机未进行读 取操作时, CAN 接收缓冲区的数据将有可能长期得不到处理, 这就导致数据的实时性不高。为了解决少量数据的实时性问题, CSM300(A)内部设置了一个计时器,若 CAN 缓冲区的数 据在一定时间内未被读取, 将触发 INT 引脚置低,通知主机读取数据。CSM300(A)在接收 到最后一帧数据时, 计时器启动,主机进行读取操作时复位计时器。

五、组网方式

CAN 总线一般使用直线型布线方式,总线节点数可达 110 个。布线推荐使用屏蔽双绞线, CANH、 CANL 与双绞线线芯连接, CGND 与屏蔽层连接,最后屏蔽层单点接地。

得益于 CSM300(A)的最低波特率 5kbps,总线的最长通信距离可达 10km。

23962dc7f5b70b8adaa7e505835e3180.png
推荐组网示意图

六、移植

1. 硬件连接图

e259424d17428384bc8f6454af0383ad.png
硬件连接图

如上图所示:

  1. SOC上已经集成了SPI控制器,厂家的sdk已经包含了spi控制器的设备树和驱动信息;
  2. SOC的SPI控制器引脚需要先连接level shift进行升压,板子电压是1.8V,而CSM300要求电压是3.3V;
  3. SOC的GPIO 76/107/113/114通过level shift分别连接CSM300A的RST/CFG/CTL1/CTL0;
  4. 在PC上运行CAN-Test软件,可以通过USB转CAN设备从CAN总线上读取和发送数据。

【注】USB转CAN设备,可以自行搜索,杜绝广告。

2. 设备树

以下是官方提供的设备树:

csm300@0 {
 pinctrl-names = "default";
 pinctrl-0 =;
 gpios=21 0    /*ctl0*/
  &gpio3 22 0 /*ctl1*/
  &gpio3 30 0 /*rst*/
  &gpio3 31 0 /*cfg*/
 >;
 interrupt-parent = ;
 interrupts = <26 IRQ_LEVEL_LOW>;
 compatible = "zhiyuan,csm300";
 spi-max-frequency = <500000>;
 reg = <1>;
 status = "okay";
};

以下是根据自己的平台修改的结果,读者移植的时候需要根据自己的平台来移植,不可教条。

csm300@0 {
 pinctrl-names = "default";
 gpios=114 0    /*ctl0*/
  &gpio 113 0 /*ctl1*/
  &gpio 76 0 /*rst*/
  &gpio 107 0 /*cfg*/
 >;
 interrupt-parent = ;
 interrupts = <196 IRQ_LEVEL_LOW>;
 compatible = "zhiyuan,csm300";
 spi-max-frequency = <500000>;
 reg = <0>;
 status = "okay";
};

3. 驱动

官方会提供驱动程序csm300.c,具体实际原理,本篇暂不讨论。

拷贝到以下目录:

drivers/net/can/spi

修改本级目录下的Makefile

 obj-$(CONFIG_CAN_CSM300) += csm300.o

修改本级目录下的Kconfig

config CAN_CSM300
 tristate "Microchip CSM300 driver"
 depends on SPI 
 ---help---
   Driver for the Microchip CSM300  .

执行make menuconfig 驱动位置如下:c660ef56af5100c6ec1f2e3cfdaa07c5.png

选中该驱动:

4f44a2aadc447fbdfdba13b69bfc9b7f.png
menuconfig

重新编译内核即可。

注意:该驱动还需要依赖CAN和SPI,一定要选上 。

4. 增加调试接口

在调试过程中,会有各种原因导致csm300驱动无法注册成功,那如何判定是spi控制器驱动有问题,还是csm300驱动有问题呢?

为了方便通过spi控制器发送出波形,我们增加以下代码,用于在板子目录/sys/bus/spi/drivers/csm300中创建state文件节点,通过写入不同的值来产生spi数据,或者控制RST、 CFG、 CTL0、 CTL1这4个引脚。

  1. 增加函数csm300_spi_store()
228b11361b794aed39619d0305449970.png
测试接口

重点说明一下函数**check_csm300()**是驱动自带的用于测试CSM300的SPI通信功能的函数。

该函数会先将CSM300A设置为SPI配置模式,然后写入9个数据,然后再读取出数据,进行校验数据是否正确。

  1. 修改probe函数
struct net_device *global_net = NULL ;
csm_probe()
{
 ……
 global_net = net;
 ret = check_csm300(net);
 ……
 ret = driver_create_file(&(csm300_can_driver.driver),&driver_attr_state);if(ret 0){
  ret = -ENOENT;
  goto out_free;
 }
 ……
}
  1. 测试命令 进入csm300模块目录
cd /sys/bus/spi/drivers/csm300
  1. 产生spi数据
echo 3 > state
  1. 拉高RST、 CFG、 CTL0、 CTL1
echo 1 > state
  1. 拉低RST、 CFG、 CTL0、 CTL1
echo 0 > state

5. 正确的开机log与波形

开机后驱动会调用check_csm300()来测试spi通道,发送的数据为F7:F8:02……

568cefd38a399ff2f436a358bd62a7ce.png
正确的开机log

以下为SPI接口的CLK和MOSI引脚的波形:

d138e0ef17fdc7bbcc7b43fe146649e8.png
开机SPI的波形

可以看到数据与我们发送的是一致的。

6. 接收数据波形图

接收数据步骤如下:

  1. 运行于PC上的CAN Test 软件发送数据 00 01 02 03 04 05 06 07,
  2. 经过USB转CAN设备后,转换成了差分信号,
  3. 到达CSM300A之后,信号被调制成矩形方波,
  4. CSM300A通过拉低引脚INT向cpu发送中断信号,调用CSM300A注册的中断函数,
  5. 运行于CPU上的CSM300A中断程序通过SPI接口读走CSM300A上的数据,
  6. CSM300A缓冲区数据被读走后,拉高INT,
  7. 驱动程序将接收到的数据上传给应用层,于是candump命令得到了CAN帧的数据。
6f6ad321c16facc7ea44713326df94d4.png
接收数据流程

数据发送过程和上述过程类似。

7. CAN命令

如果文件系统中没有can命令,需要自行移植。

1) 设置波特率并开启can0口

ip link set can0 up type can bitrate 800000

2) 发送数据

cansend can0 1F334455#1122334455667788

3) 查看接收的数据

candump can0

七、出错记录

调试过程中遇到了很多的错误,CSM300A定位问题步骤:

  1. 首先用示波器测试CSM300的MOSI引脚的波形,是不是和第七章第5节的波形一致,如果不一致,说明SPI控制器驱动加载不正确;
  2. 要通过SPI控制器产生数据,使用命令echo 3 > state;
  3. 如果波形一致,就测量RST、 CFG、 CTL0、 CTL1这四个引脚,查看电平是否正确;
  4. RST、 CFG、 CTL0、 CTL1控制是否正确,可以用echo 0 > state、echo 1 > state分别拉低拉高,查看对这几个引脚的控制是否正常。

基本上照着这个思路去调试很快就能定位到问题。

以下是驱动加载出错的log,出错的原因主要是调用check_csm300()函数向CSM300A写入数据再读取出来后数据不匹配,从而判定加载出错。

a5210dd8228b88d84d16fee674f89f21.png
出错log

1. CFG引脚拉低异常

现象:check_csm300()函数始终报错。

分析:check不成功,基本上原因是SPI控制器与CSM300通信出了问题。首先用示波器,查看SPI发送的数据是否正常到达CSM300(用示波器抓取SSEL、CLK、MOSI),结果是正常的。

于是检测检测 RST、 CFG、 CTL0、 CTL1四个引脚。如下图所示,使用echo 0 > state 拉低CFG引脚,发现没有拉到0V。

4cca294bad7b72345dee58b0337715bb.png
在这里插入图片描述

解决方案:

交给硬件工程师去改。这兄弟给CFG加了一个反向电阻,驱动部分需要将所有设置CFG的代码,全部反置。

gpio_set_value(priv->CFG,0);
修改成
gpio_set_value(priv->RST,1);
gpio_set_value(priv->CFG,1);
修改成
gpio_set_value(priv->RST,0);

2. RST 延时不够

现象:echo 0 > state 可以拉低,测量也是正确的,但是CSM300始终无法接收到数据帧。

分析:一般数据接收不到,有两种可能:就是CSM300给出的中断信号CPU没有截取到,CSM300没有处于SPI转CAN模式。

先用示波器确定了,USB转CAN的数据已经成功到达CSM300,于是检测对应的引脚电平 RST、 CFG、 CTL0、 CTL1,发现也是对的。

检查中断计数,用cat /proc/interrupts查看CSM300是否有中断计数,结果发现数据为0。

怀疑CSM300没有rst成功,于是执行echo 3 > state,查看rst是否正确设置,结果发现以下波形,确定了该引脚拉高比较缓慢,所以CSM300采样不到这个电平。

f28f9a649807f329530fdeb0dd3662df.png
在这里插入图片描述

修改方法:驱动中每次rst操作,都要增加延迟时间:

gpio_set_value(priv->RST,0);
usleep_range(2000,2300);
gpio_set_value(priv->RST,1);

修改后,执行echo 3 > state,RST波形如下所示。

4cd08ed43340ba72568faccd242350bf.png
在这里插入图片描述

10a8d09a729dd7f0b4b27972cd82611b.png

【1】CAN总线是如何通讯的?【2】什么是LIN总线?高速CAN、容错CAN、LIN总线有什么区别?【3】CAN接口典型电路分析及应用【4】CAN总线通讯,如何处理GND【5】CAN总线通信典型电路(带隔离)【6】SPI编程时,时钟相位(CPHA)和时钟极性(CPOL)怎么理解?

26abf6557ed69e0dd8cdf0e4174b0747.png

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

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

相关文章

matlab练习程序(二值图像连通区域标记法,一步法)

这个只需要遍历一次图像就能够完全标记了。我主要参考了WIKI和这位兄弟的博客&#xff0c;这两个把原理基本上该介绍的都介绍过了&#xff0c;我也不多说什么了。一步法代码相比两步法真是清晰又好看&#xff0c;似乎真的比两步法要好很多。 代码如下&#xff1a; clear all; c…

pc微信不支持flash_在出售PC之前,如何取消对Flash内容的授权

pc微信不支持flashWhen it comes to selling your old digital equipment you usually should wipe it of all digital traces with something like DBAN, however if you can’t there are some precautions you should take–here’s one related to Flash content you may h…

绘制三维散点图_SPSS统计作图教程:三维散点图

作者&#xff1a;豆沙包&#xff1b;审稿&#xff1a;张耀文1、问题与数据最大携氧能力是身体健康的一项重要指标&#xff0c;但检测该指标成本较高。研究者想根据性别、年龄、体重、运动后心率等指标建立预测最大携氧能力的模型&#xff0c;招募了100名研究对象&#xff0c;测…

使用lodash防抖_什么,lodash 的防抖失效了?

戳蓝字「前端技术优选」关注我们哦&#xff01;作者&#xff1a;yeyan1996https://juejin.im/post/6892577964458770445应某人的要求被迫营业&#xff0c;望各位看官不要吝啬手中的赞-。-背景在使用 uni-app 开发小程序时&#xff0c;有个填写表单的需求&#xff0c;包含两个输…

Ubuntu 12.10中的8个新功能,Quantal Quetzal

Ubuntu 12.10 has been released and you can download it now. From better integration with web apps and online services to improvements in Unity, there are quite a few changes – although none of them are huge or groundbreaking. Ubuntu 12.10已发布&#xff0c…

背单词APP调研分析

前言&#xff1a;随着我国网络经济重心向移动端的转移&#xff0c;移动教育领域获得的关注度在持续放大。互联网的发展和移动设备的普及&#xff0c;我们开始在移动设备上学习&#xff0c;各种学习教育软件如雨后春笋&#xff0c;越来越多&#xff0c;就背单词软件来说&#xf…

cdh中使用hue使用教程_我可以在户外使用Philips Hue灯泡吗?

cdh中使用hue使用教程Philips Hue lights are great to have in your house, and they can add a lot of convenience to your living space. However, what if you want to use these smart bulbs outdoors in porch lights or flood lights? Will Philips Hue bulbs work pr…

弄断过河电缆_你说的是:剪断电缆线

弄断过河电缆Earlier this week we asked you if you’d cut the cable and switched to alternate media sources to get your movie and TV fix. You responded and we’re back with a What You Said roundup. 本周早些时候&#xff0c;我们问您是否要切断电缆并切换到其他媒…

路由销毁上一页_路由器原理(数据通信)

路由&#xff1a;对数据包选择路径的过程路由器(也叫网关)智能选择数据传输路由的设备&#xff0c;其端口数量较少&#xff01;功能&#xff1a;连接网络1.连接异构网络以太网、ATM网络、FDDI网络2.连接远程网络局域网、广域网隔离广播将广播隔离在局域网内路由选择网络安全地址…

您可能没有使用的最佳三星Galaxy功能

Samsung packs its flagship phones with a slew of features—some are even better than stock Android. Either way, there are a lot of things on these phones that you may not be using. Here are some of the best. 包三星旗舰手机用的特性-摆有的甚至比普通的Android…

win7更新错误0x800b0109_win7更新漏洞后产生0x0000006B蓝屏的解决方法图解

这几天不少网友在使用win7更新补丁后就蓝屏了&#xff0c;代码为0x0000006b。发生这一蓝屏问题的都是安装了2016年四月份推出的安全更新补丁&#xff0c;安装后就出现蓝屏&#xff0c;有的网友表示没问题&#xff0c;有的直接蓝了。这个蓝屏重启后依旧&#xff0c;安全模式进不…

如何使用facebook_如果每个人都已经开始使用Facebook,Facebook能否继续发展?

如何使用facebookThere are only so many people on earth, and so many hours in the day. Is that starting to limit the growth of social media? 地球上只有那么多人&#xff0c;一天中有很多小时。 这是否开始限制社交媒体的增长&#xff1f; Think about how much time…

2018-10-03-Python全栈开发-day60-django序列化-part3

联合唯一 clean_字段方法只能对某个字段进行检查&#xff0c;当clean方法执行完之后&#xff0c;最后还会执行clean方法&#xff0c;在clean方法中&#xff0c;可以通过获取数据字典中的值然后进行验证 from django.shortcuts import render,HttpResponsefrom django import fo…

mac按文件名查找文件_如何在Mac上查找和删除大文件

mac按文件名查找文件Freeing up disk space on a full hard drive can be difficult, especially when it’s full of small files. However, there are some excellent tools for macOS that let you find the files taking up the most space and delete the ones you don’t…

dmg是什么文件格式_什么是DMG文件(以及我该如何使用)?

dmg是什么文件格式DMG files are containers for apps in macOS. You open them, drag the app to your Applications folder, and then eject them, saving you the hassle of the dreaded “Install Wizard” of most Windows apps. So if all they are is a folder for an a…

mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...

情况描述&#xff1a;在MySQL的user表中&#xff0c;对a,b,c三个字段建立联合索引&#xff0c;那么查询时使用其中的2个作为查询条件&#xff0c;是否还会走索引&#xff1f;根据查询字段的位置不同来决定&#xff0c;如查询a, a,b a,b,c a,c 都可以走索引的&#…

canon相机api中文_您应该在佳能相机上掌握的10种相机设置

canon相机api中文Your camera is a tool, and you should be able to use it with total confidence. You should never have to dig through the manual or play around with random buttons trying to work out how to do something on a shoot. Here are the most important…

spring-boot基础概念与简单应用

1.spring家族 2.应用开发模式 2.1单体式应用 2.2微服务架构 微服务架构中每个服务都可以有自己的数据库 3.微服务架构应当注意的细节 3.1关于"持续集成,持续交付,持续部署" 频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分 可行方案(如…

邮箱客户端 gmail支持_如何联系Gmail支持

邮箱客户端 gmail支持Although you may not be able to directly contact Gmail support without subscribing to G Suite for businesses, there are a couple of ways to get the answers you’re looking for online. Let’s look at how you can get help with your Gmail …

jstorm mysql_zookeeper,kafka,jstorm,memcached,mysql流式数据处理平台部署

一&#xff0e;平台环境介绍:1&#xff0e;系统信息&#xff1a;项目信息系统版本:Ubuntu14.04.2 LTS \n \l用户&#xff1a;*****密码&#xff1a;******Java环境&#xff1a;openjdk-7-jre语言&#xff1a;en_US.UTF-8&#xff0c;en_US:en磁盘&#xff1a;每台vda为系统盘(5…