1、can物理层和协议层can与串口类似,都是异步通信,利用两根差分线来进行信号的传输。在多节点进行数据传输时主要分为遵循iso11898标准的高速短距离闭环形式和遵循iso11519标准的低速远距离开环网络。这两种形式主要是在硬件设计时根据实际应用情况加入120欧姆或者2.2千欧姆电阻。在can通信时信号逻辑和平时常用的电平表示不太一样,根据标准电平表示形式如下图:can报文类型有5种,分别是数据帧、遥控帧、错误帧、过载帧、帧间隔。而我们常用的是数据帧,数据帧分为标准数据帧和扩展数据帧两种。数据帧结构如下图:数据帧是以一个下降沿的电平来开始界定开始的。以7个连续隐性电平结束的。数据帧中间包含帧起始、仲裁段、控制段、数据段、crc段、ack段和帧结束段。帧起始sof段(start of frame),帧起始信号只有一个数据位,是一个显性电平,它用于监测数据传输的开始,通过电平跳变沿来进行数据起始位的确定。仲裁段:内容是数据帧的id信息,标准帧id长度是11位,扩展帧为18位。can 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由帧的id决定的,对于重要信息给与一个优先级较高的id,这样数据就能及时的发送出去。而id优先级的仲裁原则是由物理层决定的,总线状态总是显性电平掩盖隐形电平,因此显性id优先级较高。仲裁段还包括(1)rtr 位(remote transmission request bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。(2) ide 位(identifier extension bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。(3) srr 位(substitute remote request bit),只存在于扩展格式,它用于替代标准格式中的rtr 位。由于扩展帧中的srr 位为隐性位,rtr 在数据帧为显性位,所以在两个id相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。控制段:在控制段中的r1 和r0 为保留位,默认设置为显性位。它最主要的是dlc 段(datalength code),译为数据长度码,它由4 个数据位组成,用于表示本报文中的数据段含有多少个字节,dlc 段表示的数字为0~8。数据段:数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8 个字节组成,msb先行。crc 段:为了保证报文的正确传输,can 的报文包含了一段15 位的crc 校验码,一旦接收节点算出的crc 码跟接收到的crc 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。crc 部分的计算一般由can 控制器硬件完成,出错时的处理则由软件控制最大重发数。ack 段:ack 段包括一个ack 槽位,和ack 界定符位。类似i2c 总线,在ack 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ack 槽和帧结束之间由ack 界定符间隔开。帧结束eof 段(end of frame),帧结束段由发送节点发送的7 个隐性位表示结束。 2、传输的波特率can由于是异步通信,通信波特率与串口波特率定义类似,波特率的定义有每个子的长度来确定的。can的通信距离与波特率存在负相关关系,波特率越高,传输距离越短。can通信波特率与传输距离关系如下图:3、fpga实现思路在进行fpga实现时主要是实现一个完备的状态转移状态机。在设计状态机时需要对最复杂的包格式进行设计。通过对控制段进行判断来跳转到不同类型帧格式的状态,根据数据长度来完成对数据的接收和发送。由于fpga实现完备的can收发驱动并不是所有项目所必须的,因此根据不同项目来进行特定包数据的收发。通过上面描述对can数据格式有了一个基本上认识,下面是通过示波器抓取can标准数据帧波形,示波器正连接canh端,示波器负极连接canl端。波特率是10kbps,有效数据长度8字节。 can数据收发架构设计如下图: 4、fpga实现代码在实现波特率可调的数据收发控制时需要注意的是每个波特数据的采样点。can数据采样时序如下图所示,一般采样点都是在数据稳当的中间点位置,因此在设计fpga中can模块的时钟频率应当是数据波特率的20倍。在以10kbps采样率位例,can收发模块时钟设计如下: ////数据速率位10kbps,一个数据位时间为10us.数据采集在5us时刻。can波特率设置reg[7:0]can_div;//500倍分频,一个数据位分为20份regcan_clk; always @(posedge clk_100m or negedge rst_n )beginif(rst_n==1'b0) begincan_div<= 'b0;end else if (can_div==249) begincan_div<= 'b0;endelse begin can_div<= can_div + 1'b1;endend
always @(posedge clk_100m or negedge rst_n )beginif(rst_n==1'b0) begincan_clk<= 'b0;end else if (can_div==249) begincan_clk<= can_clk + 1'b1;endend //时钟经过bufg缓冲wirecan_clk_o; bufg can_clk_obuf (.i(can_clk), .o(can_clk_o));
数据的收发需要根据实际的项目情况进行组包控制,这里就不进行细致描述了。can实现数据的收发两个过程中对应fpga来说由于接收相对复杂,就以接收模块进行描述。数据的接收过程就按照一般的状态机进行设计就行,需要注意的是不同类型帧的跳转是在控制段进行了,因此在控制段会发生状态的跳转。can接收状态的状态机实现如下图: 这个状态机的实现并不复杂,主要是对帧类型进行判断。然后根据数据长度把数据解析出来。下面是实现can数据接收代码: `timescale 1ns / 1ps//// company: // engineer: // // create date: // design name: // module name: can_rx // project name: // target devices: // tool versions: // description: //// dependencies: //// revision: // revision 0.01 - file created// additional comments: ////module can_rx( input wire can_clk ,input wire rst_n ,
inputwirecan_rx,
outputregcan_ack_out_low,outputregcan_id_out_en,outputreg[10:0]can_id_out,outputregcan_data_out_en,outputreg[63:0]can_data_out
);
iphone8什么时候上市?iphone8即将发布:苹果在中国业绩继续下滑,iPhone8能否挽回局势?
7015:带有6.25Gbps SerDes收发器和PCIe Gen2接口的低端Zynq Soc
数据仓库开发技术的重要一环:ETL
高精度授时如何改变5G基础设施游戏规则
电池跌落试验机出现故障的处理方法-贝尔试验箱
基于FPGA实现CAN通信的设计方案
88E1510-A0-NNB2C000以太网 IC Marwell
广电总局整治违规视听网站,对“快手”“抖音”“今日头条“深入整改
MH481线性霍尔传感器的伺服电机系统设计
工业RFID技术在产线管理起到的作用和重要性
佳歌集成灶荣获权威媒体新浪家居双料大奖!
基于Linux的中频磁场测量系统
细节决定成败,PCB layout工程师的7个好习惯
场效应管的检测与测量
4美元的微控制器Pico与RP2040芯片
LCD液晶拼接与DLP背投及PDP等离子技术对比
面向制造的线束设计分析(DFM分析)
C2000芯片怎么给一个连续的RAM区间赋初值
基于RapidIO互连构架实现双主机节点通信系统的设计
越南疫情爆发,三星、英特尔、日本电产等大厂停工