1. can协议
1.1 can协议简介
can是是国际上应用最广泛的现场总线之一。
最终成为国际标准(iso11519以及iso11898),差异点如下:
1.2 can物理层
can通讯不是以时钟信号来进行同步的,它是一种异步通讯,只具有can_high和 can_low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。can 物理层的形式主要有两种:
遵循iso11898标准的高速、短距离闭环网络,总线最大长度为40m,通信速度最高为 1mbps,总线的两端各要求有一个120欧的电阻
是遵循iso11519-2标准的低速、远距离开环网络,最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2千欧的电阻
以tja1050芯片作为can收发器的电路原理图如下图示。
差分信号又称差模信号,差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑0和逻辑1,can中显性电平(差值为正)对应逻辑0,隐性电平(差值小于或等于0)对应逻辑1,显性电平比隐性电平更强。
1.3 can协议层
can属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,can使用位同步的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
位时序分解:
为了实现位同步,can协议把每一个数据位的时序分解成ss段、pts段、pbs1段、pbs2段,这四段的长度加起来即为一个can数据位的长度。分解后最小的时间单位是tq,一个完整的位由8~25个tq组成。
波特率:
总线上的各个通讯节点只要约定好1个tq的时间长度以及每一个数据位占据多少个tq,就可以确定can通讯的波特率。
例如,假设上图中的 1tq=1us,而每个数据位由 19 个 tq 组成,则传输一位数据需要时间 t1bit=19us,从而每秒可以传输的数据位个数为:1x10次方/19 = 52631.6 (bps)。这个每秒可传输的数据位的个数即为通讯中的波特率。
同步过程:
波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,此时就要用到数据位内的ss、pts、pbs1及pbs2段了。根据对段的应用方式差异, can的数据同步分为硬同步和重新同步。其中硬同步只是当存在帧起始信号时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题。
硬同步:
can节点通过总线发送数据时,会发送一个帧起始信号。而挂载到can总线上的节点在不发送数据时,会时刻检测总线上的信号。如下图,当总线出现帧起始信号时,节点检测到总线的帧起始信号不在节点内部时序的 ss 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的 ss 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。
重新同步:
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步。与硬同步方式相似的是它们都使用 ss 段来进行检测,同步的目的都是使节点内的 ss 段把跳变沿包含起来。重新同步分为超前和滞后两种情况,以总线跳变沿与 ss 段的相对位置进行区分。
-- 相位超前:
节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前 2tq,这时控制器在下一个位时序中的 pbs1 段增加 2tq 的时间长度,使得节点与总线时序重新同步
-- 相位滞后:
节点从总线的边沿跳变中,检测到它的时序比总线的时序相对滞后 2tq,这时控制器在前一个位时序中的 pbs2 段减少 2tq 的时间长度,获得同步
报文种类及结构:
对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。can一共规定了5种类型的帧。
数据帧的结构:数据帧是在can通讯中最主要、最复杂的报文,它的结构如下图。
其他报文结构:
2. can控制器
stm32 的芯片中具有bxcan控制器,支持can协议2.0a和2.0b标准。该can控制器支持最高的通讯速率为1mb/s;可以自动地接收和发送can报文,支持使用标准id和扩展id的报文;外设中有3个发送邮箱,发送报文的优先级可以使用软件控制,还可记录发送的时间;有2个3级深度的接收fifo,可使用过滤功能只接收或不接收某些id号的报文;可配置成自动重发;不支持使用dma进行数据收发。框架示意图如下:
stm32有两组can控制器,其中can1是主设备,框图中的存储访问控制器是由can1控制的,can2无法直接访问存储区域,所以使用can2的时候必须使能can1外设的时钟。框图中主要包含can控制内核、发送邮箱、接收fifo以及验收筛选器,下面对框图中的各个部分进行介绍。
2.1 can控制内核
主控寄存器can_mcr:
负责管理can的工作模式。
inrq位:用来控制初始化请求,在can初始化时,先设置该位为1,进行初始化,之后再设置该位为0,让can进入正常工作模式。
位时序寄存器can_btr:
用于配置测试模式、波特率以及各种位内的段参数。
= can波特率的计算公式= :
只需要知道bs1和bs2的设置,以及apb1的时钟频率,就可以方便的计算出波特率。比如设置ts1=9、ts2=5和brp=6,在apb1频率为45mhz的条件下,即可得到can通信的波特率=45000/6/(5+9+1)=500kbps。
2.2 can发送邮箱
can 共有3个发送邮箱,即最多可以缓存3个待发送的报文。每个发送邮箱中包含有标识符寄存器can_tixr、数据长度控制寄存器can_tdtxr及2个数据寄存器can_tdlxr、can_tdhxr,如下图。
当使用can外设发送报文时,需要把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器can_tixr中的发送请求寄存器位tmidxr_txrq置1,即可把数据发送出去。其中标识符寄存器can_tixr中的stdid寄存器位比较特别。我们知道can的标准标识符的总位数为11位,而扩展标识符的总位数为29位的。当报文使用扩展标识符的时候,标识符寄存器can_tixr中的stdid[10:0]等效于extid[18:28]位,它与extid[17:0]共同组成完整的29位扩展标识符。
发送邮箱标识符寄存器can_tixr:
发送邮箱数据长度和时间戳寄存器can_tdtxr:
发送邮箱低字节数据寄存器can_tdlxr:
发送邮箱高字节数据寄存器can_tdhxr:
2.3 can接收fifo
can 共有2个接收fifo,每个fifo中有3个邮箱,即最多可以缓存6个接收到的报文。当接收到报文时,fifo的报文计数器会自增,而stm32内部读取fifo数据之后,报文计数器会自减,通过状态寄存器可获知报文计数器的值,而通过前面主控制寄存器的rflm位,可设置锁定模式,锁定模式下fifo溢出时会丢弃新报文,非锁定模式下fifo溢出时新报文会覆盖旧报文。跟发送邮箱类似,每个接收fifo中包含有标识符寄存器can_rixr、数据长度控制寄存器can_rdtxr及2个数据寄存器can_rdlxr、can_rdhxr,它们的功能见下表。
通过中断或状态寄存器知道接收fifo有数据后,我们再读取这些寄存器的值即可把接收到的报文加载到stm32的内存中
接收fifo邮箱标识符寄存器can_rixr:
接收fifo邮箱数据长度和时间戳寄存器can_rdtxr:
接收fifo邮箱低字节数据寄存器can_rdlxr:
接收fifo邮箱高字节数据寄存器can_rdhxr:
2.4 can验收筛选器
an 验收筛选器,共有28个筛选器组,每个筛选器组有2个寄存器,can1和can2 共用筛选器。can协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,为了简化软件的工作,stm32的can外设接收报文前会先使用验收筛选器检查,只接收需要的报文到fifo中。筛选器工作的时候,可以调整筛选id的长度及过滤模式。
根据筛选id长度来分类有有以下两种:
检查 stdid[10:0]、extid[17:0]、ide 和 rtr 位,共 31 位
检查 stdid[10:0]、rtr、ide 和 extid[17:15],共 16 位
根据过滤的方法分为以下两种模式:
标识符列表模式,它把要接收报文的 id 列成一个表,要求报文 id 与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
掩码模式,它把可接收报文 id 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码 (关键字) 相同,就符合要求,报文就会被保存到接收 fifo
通过配置筛选模式寄存器can_fm1r的fbmx位可以设置筛选器工作在哪个模式。通过配置筛选尺度寄存器can_fs1r的fscx位可以设置筛选器工作在哪个尺度。不同的尺度和不同的过滤方法可使筛选器工作在图的 4 种状态。
每组筛选器包含2个32位的寄存器,分别为can_fxr1和can_fxr2,它们用来存储要筛选的id或掩码,各个寄存器位代表的意义与图中两个寄存器下面“映射”的一栏一致,各个模式的说明见表。
例如下面的表格所示,在掩码模式时,第一个寄存器存储要筛选的id,第二个寄存器存储掩码,掩码为1的部分表示该位必须与id中的内容一致,筛选的结果为表中第三行的id值,它是一组包含多个的id值,其中x表示该位可以为1可以为0。
而工作在标识符模式时,2个寄存器存储的都是要筛选的id,它只包含2个要筛选的id值 (32位模式时)。如果使能了筛选器,且报文的id与所有筛选器的配置都不匹配,can外设会丢弃该报文,不存入接收fifo。
过滤器模式寄存器can_fm1r:
过滤器尺度寄存器can_fs1r:
过滤器fifo分配寄存器can_ffa1r:
过滤器激活寄存器can_fa1r:
过滤器组i的寄存器x can_firx:
FPGA从Xilinx 的7系列学起(8)
红色版iPhone7和新版本iPhone SE, 谁能打动你?
超声波手势控制或将很快应用于手机
盘点总结家用投影仪的好用功能,如何感受极致视觉体验?
洲明科技提出的光显概念不断提升客户的需求
介绍CAN总线基础知识
中兴通讯ICT产品方案和数字化能力体系获广泛认可
RL78/G15快速原型开发板(FPB)演示
如何使用IOT-MCU/ESP-01-DHT11板和AskSensors物联网平台监控温度和湿度测量
全球首个AI英语老师在中国诞生 —人工智能对教育行业新一轮革命
恩智浦为创新者提供成熟框架,助力开发新颖、安全的物联网应用
5G网络是怎样工作的
安瑞达公司量产干法隔膜薄膜结晶度可达±3%
领跑海尔知识产权竞争力全国第一
170秒语音芯片IC,otp/Flash电子发声芯片厂家,唯创知音WT588F
蔚来自动辅助驾驶行驶里程已破亿
上海合晶未来产业发展趋势
Go+1.0即将发布——让改变发生
诺基亚9机皇五大亮点:骁龙835+IP68防水防尘+Android7.1+双摄+Type-C
美肤神器不可少,美容仪哪个品牌好?