stm32 CAN总线例子

stm32 CAN总线例子
stm32 CAN总线例子

stm32 CAN总线例子

利用stm32实现了1个简单的CAN功能,使用了队列缓存

can.c 文件

#include "includes.h"

#define GPIO_CAN GPIOB

#define RCC_APB2Periph_GPIO_CAN RCC_APB2Periph_GPIOB #define GPIO_Pin_RX GPIO_Pin_8

#define GPIO_Pin_TX GPIO_Pin_9

#define GPIO_Remap_CAN GPIO_Remap1_CAN1

#define MAX_MAIL_NUM 3

static u8 CAN_msg_num[MAX_MAIL_NUM]; // 发送邮箱标记

//

/**

* @brief Configures the CAN, transmit and receive by polling

* @param None

* @retval : PASSED if the reception is well done, FAILED in other case */

void CAN_config_init(void)

{

CAN_InitTypeDef CAN_InitStructure;

CAN_FilterInitTypeDef CAN_FilterInitStructure;

/* CAN register init */

CAN_DeInit(CAN1);

CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */ // 36M 250k速率

CAN_InitStructure.CAN_TTCM=DISABLE;

CAN_InitStructure.CAN_ABOM=DISABLE;

CAN_InitStructure.CAN_AWUM=DISABLE;

CAN_InitStructure.CAN_NART=DISABLE;

CAN_InitStructure.CAN_RFLM=DISABLE;

CAN_InitStructure.CAN_TXFP=DISABLE;

CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;

CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;

CAN_InitStructure.CAN_Prescaler=9;

CAN_Init(CAN1, &CAN_InitStructure);

/* CAN filter init */

CAN_FilterInitStructure.CAN_FilterNumber=0;

CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;

CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;

CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;

CAN_FilterInit(&CAN_FilterInitStructure);

}

void CAN_init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

// 首先打开电源及时钟

/* GPIO for CAN and GPIO for LEDs clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIOI |RCC_APB2Periph_GPIO_CAN, ENABLE);

/* CAN1 Periph clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

/* Enable CAN1 RX0 interrupt IRQ channel */

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* Enable CAN1 TX0 interrupt IRQ channel */

NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

// 然后配置pin

/* Configure CAN pin: RX */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_RX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

/* Configure CAN pin: TX */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_TX;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIO_CAN, &GPIO_InitStructure);

// 映射下

GPIO_PinRemapConfig(GPIO_Remap_CAN , ENABLE);

// 波特率过滤器初始化

CAN_config_init();

CAN_ITConfig(CAN1, CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0, ENABLE); // fifo0中断

CAN_ITConfig(CAN1, CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1, ENABLE); // fifo1中断

CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE); // 发送中断

CAN_ITConfig(CAN1, CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR | CAN_IT_WKU | CAN_IT_SLK, ENABLE); // ERR中断// CAN缓存初始化

memset(CAN_msg_num,0,MAX_MAIL_NUM);

ClearCanQueue();

}

int CAN_tx_msg(CanTxMsg TxMessage)

{

uint8_t TransmitMailbox = 0;

OS_CPU_SR cpu_sr = 0;

TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);

if(CAN_NO_MB == TransmitMailbox)

{

printf("tx can fail\r\n");

return 0;

}

else

{

OS_ENTER_CRITICAL();

CAN_msg_num[TransmitMailbox] = 1;

OS_EXIT_CRITICAL();

}

CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);

return 1;

}

int CAN_tx_data(void)

{

CanTxMsg TxMessage;

uint8_t TransmitMailbox = 0;

OS_CPU_SR cpu_sr = 0;

/* transmit */

TxMessage.StdId=0x6f1;

TxMessage.RTR=CAN_RTR_DATA;

TxMessage.IDE=CAN_ID_STD;

TxMessage.DLC=4;

TxMessage.Data[0]=0x40;

TxMessage.Data[1]=0x02;

TxMessage.Data[2]=0x1a;

TxMessage.Data[3]=0x80;

TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);

if(CAN_NO_MB == TransmitMailbox)

{

printf("tx can fail\r\n");

return 0;

}

else

{

OS_ENTER_CRITICAL();

CAN_msg_num[TransmitMailbox] = 1;

OS_EXIT_CRITICAL();

}

CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);

return 1;

}

// 发送中断

void USB_HP_CAN1_TX_IRQHandler(void)

{

if(CAN_msg_num[0])

{

if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP0))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);

CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);

CAN_msg_num[0] = 0;

}

}

if(CAN_msg_num[1])

{

if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP1))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP1);

CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);

CAN_msg_num[1] = 0;

}

}

if(CAN_msg_num[2])

{

if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP2))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP2);

CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);

CAN_msg_num[2] = 0;

}

}

}

/**

* @brief This function handles USB Low Priority or CAN RX0 interrupts

* requests.

* @param None

* @retval : None

*/

void USB_LP_CAN1_RX0_IRQHandler(void)

{

// u32 i;

CanRxMsg RxMessage;

if(SET == CAN_GetITStatus(CAN1,CAN_IT_FF0))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_FF0);

}

else if(SET == CAN_GetITStatus(CAN1,CAN_IT_FOV0))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);

}

else

{

CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

InsertCanQueue(RxMessage);

// printf("CAN_FIFO0 RxMessage.StdId is 0x%x\r\n",RxMessage.StdId);

// printf("RxMessage.DLC is 0x%x\r\n",RxMessage.DLC);

// for(i = 0; i < RxMessage.DLC; i++)

// {

// printf("data[%d] is 0x%x\r\n",i,RxMessage.Data[i]);

// }

// printf("\r\n");

}

}

void CAN1_RX1_IRQHandler(void)

{

// u32 i;

CanRxMsg RxMessage;

if(SET == CAN_GetITStatus(CAN1,CAN_IT_FF1))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_FF1);

}

else if(SET == CAN_GetITStatus(CAN1,CAN_IT_FOV1))

{

CAN_ClearITPendingBit(CAN1,CAN_IT_FOV1);

}

