在控制GM6020过程中,我花了相当长相当长相当长的时间排除了一个BUG:CAN接收中断不能发送电机信息,无法接收
while (1)
{
Can_Send(0x1000,0,0,0);
}
一段一段检查代码,发现是因为CAN通信不能在持续发送中接收信息,所以发送电机信息间隔1ms,这样CAN通信有时间来接收信息!所以将代码改为:
while (1)
{
Can_Send(0x1000,0,0,0);
HAL_Delay(1);
Can_Send(0x1000,0,0,0);
}
最后将接收信息发送到串口
总之一句话,CAN是半双工通信,不能同时发送和接收。
串行通信分类
1、按照数据传送方向,分为:
单工数据传输:支持数据在一个方向上传输;
半双工数据传输:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工数据通信:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
2、按照通信方式,分为:
同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。
异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线,RS485,CAN总线
3、具体通信协议
-
SPI---------同步通信;串行通信;全双工;主从通信(某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机)。
-
I2C---------同步通信;串行通信;半双工;主从通信(总线上支持多个主机和多个从机,总线上任何能够进行发送/接收数据的设备都可以占领总线。当然,任意时间点上只能存在一个主控。多主控,主器件同时争夺总线控制权时,可仲裁)。
-
UART-----异步通信;串行通信;全双工; 对等总线,没有仲裁机制,所以只能挂载两个同时收发数据的设备,双方都可以发送和接收。
-
USART—通用同步异步收发器,跟uart一样,它是个设备,一个要完成特定功能的硬件,本身不是协议…
-
RS485----异步通信;串行通信;半双工;RS485是单主从结构,即一个总线上只能有一台主机,通讯都由它发起的,它没有下命令,下面的节点不能发送,而且要发完即答,收到答复后,主机才向下一个节点询问,这样是为了防止多个节点向总线发送数据,而造成数据错乱。
-
CAN-------异步通信;串行通信;半双工;CAN是多主从结构,每个节点都有CAN控制器,多个节点发送时,以发送的ID号自动进行仲裁,这样就可以实现总线数据不错乱,而且一个节点发完,另一个节点可以探测到总线空闲,而马上发送,这样省了主机的问,提高了总线利用率,增强了快速性。所以在汽车等实性要求高的系统,都是用CAN总线。