软件定义汽车 (SDV) 的特点是 AI、自主、连接和电气化。最近,汽车行业已开始采用“基于服务”的方法来设计 SDV 的现代应用。这种称为面向服务的架构 (SOA) 的方法为开发软件应用提供了一种新范式,其特点是高重用性、易于更新以及与硬件的松散耦合。SOA 的构建原则是一个应用由一组服务组成,这些服务可以被动态地发现、发布、订阅和在运行时重新配置。SOA 的概念已被广泛纳入行业标准,包括 AUTomotive Open System ARchitecture (AUTOSAR)。
物理层
CRC错误:发送与接收的CRC值不同发生该错误; 格式错误:帧格式不合法发生该错误; 应答错误:发送节点在ACK阶段没有收到应答信息发生该错误; 位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误; 位填充错误:通信线缆上违反通信规则时发生该错误。
#
define
REG_BASE_ADDR 0xA000
// 寄存器基址
unsigned
char
*SJA_CS_Point = (
unsigned
char
*) REG_BASE_ADDR ;
// 写SJA1000寄存器
void
WriteSJAReg
(
unsigned
char
RegAddr,
unsigned
char
Value)
{
*(SJA_CS_Point + RegAddr) = Value;
return
;
}
// 读SJA1000寄存器
unsigned
char
ReadSJAReg
(
unsigned
char
RegAddr)
{
return
(*(SJA_CS_Point + RegAddr));
}
……
for
(i=
0
; i<len; i++)
{
WriteSJAReg(RegAdr + i, ValueBuf[i]);
}
……
……
for
(i=
0
; i<len; i++)
{
ReadSJAReg(RegAdr + i, ValueBuf[i]);
}
……
-
每个程序包含用到的头文件 -
每个程序包含一个公用头文件,公用头文件包含所有其他头文件
#
ifndef
__CONFIG_H__
// 防止头文件被重复包含
#
define
__CONFIG_H__
#
include
<8051.h>
// 包含80C51寄存器定义头文件
#
include
"SJA1000REG.h"
// 包含SJA1000寄存器定义头文件
// 定义取字节运算
#
define
LOW_BYTE(x) (unsigned char)(x)
#
define
HIGH_BYTE(x) (unsigned char)((unsigned int)(x) >> 8)
// 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)
#
define
OSCCLK 11059200UL
// 宏定义MCU的时钟频率
#
define
CPUCLK (OSCCLK / 12)
#
endif
// __CONFIG_H__
char
SetSJASendCmd
(
unsigned
char
cmd)
{
unsigned
char
ret;
switch
(cmd)
{
default
:
case
0
:
ret = SetBitMask(REG_CAN_CMR, TR_BIT);
//正常发送
break
;
case
1
:
ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT);
//单次发送
break
;
case
2
:
ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);
//自收自发
break
;
case
0xff
:
ret = SetBitMask(REG_CAN_CMR, AT_BIT);
//终止发送
break
;
}
return
ret;
}
unsigned
char
SJA_CAN_Filter[
8
] =
{
// 定义验收滤波器的参数,接收所有帧
0x00
,
0x00
,
0x00
,
0x00
,
// ACR0~ACR3
0xff
,
0xff
,
0xff
,
0xff
// AMR0~AMR3
};
unsigned
char
STD_SEND_BUFFER[
11
] =
{
// CAN 发送报文缓冲区
0x08
,
// 帧信息,标准数据帧,数据长度 = 8
0xEA
,
0x60
,
// 帧ID = 0x753
0x55
,
0x55
,
0x55
,
0x55
,
0xaa
,
0xaa
,
0xaa
,
0xaa
// 帧数据
};
void
main
(
void
)
// 主函数,程序入口
{
timerInit();
// 初始化
D1 =
0
;
SJA1000_RST =
1
;
// 硬件复位SJA1000
timerDelay(
50
);
// 延时500ms
SJA1000_RST =
0
;
SJA1000_Init(
0x00
,
0x14
, SJA_CAN_Filter);
// 初始化SJA1000,设置波特率为1Mbps
// 无限循环,main()函数不允许返回
for
(;;)
{
SJASendData(STD_SEND_BUFFER,
0x0
);
timerDelay(
100
);
// 延时1000ms
}
}
来源:网络
原文始发于微信公众号(谈思实验室):嵌入式开发必懂的 CAN 总线知识
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论