else

{

CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);

InsertCanQueue(RxMessage);

// printf("CAN_FIFO1 RxMessage.StdId is 0x%x\r\n",RxMessage.StdId);

// printf("RxMessage.DLC is 0x%x\r\n",RxMessage.DLC);

// for(i = 0; i < RxMessage.DLC; i++)

// {

// printf("data[%d] is 0x%x\r\n",i,RxMessage.Data[i]);

// }

// printf("\r\n");

}

}

void CAN1_SCE_IRQHandler(void)

{

}

can.h文件

#ifndef __CAN_H__

#define __CAN_H__

void CAN_init(void);

int CAN_tx_data(void);

int CAN_tx_msg(CanTxMsg TxMessage);

#endif

can_queue.c文件

#include "includes.h"

struct _CANQueue CANQueue;

/******************************************************************* 作者:

版权:

函数名称:

函数功能: 清除通信队列

入口参数: 无

返回值: 无

相关调用:

备注:

修改信息:

********************************************************************/ void ClearCanQueue(void)

{

int i;

for(i = 0; i < MAX_CAN_SIZE; i++)

{

memset(&CANQueue.Elem[i],0,sizeof(CanRxMsg));

}

CANQueue.front = 0;

CANQueue.rear = 0;

}

/******************************************************************* 作者:

版权:

函数名称:

函数功能: 判断串口队列是否为空

入口参数:

返回值: 1: 空; 0:非空

相关调用:

备注:

修改信息:

********************************************************************/ u8 IsEmptyCanQueue(void)

{

if(CANQueue.front == CANQueue.rear)

{

return 1;

}

else

{

return 0;

}

}

/*******************************************************************

作者:

版权:

函数名称:

函数功能: 判队列是否满

入口参数:

返回值: 1: 满; 0:非满

相关调用:

备注:

修改信息:

********************************************************************/

u8 IsFullCanQueue(void)

{

if( CANQueue.front == (CANQueue.rear+1) % MAX_CAN_SIZE)

{

return 1;

}

else

{

return 0;

}

}

/*******************************************************************

作者:

版权:

函数名称:

函数功能: 将数据插入队列

入口参数: element:被插元素

返回值: 1: 成功; 0:失败

相关调用:

备注:

修改信息:

********************************************************************/

u8 InsertCanQueue(CanRxMsg element)

{

if(!IsFullCanQueue()) //是否为满

{

memcpy(&CANQueue.Elem[CANQueue.rear],&element,sizeof(CanRxMsg));

CANQueue.rear = (CANQueue.rear + 1) % MAX_CAN_SIZE;

return 1;

}

else //队列满

{

// printf("CAN queue is full\r\n");

return 0;

}

}

/******************************************************************* 作者:

版权:

函数名称:

函数功能: 重新设置队列头指针

入口参数: head: 新头

返回值: 无

相关调用:

备注:

修改信息:

********************************************************************/ void SetHeadCanQueue(u16 head)

{

if(CANQueue.front != CANQueue.rear)

{

CANQueue.front = head;

}

}

/******************************************************************* 作者:

版权:

函数名称:

函数功能: 取对头

入口参数: head:对头;*element;数据

返回值: 1: 成功0: 失败

相关调用:

备注:

修改信息:

********************************************************************/ u8 GetCanQueue(u16 head,CanRxMsg *element)

