首页 » 网站建设 » phpcan通信技巧_SPI转can芯片CSM300详解

phpcan通信技巧_SPI转can芯片CSM300详解

访客 2024-11-26 0

扫一扫用手机浏览

文章目录 [+]

外不雅观

CSM300

phpcan通信技巧_SPI转can芯片CSM300详解

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

型号

phpcan通信技巧_SPI转can芯片CSM300详解
(图片来自网络侵删)

如上图所示 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 引脚连接。

SPI 转 CAN 参考电路(CSM300A)

引脚解释:

引脚解释

引脚功能解释如下:

MODE脚直接接高电压(高电平对应SPI模式,低电平对应UART模式);10、11、12外接CAN总线,紧张用于CAN通信;3、6、7、24、19引脚接MCU/MPU,配置CSM300A的模式和读写操作都要依赖这几个引脚;18、21、22、23这4个引脚须要接到MCU/MPU的SPI掌握器引脚,紧张是CPU侧发送配置信息和读写数据的SPI通路;20 是INT引脚,CSM300A收到数据后,知足一定条件就会下拉该引脚,产生中断旗子暗记,关照CPU读取数据。
二、事情模式1. 事情模式分类

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

CSM300(A)事情模式

如上表所示:

如果我们要配置CSM300A,便是要设置CSM300A模式为SPI配置模式,那么就须要将MODE引脚置为1,CFG置为0,RST置为1;如果我们要通过CSM300A读写数据,便是要设置CSM300A模式为SPI转CAN模式,那么就须要将MODE引脚置为1,CFG置为1,RST置为1;读写数据的操作,都属于SPI转CAN模式,不须要切换模式。
若须要切换产品的事情模式,变动引脚电平后,必须对产品进行复位,才能使其进入设 定的事情模式。
须要把稳的是,为担保成功复位, 复位保持韶光最少为 100us,复位后, 产品初始化等待韶光最少 3ms,待产品初始化完成后,才能进行正常操作。

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

事情模式切换时序

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

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

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

SPI 帧 SPI 一次片选有效至片选无效之间的数据定义为一帧数据。
帧与帧之间读写缓冲区数据应有 40us 的韶光间隔。

主机读数据帧

主机写数据帧

3. SPI 配置模式

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

三、主机掌握

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

SPI 模式下主机掌握功能

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

状态码

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

状态字节数据构造

四、反馈机制(中断)

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

CSM300(A)硬件上的 INT 反馈引脚, 此引脚与主机连接,涌现以下两种情形时, INT 引脚会由高电平变成低电平,关照主机进行读数据操作(为避免数据丢失,建议主机利用低 电平触发办法检测):

CAN 缓冲区 CAN 帧数达到设置的触发点时 当产品 CAN 总线端吸收缓冲区吸收到的 CAN 帧数达到触发点时, INT 引脚电平置低, 直到缓冲区清空, INT 引脚才会规复高电平。
用户可以在得到 INT 旗子暗记之后查询 CSM300(A) 的状态,获取可读字节数,然后读取缓冲区 CAN 数据。
CAN 缓冲区数据少于触发帧数,且在设定时间内主机未读取时 CAN 缓冲区有数据但少于触发帧数时,若总线永劫光未有新增数据,且主机未进行读 取操作时, CAN 吸收缓冲区的数据将有可能长期得不到处理, 这就导致数据的实时性不高。
为理解决少量数据的实时性问题, CSM300(A)内部设置了一个计时器,若 CAN 缓冲区的数 据在一定韶光内未被读取, 将触发 INT 引脚置低,关照主机读取数据。
CSM300(A)在吸收 到末了一帧数据时, 计时器启动,主机进行读取操作时复位计时器。
五、组网办法

CAN 总线一样平常利用直线型布线办法,总线节点数可达 110 个。
布线推举利用屏蔽双绞线, CANH、 CANL 与双绞线线芯连接, CGND 与屏蔽层连接,末了屏蔽层单点接地。

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

推举组网示意图

六、移植1. 硬件连接图

硬件连接图

如上图所示:

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

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

2. 设备树

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

csm300@0{pinctrl-names="default";pinctrl-0=<&pinctrl_csm300>;gpios=<&gpio3210/ctl0/&gpio3220/ctl1/&gpio3300/rst/&gpio3310/cfg/>;interrupt-parent=<&gpio3>;interrupts=<26IRQ_LEVEL_LOW>;compatible="zhiyuan,csm300";spi-max-frequency=<500000>;reg=<1>;status="okay";};

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

csm300@0{pinctrl-names="default";gpios=<&gpio1140/ctl0/&gpio1130/ctl1/&gpio760/rst/&gpio1070/cfg/>;interrupt-parent=<&gpio>;interrupts=<196IRQ_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

configCAN_CSM300tristate"MicrochipCSM300driver"dependsonSPI---help---DriverfortheMicrochipCSM300.

实行make menuconfig 驱动位置如下:

menuconfig

选中该驱动:

menuconfig

重新编译内核即可。

把稳:该驱动还须要依赖CAN和SPI,一定要选上 。

4. 增加调试接口

在调试过程中,会有各种缘故原由导致csm300驱动无法注册成功,那如何剖断是spi掌握器驱动有问题,还是csm300驱动有问题呢?

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

增加函数csm300_spi_store()

测试接口

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

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

修正probe函数

structnet_deviceglobal_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;gotoout_free;}……}测试命令 进入csm300模块目录

cd/sys/bus/spi/drivers/csm300产生spi数据

echo3>state拉高RST、 CFG、 CTL0、 CTL1

echo1>state拉低RST、 CFG、 CTL0、 CTL1

echo0>state5. 精确的开机log与波形

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

精确的开机log

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

开机SPI的波形

可以看到数据与我们发送的是同等的。

6. 吸收数据波形图

吸收数据步骤如下:

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

吸收数据流程

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

7. CAN命令

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

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

iplinksetcan0uptypecanbitrate800000

2) 发送数据

cansendcan01F334455#1122334455667788

3) 查看吸收的数据

candumpcan0七、出错记录

调试过程中碰着了很多的缺点,CSM300A定位问题步骤:

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

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

以下是驱动加载出错的log,出错的缘故原由紧张是调用check_csm300()函数向CSM300A写入数据再读取出来后数据不匹配,从而剖断加载出错。

出错log

1. CFG引脚拉低非常

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

剖析: check不堪利,基本上缘故原由是SPI掌握器与CSM300通信出了问题。
首先用示波器,查看SPI发送的数据是否正常到达CSM300(用示波器抓取SSEL、CLK、MOSI),结果是正常的。

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

办理方案:

交给硬件工程师去改。
这兄弟给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采样不到这个电平。

修正方法: 驱动中每次rst操作,都要增加延迟韶光:

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

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

官方资料下载 https://www.zlg.cn/index.php/power/power/product/id/218.html

敬请关注一口Linux

标签:

相关文章