{

if(head != CANQueue.rear) //到队列尾

{

memcpy(element,&CANQueue.Elem[head],sizeof(CanRxMsg));//得到数据

return 1;

}

else

{

return 0; //无指定对头数据}

}

/******************************************************************* 作者:

版权:

函数名称:

函数功能: can数据处理

入口参数:

返回值:

相关调用:

备注:

修改信息:

********************************************************************/ void Can_data_process(void)

{

u16 head;

// u32 i;

CanRxMsg RxMessage;

CanTxMsg TxMessage;

head = CANQueue.front;

if(1 == GetCanQueue(head,&RxMessage))

{

head = (head + 1) % MAX_CAN_SIZE; //查询头前滚

SetHeadCanQueue(head);

// printf("RxMessage.StdId is 0x%x\r\n",RxMessage.StdId);

// printf("RxMessage.DLC is 0x%x\r\n",RxMessage.DLC);

// for(i = 0; i < RxMessage.DLC; i++)

// {

// printf("data[%d] is 0x%x\r\n",i,RxMessage.Data[i]);

// }

// printf("\r\n");

// 把接收到的数据发回去

/* transmit */

// TxMessage.StdId=RxMessage.StdId;

TxMessage.StdId=0x5f1;

TxMessage.RTR=RxMessage.RTR;

TxMessage.IDE=RxMessage.IDE;

TxMessage.DLC=RxMessage.DLC;

memcpy(TxMessage.Data,RxMessage.Data,TxMessage.DLC);

CAN_tx_msg(TxMessage);

}

else

{

// printf("CAN queue is empty\r\n");

}

}

can_queue.h文件

#ifndef CAN_QUEUE_H_

#define CAN_QUEUE_H_

#define MAX_CAN_SIZE 50

struct _CANQueue

{

CanRxMsg Elem[MAX_CAN_SIZE];

u16 front;

u16 rear;

};

void ClearCanQueue(void);

u8 IsEmptyCanQueue(void);

u8 IsFullCanQueue(void);

u8 InsertCanQueue(CanRxMsg element);

void SetHeadCanQueue(u16 head);

u8 GetCanQueue(u16 head,CanRxMsg *element);

void Can_data_process(void);

#endif

CAN总线协议解析 李玉丽 (吉林建筑工程学院电气与电子信息工程学院,吉林长春,130021 ) 摘要:现场总线的发展与应用引起了传统控制系统结构的改变。控制局域网(C AN)总线因其自身的特点被广泛应用于 自动控制领域。本文对C AN总线协议作了详尽解析。 关键词:C AN总线;隐性位;显性位;节点 中图分类号:T U 85 文献标识码:A CAN(Cont roll e r A rea N et work)是分布式实时控 制系统的串行通信局域网,称谓CAN总线。在数据 实时传输中,设计独特、低成本,具有高可靠性,得到 广泛应用。 本文着重解析C AN 技术规范2.0B 版的CAN 的分层结构规范和CAN 报文结构规范。重点在于 充分理解CAN总线协议精髓,有助于CAN总线的 局网设计、软件编程、局网维护。 一、C AN的分层结构 CAN 遵从O SI ( Ope n Syste m I nte rc onnec ti on Re fe re nce Mode l ) 模型,其分层结构由高到低如图1 所示。 图1 C AN的分层结构 对应OSI 模型为两层,实际为三层,即LLC、 MA C、PL S。由此而知,对应于CAN总线系统每个 节点都是三层结构。数据发送节点数据流为LLC→ MA C→P LS ,然后将数据发送到总线上;而对于挂在 总线上的所有节点(包括发送节点)的接收的数据流 为PL S→MA C→LLC。 这种分层结构的规范保证了CAN 总线的多主 方式工作模式,即不分主从,非破坏性的仲裁工作模 式。而LLC 层的报文滤波功能可实现点到点、一点 对多点、全局广播、多点对一点,多点对多点等数据 传递方式。 各分层主要功能如下: LLC 层:接收滤波、超载通知、恢复管理; MAC 层:控制帧结构、执行仲裁、错误检测、出 错标定、故障界定。该层是CAN的核心; PL S 层:位编码/ 解码、位定时。 二、CAN总线的报文规范 CAN报文的传送有4 种不同类型的帧结构,数 据帧、远程帧、出错帧、超载帧。CA B2.0B 有4 种帧 格式。 (一)数据帧

●通讯与电视  1553B 总线通信技术的应用与发展 北京航空航天大学(100083) 熊华钢 摘 要:介绍了1553B 总线技术的产生及特点,说明了总线通信系统的组成、开发方法及仿真技术,分析了1553B 总线系统发展前景和方向。 关键词:总线通信 电子综合 网络 车辆、舰船、飞机等机动平台上电子设备越来越多,并且越来越复杂。将电子设备加以有效的综合,使之达到资源和功能共享已成为必然的要求。电子综合的支撑技术是连网技术,机动平台上的连网技术不同一般的局域网络技术,它特别强调网络的可靠性和实时性。1553B 总线最初是在七十年代末为适应飞机的发展由美国提出的飞机内部电子系统连网标准。其后由于它的高可靠性和灵活性而在其他的机动平台上得到广泛的应用。 1 1553B 总线通信系统及其特点 一个综合系统通常由若干子系统通过嵌入式总线接口并经过总线介质互连而成,各个子系统操作独立,资源和功能则可通过网络共享。从通信系统的角度看,在所有的子系统中有一个作为总线控制器(BC ),其他的子系统都是远程终端(RT )。以一个飞机综合系统为例,1553B 通信系统的组成如图1 所示。 图1 总线通信系统构成 由于1553B 总线在减少电子设备的体积、重量、复杂性以及电子系统综合费用诸方面的优点,成为了机动平台电子系统的主要工作支柱。它具有不同于一般电子网络的鲜明特点。 ?1553B 总线是一种广播式分布处理的计算机网络,网络上可挂接32个终端,所有的终端(节点)共享一条消息通路,任一时刻网络中至多只有一个终端在发送消息,传送中的消息可以被所有终端接收,实际接收的终端通过地址来识别。网络结构简单,终端的扩展 十分方便,任一终端(除总线控制器外)的故障都不会造成整个网络的故障,总线控制器则可以通过备份来提高可靠性。但是网络对总线本身的故障比较敏感,因此通常采用双余度总线。 ?强调了实时性,1553B 总线的传输码速率为1M bps ,每条消息最多包含32个字(每个字十六位),因此传输一条消息的时间比较短。 ?1553B 总线按指令/响应的方式异步操作,即总线上的所有消息传输都由总线控制器发出的指令来控制,相关终端对指令应给予回答(响应)并执行操作。这种方式非常适合集中控制的分布式处理系统。?兼顾实时性的条件下,采用了合理的差错控制措施,即反馈重传方法。 2 总线系统的开发和仿真 电子综合系统是一个集中控制的分布式处理系统,系统中每一个子系统(终端)都通过总线发送和获取消息,因此子系统的操作离不开总线接口。由于综合系统中各个子系统相互关联,总线接口的开发需要有必要的仿真和测试环境。2.1 总线接口 目前子系统大多采用嵌入式计算机结构,总线接口被做成一块插件嵌入到子系统机箱中。由于子系统主机各式各样,主机内总线也不尽相同,通常要为子系统专门开发总线接口。一个好的总线接口应该包括总 线收发器、通信协议处理器、双口RA M 存储器和主机 接口仲裁等部分。市场上已经有面向电子系统综合的1553B 总线组件和集成芯片货架产品,美国D DC 公司的BU -61850系列芯片由于将总线收发器、通信协议处理器和4~8K 字双口R AM 存储器集成一体而被广泛应用。采用这类芯片只需根据主处理器的特性设计相应的主机接口仲裁电路,总线接口的设计比较简单,如图2所示。2.2 通信软件 通信软件是子系统中组织消息传输的软件,对于

FF总线的通信技术 通信是基金会现场总线(FF)技术的主要组成部分。首先要强调和明确指出的是,基金会现场总线是定位于重要的(missioncritical)过程控制应用,因此要求时间的确定性(timecritical),这是对它性能要求的出发点。基金会现场总线通信技术包括两个部分,即H1和HSE。各种基金会现场总线控制系统有各自的特点,但H1总线都遵守同样的规则。 H1总线应用于现场设备,我们不打算罗列它所有条文,只列举它的主要性能有: 通信速率:波特率31.25kbps(主要传输连续过程变量参数)。 传输距离:主干和分支合计1900米(满足大部分过程工厂的现状要求)。 总线供电:支持,9-32V电压,电源应冗余配置(继承原过程工厂中仪表的传统连接习惯)。 本安防爆:支持,同时推出了FISCO、FNICO等新概念(过程工厂中经常有易燃易爆环境)。 应当特别指出,H1总线的通信速率31.25kbps是连续过程控制的最佳通信速率。速率的选择要兼顾传输距离、被测参量变量周期长短、传输介质损耗、信息辐射和介质易受干扰的程度等综合因素决定。从满足需求上看,FF总线的通信周期为500mS,此速率足可以胜任通信的需求。 H1总线因为有了链路调度器功能的设置,保证了网段重要设备的冗余,因而在H1总线上不再设置线路冗余。初期人们对此总有担心。事实上H1总线重要设备的使命,在很大程度上用设备冗余代替了。基金会工程规范说,一条H1网段可以挂接6到12台设备,但对于I级关键的重要位置,一条H1总线只需挂3台设备(例如一个串级控制回路的两台变送器和一台阀门)。庆幸的是工业现场只有一小部分环节有这种高度风险性。既然有这种简单的解决方法,为什么还要去追求成本更高的电缆冗余呢?当然,在特别重要的H1和设备,HSE高速总线可以设置H1的介质冗余,能更有效的保证了通讯的正常进行。 现在许多设备有总线极性不敏感的性能(即可不分正负),但总线供电设备是分正负极的。 H1总线长达百米以上就应该按“传输长线”对待,即在“两端”连接阻抗匹配器。这样可以防止传输波沿总线反射使波形畸变。而且注意,和主系统的连接点应该在一侧匹配器距离120米以内。 应该说H1总线的布线的要求并没有什么特别困难和怪异之处。正确和物理健康的布线是良好使用的必须条件。这一点是不容让步的。不要指望存在进水、漏电、到处接地等问题,系统还是高度可 靠。 检查H1总线布线除了传统的万用表外,还应该配备示波器和电缆电容测量仪。还有专门的H1总线测量仪表,如MTL的FBT-5/6等。用示波器直接观察波形是方便和直观的方法。 图2示波器上用两种扫描速度显示的H1总线波形。看来并不像理论上那样“规矩”。当然波形也不可以任意的变差,当波形已近似正弦波时,曼彻斯特解码就可能发生相位错误。另外要通过示波器Y轴注意波

CAN总线技术详解 起源 20世纪80年代,Robert Bosch 公司在SAE(汽车工程协会)大会上介绍了一种新型的串行总线CAN控制器局域网,那也是CAN 诞生的时刻。今天,在欧洲几乎每一辆新客车均装配有CAN 局域网。同样,CAN也用于其他类型的交通工具,从火车到轮船或者用于工业控制。CAN 已经成为全球范围内最重要的总线之一甚至领导着串行总线。CAN总线的工作原理 CAN总线使用串行数据传输方式,可以1Mb/s的速率在40m的双绞线上运行,也可以使用光缆连接,而且在这种总线上总线协议支持多主控制器。CAN与I2C总线的许多细节很类似,但也有一些明显的区别。 当CAN总线上的一个节点(站)发送数据时,它以报文形式广播给网络中所有节点。对每个节点来说,无论数据是否是发给自己的,都对其进行接收。每组报文开头的11位字符为标识符,定义了报文的优先级,这种报文格式称为面向内容的编址方案。在同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文。当几个站同时竞争总线读取时,这种配置十分重要。 当一个站要向其它站发送数据时,该站的CPU将要发送的数据和自己的标识符传送给本站的CAN芯片,并处于准备状态;当它收到总线分配时,转为发送报文状态。CAN芯片将数据根据协议组织成一定的报文格式发出,这时网上的其它站处于接收状态。每个处于接收状态的站对接收到的报文进行检测,判断这些报文是否是发给自己的,以确定是否接收它。 由于CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线中加进一些新站而无需在硬件或软件上进行修改。当所提供的新站是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。它允许分布过程同步化,即总线上控制器需要测量数据时,可由网上获得,而无须每个控制器都有自己独立的传感器。

一:串口 串口是串行接口的简称,分为同步传输(USRT)和异步传输(UART)。在同步通信中,发送端和接收端使用同一个时钟。在异步通信中,接受时钟和发送时钟是不同步的,即发送端和接收端都有自己独立的时钟和相同的速度约定。 1:RS232接口定义 2:异步串口的通信协议 作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。图一给出了其工作模式: 图一 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=1200波特。 3:在嵌入式处理器中,通常都集成了串口,只需对相关寄存器进行设置,就可以使用啦。尽管不同的体系结构的处理器中,相关的寄存器可能不大一样,但是基于FIFO的uart框图还是差不多。

发送过程:把数据发送到fifo中,fifo把数据发送到移位寄存器,然后在时钟脉冲的作用下,往串口线上发送一位bit数据。 接受过程:接受移位寄存器接收到数据后,将数据放到fifo中,接受fifo事先设置好触发门限,当fifo中数据超过这个门限时,就触发一个中断,然后调用驱动中的中断服务函数,把数据写到flip_buf 中。 二:SPI SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

微处理器中常用的集成串行总线是通用异步 接收器传输总线(UART)、串行通信接口(SCI) 和通用串行总线(USB)等,这些总线在速度、 物理接口要求和通信方法学上都有所不同。本文详细介绍了嵌入式系统设计的串行总线、驱动器和物理接口的特性,并为总线最优选择提供性能比较和选择建议。 由于在消费类电子产品、计算机外设、汽车和工业应用中增加了嵌入式功能,对低成本、高速和高可靠通信介质的要求也不断增长以满足这些应用,其结果是越来越多的处理器和控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 和通用串行总线,以及车用串行总线,包括控制器区域网(CAN)和本地互连网(LIN)。这些总线在速度、物理接口要求和通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器和物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述是基于微处理器的设计。 串行与并行相比 串行相比于并行的主要优点是要求的线数较少。例如,用在汽车工业中的LIN 串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号和电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址和数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。

一、概述 CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。 想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司开发的(和Intel)CAN 有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到1Mbps,通信距离最远到10KM,无损位仲裁机制,多主结构。 近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。 一个典型的CAN应用场景: 二、CAN总线标准 CAN总线标准只规定了物理层和数据链路层,需要用户来自定义应用层。不同的CAN标准仅物理层不同。

CAN收发器负责逻辑电平和物理信号之间的转换,将逻辑信号转换成物理信号(差分电平)或者将物理信号转换成逻辑电平。 CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。(有信号时,CANH 3.5V,CANL 1.5V,即显性;没有信号时,CANH 2.5V,CANL 2.5V,即隐性) IOS11898高速CAN电平中,高低电平的幅度低,对应的传输速度快。 双绞线共模消除干扰,是因为电平同时变化,电压差不变。 2.1物理层 CAN有三种接口器件

多个节点连接,只要有一个为低电平,总线就为低电平,只有所有的节点都输出高电平时,才为高电平。所谓“线与”。 CAN总线有5个连续性相同的位后,就会插入一个相反位,产生跳变沿,用于同步。从而消除累计误差。 和485、232一样,CAN的传输速度与距离成反比。 CAN总线终端电阻的接法:

特点:低速CAN在CANH和CANL上串入2.2kΩ的电阻;高速CAN在CANH和CANL 之间并入120Ω电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。(因为大多数双绞线电缆特性阻抗大约在100~120Ω。) 120欧姆只是为了保证阻抗完整性,消除回波反射,提升通信可靠性的,因此,其只需要在总线最远的两端接上120欧姆电阻即可,而中间节点并不需要接(接了反而有可能会引起问题)。因此各位在使用CAN Omega做CAN总线侦听的时候,大多数情况下是不需要这个120欧姆电阻的,当然,即使当前网络中并没有终端匹配电阻,只要传输线长度不长(比如SysCan360比赛环境中,传输线只有1-2米)CAN节点数量不多的情况下,不要这个120欧姆电阻也完全可以工作,甚至,你接任意电阻都是不会有影响的。因为此时传输线长度和波长还相差甚远,节点不多的情况下,反射波的叠加信号强度也不会很强,因此传输线效应完全可以忽略。 而哪些情况需要呢,主要就是,当使用2个CAN Omega对发或者当前网络中仅有2个CAN设备的时候,此时两个端点最好都加上终端匹配电阻,当然,前面也说过了,传输线长度不长的时候,也可以不需要2端120欧姆电阻,但为了信号完整性考虑,加上这两个电阻才是严谨的。 2个120欧姆电阻的意义在于,使用USB CAN调试某些不带终端电阻的中间节点设备时,有时候CAN总线上没有2个120欧姆电阻通信可能会异常,此时可以接入2个120欧姆电阻作为2个终端电阻来作阻抗匹配,这时候其他端点不应接入任何终端电阻!并且,这2个120欧姆电阻不可用1个60欧姆电阻代替!

常用现场总线种类介绍 1、PROFIBUS Profibus 作为一种快速总线,被广泛应用于分布式外围组件(PROFIBUS-DP)。除了PROFIBUS-DP 和FMS 以外,Beckhoff 还支持驱动器通讯标准PROFIBUS MC。过程现场总线 2、EtherCAT EtherCAT(Ethernet for Control Automation Technology,用于控制和自动化技术的以太网)是一种用于工业自动化的实时以太网解决方案,性能优越,使用简便。 3、Lightbus 这种经过验证的Beckhoff 光纤总线系统具有极为优秀的抗EMI 性能,易于安装,数据流快速、循环且具有确定性。 4、Interbus Interbus 易于配置,通讯快速而可靠。主/从系统的移位寄存器协议可提供高效循环通讯。 5、CANopen 通过有效利用总线带宽,CANopen 可在即使相对较低的数据传输速率时也能实现较短的系统响应时间。秉承了CAN 的传统优点,例如数据安全性高且具备多主站能力。 6、ControlNet ControlNet 是一种开放式标准现场总线系统。该总线协议允许循环数据和非循环数据通过总线同时进行交换,而两者之间互不影响。 7、SERCOS interface SERCOS 最初作为用于驱动器的快速光纤总线系统研发。采用Beckhoff SERCOS 总线耦合器,I/O 设备可以实现高速率数据传输和较短的循环时间。 8、Ethernet 以太网是办公环境中的主流标准。在Beckhoff 以太网产品中,也秉承并发扬了以太网的优点,例如数据传输速率高,与现有网络的简便集成以及广泛的服务和接口等。 9、PROFINET PROFINET 是一种由PNO(PROFIBUS 用户组织)针对开放式工业以太网制定的标准:国际上订立的一种针对通讯的IT 标准(如TCP/IP 协议)。 10、USB USB 已成为PC 技术的标准接口,具有传输速率高,拓扑结构灵活(通过集成集线器)等特点,加上Beckhoff USB 总线耦合器,在距离较短时,该系统可替代现场总线。 11、Modbus Modbus 是一种基于主/从结构的开放式串行通讯协议。可非常轻松地在所有类型的串行接口上实现,已被广泛接受。 12、RS232/RS485 RS232 和RS485 是精典的串行接口,一直被广泛使用。Beckhoff RS485/RS232 I/O模块采用的是易于实现的简单串行通讯协议。 13、CC-Link CC-Link(Control & Communication Link,控制与通信链路)是一种开放式总线系统,用于控制级和现场总线级之间的通讯。应用方面主要以亚洲地区为主。 14、AS-Interface AS interface 通过简单、经济的布线方法,连接传感器、执行器与上位控制层。AS interface 已通过EN 50295 和IEC 62026-2 标准,在国际上实现了标准化。 15、LON LON(Local Operating Network,局部操作网络)是一种能够进行多网络连接的通讯系统,用于分布式应用。 16、EIB EIB(European Installation Bus,欧洲安装总线)是一种用于楼宇布线的总线系统,主要在欧洲得到广泛应用。 17、SNMP 简单网络管理协议 18、QOS 服务质量,解决延时和阻塞的一种技术。 19、CAN 控制器局域网络

计算机总线 1.概念:总线就是计算机各模块间进行信息传输的通道。不同的总线都是为了解决某一方面问题而产生的。 2.分类: (1)内部总线:包括片内总线、存储总线、片总线(元件级总线) (2)系统总线(I/O通道总线):包括PCI(Peripheral Component Interconnect Local Bus)总线、ISA(Industrial Standard Architecture、工业标准结构)总线、AGP(Accelerated Graphics Port,加速图形端口)总线、VME总线、MCA(微通道、PS/2)总线、Multi Bus总线、STE总线、STD总线、EISA(扩展工业标准结构)总线、SCSI(Small Computer System Interface、软盘和主机)总线、IDE(硬盘和主机)总线、VESA (提高系统视频性能)总线、VL总线、PCMCIA(个人计算机存储器卡国际协会)总线等,系统总线一般都以插槽的形式出现在主板上(3)外部总线(通信总线):分为串行和并行两大类。串行:RS232C、USB、IEEE1394、ADB(Apple desktop bus)、A.b(存取总线)、CHI(Concentration Highway Interface)、GeoPort 并行:IEEE-488、VXI 外部总线也必须通过系统总线来实现和主机的通信。比如USB是通过PCI到USB的主控制器。 选用哪一种总线技术时,应当明确各种总线的设计目的,即它的主要应用领域,然后根据自己的具体需要,选择一种总线规范来实现。 四种常用的串行通信总线比较:

摘要: 随着工业测控技术和生产自动化技术的不断进步,传统的RS-232、RS-485和CCITTV.24通信技术已不能适应现代化的工业控制需要,而现场总线(Fieldbus)以其低廉的价格、可靠的性能而逐步成为新型的工业测控领域的通信技术。现场总线是应用在生产现场,在微机化测量控制设备之间实现双向串行多节点数字通信的系统,是一种开放式、数字化、多点通信的底层控制网络。汇集了计算机技术、网络通信技术和自动控制技术(3C)的现场总线技术,从20世纪80年代开始发展起来,并逐步在制造业、流程工业、交通、楼宇等方面的自动化系统中得到了广泛的重视和应用。现场总线主要有以下几种类型[1-3]:基金会现场总线(FF)、LonWorks、ProfiBus、CAN、HART,而其中CAN即控制器局域网因为具有高性能、高可靠性以及独特的设计而越来越受到关注,现已形成国际标准,被公认为几种最有前途的现场总线之一。 Abstract: As industrial measurement and control technology and production automation technology advances, the traditional RS - 232, RS - 485 and CCITTV. 24 communication technology can not meet the needs of modern industrial control, and field bus (Fieldbus), with its low price, reliable performance, and gradually become a new kind of communication technology in the field of industrial measurement and control. Field bus is used in production field, between microcomputer-based measuring control equipment to realize the bidirectional serial multi-node digital communication system, is a kind of open, digital, multipoint communication bottom control network. Brings together computer technology, network communication technology and automatic control technology (3 c) field bus technology, developed in the 1980 s, and gradually in the manufacturing and process industries, transportation, building automation system has been widely attention and application. Fieldbus basically has the following several types: [1-3] foundation fieldbus (FF), LonWorks, ProfiBus, CAN, HART, and which CAN namely controller local area network (LAN) because of the high performance, high reliability and unique design is more and more attention, already formed the international standard, is recognized as one of the most promising fieldbus.

通信接口有哪些_几种常见的通信接口 通信接口(communicaTIon interface )是指中央处理器和标准通信子系统之间的接口。如:RS232接口。RS232接口就是串口,电脑机箱后方的9芯插座,旁边一般有|O|O| 样标识。 主要分类一般机箱有两个,新机箱有可能只有一个。笔记本电脑有可能没有。 有很多工业仪器将它作为标准通信端口。通信的内容与格式一般附在仪器的用户说明书中。 计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。在串行通讯时,要求通讯双方都采用一个标准接口,使不同的设备可以方便地连接起来进行通讯。RS-232-C接口(又称EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。 随着电子技术的发展和市场的需求,各种各类的仪表越来越多地应用于各个不同领域的自动化控制设备和监测系统中,这要求系统之间以及各系统自身的各个组成部分之间必须保持良好的通信来完成采集数据的传输,先进的通信协议技术能可靠地保证这一点。 通信协议是通信双方的约定,对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,实现不同设备、不同系统间的相互沟通。将通信协议合理地应用于新产品的开发中,不仅能使产品的设计更加灵活、使用更为便捷,还能扩大产品的使用范围、增强产品市场竞争力。 几种常见的通信接口1、标准串口(RS232)

微处理器中常用的集成串行总线就是通用异步接收器传输总线(UART)、串行通 信接口(SCI)与通用串行总线(USB)等,这些总 线在速度、物理接口要求与通信方法学上都 有所不同。本文详细介绍了嵌入式系统设计 的串行总线、驱动器与物理接口的特性,并为 总线最优选择提供性能比较与选择建议。 由于在消费类电子产品、计算机外设、汽车与工业应用中增加了嵌入式功能,对低成本、高速与高可靠通信介质的要求也不断增长以满足这些应用,其结果就是越来越多的处理器与控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线就是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 与通用串行总线,以及车用串行总线,包括控制器区域网(CAN)与本地互连网(LIN)。这些总线在速度、物理接口要求与通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器与物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述就是基于微处理器的设计。 串行与并行相比

串行相比于并行的主要优点就是要求的线数较 少。例如,用在汽车工业中的LIN串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号与电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址与数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。 串行总线的故障自诊断与调试也非常简单,可以很容易地跟踪网络中一个有故障的器件并用新器件替换而不会干扰网络。但另一方面,并行总线比串行速度快。例如,Rambus公司的“Redwood”总线速度可高达6、4GHz,而最高的串行速度不会超过几个兆赫。 在工业与汽车应用中常用的串行协议 1、UART

一.CAN总线简介 1. CAN总线的发展历史 20世纪80年代初期,欧洲汽车工业的蓬勃发展,车辆电子信息化程度的也不断提高。当时,由于消费者对于汽车功能的要求越来越多,而这些功能的实现大多是基于电子操作的,这就使得电子装置之间的通讯越来越复杂,同时意味着需要更多的连接信号线,但是传统的线束式汽车电子系统已经不能满足车辆电子信息功能发展的需求。为了解决这一制约现代汽车电子信息化发展的瓶颈,德国Bosch公司设计了一个单一的网络总线,所有的外围器件可以被挂接在该总线上,经过试验,这一总线能够有效解决现代汽车中庞大的电子控制装置之间的通讯,并且能够减少不断增加的信号线。所以在1986年Bosch公司正式公布了这一总线,且命名为CAN总线。 CAN控制器局部网(CAN—Controller Area Network)属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通讯网络,它具有很高的网络安全性、通信可靠性和实时性,简单实用,网络成本低,特别适用于汽车计算机控制系统和环境恶劣、电磁辐射强和振动大的工业环境,因此CAN总线在诸多现场总线中独占鳌头,成为汽车总线的代名词,CAN总线开始进入快速发展时期:1987年Intel公司生产出了首枚CAN控制器(82526)。不久,Philips公司也推出了CAN 控制器82C200; 1991年,Bosch颁布CAN 2.0技术规范,CAN2.0包括A和B两个部分 为促进CAN以及CAN协议的发展,1992在欧洲成立了国际用户和厂商协会(CAN in Automation,简称CiA),在德国Erlangen注册,CiA总部位于Erlangen。CiA提供服务包括:发布CAN的各类技术规范,免费下载CAN文献资料,提供CANopen规范DeviceNet规范;发布CAN产品数据库,CANopen产品指南;提供CANopen验证工具执行CANopen认证测试;开发CAN规范并发布为CiA 标准。 1993 年CAN 成为国际标准ISO11898(高速应用)和ISO11519(低速应用); 1993年,ISO颁布CAN国际标准ISO-11898; 1994年,SAE颁布基于CA N的J1939标准; 2003年,Maybach发布带76个ECU的新车型(CAN,LIN,MOST);

第三节常用的接口及总线设计 §3.3.1 接口标准: 常用的接口类型,接物理电气特性划分,大致可分为以下几类: 1. TTL 电平接口:最通用的接口类型,常用做板内及相连板间接口信号标准。其信 号速度一般限制在二、三十兆HZ 以内。驱动能力一般为几毫安到几十毫安,产 品设计特别是总线设计时必须考虑负载能力。 2. CMOS电平接口:速度范围与TTL 相仿,驱动能力要弱一些。 3. EIL 电平接口:为高速电气接口,速率可达几百兆,但相应功耗较大,电磁辐射 与干扰与较大。 4. RS-232电平接口:为低速串行通信接口标准,电平为±12V ,用于DTE 与DCE 之间的连接。 5. 差分平衡电平接口:能实现较远距离,较高速率的传输,2MHZ 信号在匹配适当 地情况下,传输距离在15m 以上。 6. 光隔离接口:能实现电气隔离,允许信号带宽一般在10M 以内,更高速率的器件 价格较昂贵。 7. 线圈耦合接口:电气隔离特性好,但允许信号带宽有限。 常用的板极接口类型,按接口实现的逻辑形式,主要有以下几类: 共享内存接口 并行口(PIO)接口 串行口(STI)接口 多总线技术 §3.3.2 串口设计:

异步串口:速度可达几百Kbps,在速度大于15kbps 时,为可靠传输,一般推荐用EIA -402 或EIA 485 电平接口标准进行传输。 yf-f4-06-cjy 同步串口:常用的接口芯片如82525 、20320,速率为2Mbps 或4Mpbs 。 无论同步或异步,在较高速率传输时,除在板内或传输线长度较短的板间传输时可用 TTL 电平接口外,一般要求用差分平衡电平接口:EIA422、端到端传输FIA -485:差分总线传输、终端可达329。 使用差分平衡电平传输时,为保证传输质量,应进行信号匹配,对EIA -422,常用的 匹配方法:

GPIB 一、简介:通用接口总线,大多数打印机就是(General-Purpose Interface Bus)-GPIB GPIB线以及GPIB接口与电脑相连。通过惠普公司设计HP-IB 1965 年变成IEEE-488标准1975年HP-IB, IEEE 488-1978变成IEEE488.1-1987 1987年IEEE488.2被采纳仪器1990 年SCPI规范被引入IEEE 488 修订IEEE 488.2 1992年 HS488 NI 1993年公司提出 惠普公司(Hewlett-Packard)设计了惠普接口总线(HP-IB, 1965年, 用 于连接惠普的计算机和可编程仪器.由于其高转换速率(通常可达1Mbytes/s), 这种接口总线得到普遍认可, 并被接收为IEEE标准488-1975和ANSI/IEEE标准488.1-1987. 后来, GPIB比HP-IB的名称用得更广泛. ANSI /IEEE 488.2 -1987加强了原来的标准, 精确定义了控制器和仪器的通讯方式. 可编程仪器的标准命令(Standard Commands for Programmable Instruments, SCPI)采纳了IEEE488.2定义的命令结构,创建了一整套编程命令 二、接口与总线 接口部分是由各种逻辑电路组成,与各仪器装置安装在一起,用于对传输的信息进行发送、接收、编码和译码;总线部分是一条无源的多芯电缆,用做传输各种 消息。将具有GPIB接口的仪器用GPIB总线连接起来的标准接口总线系统。word 编辑版. 标准接口总线系统中,要进行有效的通信联络至少有“讲在一个GPIB者”、 “听者”、“控者”三类仪器装置。 如测量仪器、数据采集器、总线发送仪器消息的仪器装置(讲者是通过但在

QAD:quadrature encoding,正交编码。 正交编码器(又名增量式编码器或光电式编码器),用于检测旋转运动系统的位置和速度。正交编码器可以对多种电机控制应用实现闭环控制,诸如开关磁阻(SR)电机和交流感应电机(ACIM)。典型的增量式编码器包括一个放置在电机传动轴上的开槽的轮子和一个用于检测该轮上槽口的发射器/检测器模块。通常,有三个输出,分别为:A相、B相和索引(INDEX),所提供的信息可被解码,用以提供有关电机轴的运动信息,包括距离和方向。 A相(QEA)和B相(QEB)这两个通道间的关系是惟一的。如果A相超前B相,那么电机的旋转方向被认为是正向的。如果A相落后B相,那么电机的旋转方向则被认为是反向的。第三个通道称为索引脉冲,每转一圈产生一个脉冲,作为基准用来确定绝对位置。这三个信号的相关时序图,参见图16-1。 编码器产生的正交信号可以有四种各不相同的状态。这些状态在图16-1中用一个计数周期表示。请注意,当旋转的方向改变时,这些状态的顺序与此相反。正交解码器捕捉相位信号和索引脉冲,并将信息转换为位置脉冲的数字计数值。通常,当传动轴向某一个方向旋转时,该计数值将递增计数;而当传动轴向另一个方向旋转时,则递减计数。 SPI:SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI有三个寄存器分别为:控制寄存器SPCR,状态寄存器SPSR,数据寄存器SPDR。外围设备包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线NSS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。 SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。 SPI,就是高速同步串行口。3~4线接口,收发独立、可同步进行. SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200.

常见接口电路介绍 一、I2C总线简介 1. 什么是I2C( INTER IC BUS) NXP 半导体(原Philips 半导体)于20 多年前发明了一种简单的双向二线制串行通信总线,这个总线被称为Inter-IC 或者I2C 总线。目前I2C 总线已经成为业界嵌入式应用的标准解决方案,被广泛地应用在各式各样基于微控器的专业、消费与电信产品中,作为控制、诊断与电源管理总线。多个符合I2C 总线标准的器件都可以通过同一条I2C 总线进行通信,而不需要额外的地址译码器。由于I2C 是一种两线式半双工串行总线,因此简单的操作特性成为它快速崛起成为业界标准的关键因素。 2. I2C总线的基本概念 1)发送器(Transmitter):发送数据到总线的器件; 2)接收器(Receiver):从总线接收数据的器件; 3)主机(Master):初始化发送、产生时钟信号和终止发送的器件;4)从机(Slave):被主机寻址的器件; 其线路结构图如下:

如上图示,I2C 总线具有如下特点: 1)I2C 总线是双向传输的总线,因此主机和从机都可能成为发送器和接收器。不论主机是发送器还是接收器,时钟信号SCL 都要由主机来产生; 2)只需要由两根信号线组成,一根是串行数据线SDA,另一根是串行时钟线SCL; 3)SDA 和SCL 信号线都必须要加上拉电阻Rp(Pull-Up Resistor)。上拉电阻一般取值3~10KΩ; 4)SDA 和SCL 管脚都是漏极开路(或集电极开路)输出结构;

3. I2C总线的信号传输 1)3种速率可选择 标准模式100kbps、快速模式400kbps、最高速率3.4Mbps; 2)具有特定的传输起始、停止条件 a)起始条件:当SCL 处于高电平期间时,SDA 从高电平向低电平跳 变时产生起始条件。 起始条件常常简记为S; b)停止条件:当SCL 处于高电平期间时,SDA 从低电平向高电平跳

工作原理 当CAN 总线上的一个节点(站)发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。 每组报文开头的11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文,当几个站同时竞争总线读取时,这种配置十分重要。 大体的工作原理我们搞清了,但是根本的协议我们还要花一番功夫。下面介绍一个重要的名词,“显性”和“隐性”:首先CAN 数据总线有两条导线,一条是黄色的,一条是绿色的------分别是CAN_High 线和CAN_Low 线,当静止状态时,这两条导线上的电平一样,这个电平称为静电平,大约为2.5 伏。 这个静电平状态就是隐形状态,也称隐性电平,也就是没有任何干扰的时候的状态称为隐性状态。当有信号修改时,CAN_High 线上的电压值变高了,一般来说会升高至少1V;而CAN_Low 线上的电压值会降低一个同样值,也是1v。 那么这时候,CAN_High 就是 2.5v+1v=3.5v,它就处于激活状态了。而CAN_Low 降为2.5v-1v=1.5v。可以看看这个图 由此我们得到 在隐性状态下,CAN_High 线与CAN_Low 没有电压差,这样我们看到没有任何变化也就检测不到信号。但是在显性状态时,改值最低为2V,我们就可以利用这种变化才传输数据了。所以出现了那些帧,那些帧中的场,那些场中的位,云云。

在总线上通常逻辑 1 表示隐性。而0 表示显性。这些 1 啊,0 啊,就可以利用起来为我们传数据了。利用这种电压差,我们可以接收信号。 一般来说,控制单元通过收发器连接到 CAN 驱动总线上,这个收发器(顾名思义,可发送,可接收)内有一个接收器,该接收器是安装在接收一侧的差动信号放大器。然后,这个放大器很自然地就放大了CAN_High 和CAN_Low 线的电平差,然后传到接收区。如下图 由上图可知,当有电压差,差动信号放大器放大传输,将相应的数据位转化为0。 下面我们进入重点难点-----报文 所谓报文,就是CAN 总线上要传输的数据报,为了安全,我们要给我们传输的数据报编码定一下协议,这样才能不容易出错,所以出现了很多的帧,以及仲裁啊,CRC 效验。这些都是难点。 识别符的概念 识别符顾名思义,就是为了区分不同报文的可以鉴别的好多字符位。有标准的,和扩展的。标准的是11 位,扩展的是29 位。他有一个功能就是可以提供优先级,也就是决定哪个报文优先被传输,报文标识符的值越小,报文具有越高的优先权。 CAN 的报文格式有两种,不同之处其实就是识别符长度不同,具有11 位识别符的帧称为标准帧,而还有29 位识别符的帧为扩展帧,CAN 报文有以下4 个不同的帧类型。分别是:

相关文档
最新文档