简介:MC9S12系列微控制器是飞思卡尔设计的高性能16位微控制器,广泛应用于汽车电子和工业控制等多节点实时数据交换的领域。本指南详细介绍了实现MC9S12中CAN通讯的关键知识,包括CAN控制器的工作原理、CAN总线配置、消息处理、工具使用、端口编程、报文的发送与接收、错误处理、滤波器配置以及中断驱动等内容。
1. MC9S12微控制器和CAN通讯协议基础
在当今快速发展的汽车电子领域,MC9S12微控制器以其高性能和灵活性在实时控制中扮演着重要角色。本章将首先介绍MC9S12微控制器的基础知识,以及它在汽车控制系统中的广泛应用。随后,我们将深入探讨CAN通讯协议的起源和其在现代工业通信中的重要地位。作为汽车工业中的标准总线技术,CAN(Controller Area Network)通讯协议因其高可靠性、高效率和强大的错误检测能力而广受青睐。我们将介绍CAN协议的基本概念,包括它的物理层和数据链路层,以及在MC9S12微控制器中的实现机制。这将为理解后续章节中更复杂的CAN控制器功能、报文处理策略以及配置方法奠定坚实的基础。
2. CAN控制器的内置功能及报文处理
2.1 CAN控制器的内置功能
2.1.1 CAN控制器的硬件结构
在MC9S12微控制器中,CAN(Controller Area Network)控制器是一个高度集成的模块,负责在车辆或设备的不同部分之间提供实时通讯。CAN控制器的主要硬件结构包含以下部分:
- 消息缓冲器(Message Buffer) :用于暂存发送和接收的消息,以实现数据的缓冲。
- 验收过滤器(Acceptance Filter) :确保控制器只处理与系统相关的消息,提高效率。
- 位流处理器(Bit Stream Processor) :负责与CAN总线的物理接口,执行位定时、发送和接收位流。
- 错误检测和管理(Error Detection and Management) :检测数据传输过程中的错误,并触发适当的错误处理程序。
下图是一个简化版的MCU中CAN模块硬件结构示意图:
graph LR
A[CAN总线] -->|消息| B[位流处理器]
B -->|消息| C[消息缓冲器]
C -->|过滤后的消息| D[验收过滤器]
D -->|相关消息| E[微控制器核心]
2.1.2 CAN控制器的软件架构
CAN控制器的软件架构则涉及以下几个层面:
- 初始化层 :配置CAN控制器的参数,如波特率、滤波器、消息对象等。
- 管理层 :管理消息的发送和接收过程,包括排队、调度和中断服务。
- 应用层 :提供一个与用户应用程序交互的接口,用于处理具体的应用数据。
软件架构图示如下:
graph TB
A[应用层] -->|配置请求| B[管理层]
B -->|初始化| C[初始化层]
C -->|参数设置| D[硬件]
D -->|状态/数据| C
C -->|状态/数据| B
B -->|处理过的消息| A
2.2 CAN报文处理
2.2.1 报文的发送和接收
CAN报文的发送和接收过程对实时性和可靠性至关重要。为了确保通讯的顺利进行,CAN控制器具备以下特点:
- 非破坏性仲裁 :当两个或多个节点尝试同时发送消息时,通过仲裁机制确保优先级高的消息优先发送。
- 错误检测 :如循环冗余检查(CRC)等,以确保数据的完整性。
- 确认和回声验证 :确保发送的消息已被正确接收。
报文发送和接收的伪代码示例如下:
// 报文发送伪代码
void sendMessage(Message msg) {
// 检查消息缓冲区是否可用
if (messageBufferIsAvailable()) {
// 将消息写入消息缓冲区
writeToMessageBuffer(msg);
// 发送消息
transmitMessage();
}
}
// 报文接收伪代码
void receiveMessage() {
// 检查是否有消息到达
if (messageIsAvailable()) {
// 读取消息
Message msg = readFromMessageBuffer();
// 处理消息
processMessage(msg);
}
}
2.2.2 报文的优先级和仲裁
CAN协议规定,ID号较低的消息具有较高的优先级。在仲裁过程中,如果多个节点尝试同时发送消息,ID号较低的消息将赢得仲裁,得以继续发送。
仲裁过程的代码逻辑可能如下:
// 仲裁过程的代码逻辑(简化版)
if (localID < competingID) {
// 本地ID较低,赢得仲裁
continueTransmission();
} else if (localID > competingID) {
// 竞争ID较低,停止发送
abortTransmission();
}
以上代码表示,在仲裁过程中,如果本地ID比竞争者的ID低,则继续发送消息;否则,放弃当前的发送尝试。这种机制确保了数据的正确发送和网络的高效运行。
3. CAN总线配置方法与消息框应用
3.1 CAN总线配置
3.1.1 波特率设置
在CAN通讯中,波特率设置至关重要,因为它决定了总线上的数据传输速度。波特率的选择依赖于多个因素,包括系统的响应时间要求、网络距离、以及总线上的节点数量。一个典型的CAN网络可以以不同的速度运行,从10 kbps到1 Mbps不等。在设置波特率时,需要考虑以下参数:同步段长度、时间段1( PROP 段)、时间段2( PHASE 1段)、时间段3(PHASE 2段)、采样点以及预分频器的值。
为了配置波特率,通常采用以下步骤:
- 计算所需的时钟频率,该频率是根据所需的波特率和预分频器确定的。
- 使用时钟频率和期望的波特率来确定时间段的具体值。
- 调整采样点位置,以确保数据的正确采样。
下面是一个简化的代码片段,展示如何在MC9S12微控制器上设置波特率:
// CAN波特率计算示例代码
#define PRESCALER 4 // 预分频器值
#define BRP_CLOCK 16000000UL // CAN模块输入时钟
#define NOMINAL_BITRATE 500000 // 名义波特率
#define SJW 1 // 同步跳转宽度
unsigned int tseg1, tseg2, sjw, ps;
unsigned long int baudrate;
unsigned long int baudrate_error;
// 计算波特率误差
baudrate = (BRP_CLOCK / (PRESCALER * (1 + tseg1 + tseg2))) / 2;
baudrate_error = (baudrate < NOMINAL_BITRATE) ? (NOMINAL_BITRATE - baudrate) : (baudrate - NOMINAL_BITRATE);
// 调整时间段以减少误差
// 这里需要优化算法确保时间段设置合理
// 设置CAN模块的波特率寄存器
CAN_BTR = ((PRESCALER - 1) | (tseg1 << 16) | (tseg2 << 24) | (SJW << 20));
在上述代码中,通过调整 PRESCALER 、 tseg1 、 tseg2 等值来达到理想的波特率,并减少误差。
3.1.2 位定时参数配置
在CAN通信中,正确配置位定时参数是保证通信稳定的关键。这些参数包括同步段长度、时间段1(PROP 段)、时间段2(PHASE 1段)、时间段3(PHASE 2段)等。位定时参数需要按照以下步骤进行配置:
- 根据系统时钟频率和预期的波特率计算出总时间宽度。
- 确定同步段长度,通常为1个时间单位。
- 根据系统的物理特性,选择合适的PROP段和PHASE 1段的长度,以保证数据的可靠传输。
- 根据传播延迟和振荡器容忍度设置PHASE 2段的长度,以及同步跳转宽度(SJW)。
下面是一个表格,展示了位定时参数配置的示例:
| 参数 | 描述 | 取值范围 | 推荐值 | |------|------|----------|--------| | BRP | 预分频器 | 1-64 | 10 | | TSEG1 | 时间段1 | 1-32 | 4 | | TSEG2 | 时间段2 | 1-8 | 2 | | SJW | 同步跳转宽度 | 1-8 | 2 | | SAM | 采样点 | 30%-80% | 75% |
通过上述表格,可以根据网络特性和物理环境,对MC9S12微控制器进行位定时参数的配置。接下来,我们将探讨消息框的工作原理和实际应用。
3.2 消息框的理解和使用
3.2.1 消息框的工作原理
消息框是CAN控制器中用于发送和接收消息的对象。它提供了缓冲区功能,可以存储待发送或已接收的消息。消息框包括标识符、数据长度、数据字段以及消息状态信息。消息框可以被配置为发送器或接收器,也可以同时具备这两种功能。
消息框的工作原理是基于消息过滤和消息调度机制。在发送消息时,消息框的内容被传递到CAN总线上。在接收消息时,消息框通过标识符进行过滤,只接收与之匹配的消息。
在CAN控制器内部,每个消息框都有一个相应的硬件寄存器组,用于管理消息的发送与接收状态。这些寄存器包括数据缓冲区、标识符寄存器、数据长度寄存器等。
消息框通常支持优先级管理,以确保高优先级的消息能够优先通过总线。这一机制通过配置消息框的优先级寄存器来实现。
3.2.2 消息框的应用实例
假设我们有一个基于MC9S12微控制器的车辆动力总成系统,需要使用CAN总线进行通信。我们希望设置两个消息框:一个用于发动机控制器消息的发送,另一个用于接收来自刹车系统控制器的紧急消息。
下面是一个简单的应用实例:
- 初始化CAN模块和消息框
- 配置消息框1为发送器,用于发动机控制器
- 配置消息框2为接收器,用于接收紧急消息
以下是相应的代码片段:
// 初始化CAN模块
CANInit(CAN1, &can1Settings);
// 配置消息框1为发送器
CANConfigMB(CAN1, MB1, &txSettings);
// 配置消息框2为接收器
CANConfigMB(CAN1, MB2, &rxSettings);
// 发送发动机控制器消息
CANMBData txMsg;
txMsg.id = 0x123; // 发送消息的ID
txMsg.len = 8; // 数据长度为8字节
memcpy(txMsg.buf, &engineData, 8); // 填充数据
CANMBTransmit(CAN1, MB1, &txMsg);
// 接收紧急消息
CANMBData rxMsg;
if (CANMBReceive(CAN1, MB2, &rxMsg)) {
// 处理接收到的紧急消息
刹车系统处理函数(rxMsg.buf);
}
在这个例子中,我们使用CAN模块的初始化函数和配置消息框的函数,来设置消息框的不同模式。消息发送和接收函数分别用于处理数据的发送和接收。
接下来,我们将进入第四章,探讨CAN编程工具与通讯实现的各个方面。
4. CAN编程工具与通讯实现
4.1 过程专家工具介绍
4.1.1 过程专家工具的界面和功能
过程专家(PEd)是一款为MC9S12微控制器系列的CAN模块设计的高级编程工具。它的用户界面友好,可以帮助开发者快速进行CAN通信的配置和编程。
过程专家工具的主要界面可以分为以下几个部分:
- 项目管理区 :允许用户创建、打开、保存项目,并管理项目中的文件。
- 配置区 :用于设定CAN模块的基本参数,包括波特率、时间段设置等。
- 消息框配置区 :用于设定和查看消息框的属性,如ID过滤、帧格式等。
- 代码生成区 :展示了根据用户配置自动生成的代码片段。
- 日志输出区 :显示工具操作的详细日志,便于调试和记录。
4.1.2 过程专家工具在代码生成中的作用
过程专家工具最大的优势是能够根据用户的配置自动生成代码。这意味着开发者能够避免从头编写大量底层代码,从而专注于业务逻辑的实现。
工具通过以下步骤实现代码的生成:
- 配置解析 :分析用户在界面中的配置输入,并转换成代码配置结构。
- 模板匹配 :根据预定义的代码模板,根据解析出的配置结构进行匹配。
- 代码生成 :将匹配的模板填充相应的参数后生成代码文件。
例如,当开发者设置了一个新的消息框,过程专家工具会自动创建一个消息框处理函数,并在适当的地方插入中断服务例程代码。
// 代码示例:生成的消息框处理函数
void CAN_MESSAGEBOX_0_RX_ISR(void) {
// 处理接收到的消息框0中的消息
}
4.1.3 使用过程专家工具的步骤
- 安装和启动过程专家工具 :下载工具并安装在开发环境中。
- 创建新项目或打开现有项目 :通过菜单选择新建或打开操作。
- 进行CAN模块的配置 :通过配置界面填写所需的参数。
- 配置消息框 :在消息框配置区域设定消息的ID、类型等参数。
- 生成代码 :点击生成按钮,工具会输出配置好的代码文件。
- 将生成的代码集成到项目中 :把生成的代码文件复制到实际项目中,并进行必要的调整和补充。
- 编译和调试 :编译整个项目,解决可能出现的编译错误,并进行调试。
4.2 CAN端口编程和端口扩展策略
4.2.1 CAN端口编程的原理和方法
CAN端口编程实际上是基于MC9S12微控制器的CAN模块来实现的。编程主要涉及以下几个方面:
- 初始化CAN模块 :设置CAN波特率、定时器、中断等。
- 配置消息框 :设定消息框的ID、大小、类型等属性。
- 发送和接收消息 :编写相应的发送和接收函数来处理消息的发送和接收。
- 错误处理 :编写错误检测和处理的代码来确保通信的可靠性。
// 代码示例:CAN模块初始化
void CAN_init(void) {
// 初始化CAN模块相关的寄存器
}
4.2.2 端口扩展策略和实现
在实际应用中,一个CAN控制器可能需要与多个外设进行通信,这就需要端口扩展策略。端口扩展可以通过添加CAN扩展器来实现,也可以通过软件方式模拟。
- 硬件扩展 :通过CAN总线扩展器,如PCA82C250、TJA1050等,可以增加更多的物理端口。
- 软件扩展 :通过消息框的分组和优先级配置,可以实现逻辑上的端口扩展。
// 代码示例:硬件扩展
void CAN擴展器配置(void) {
// 配置硬件扩展器的寄存器
}
4.3 报文发送与接收的实现
4.3.1 报文发送的步骤和注意事项
报文发送步骤包括:
- 配置消息框 :设定要发送的消息的ID、类型、长度和数据。
- 激活发送请求 :向CAN模块发出发送请求。
- 等待发送完成 :等待发送完成中断或查询发送完成状态。
注意事项:
- 数据完整性 :确保发送数据的完整性和准确性。
- 错误处理 :在发送过程中要处理可能发生的错误。
- 发送优先级 :根据业务需求合理设置消息的优先级。
// 代码示例:发送一个标准数据帧
void CAN发送消息(void) {
// 设置消息框属性,激活发送请求
}
4.3.2 报文接收的处理方法
报文接收处理步骤:
- 配置消息框 :设定消息框以接收特定ID的消息。
- 接收消息 :CAN模块自动接收消息到配置好的消息框。
- 消息确认和处理 :确认接收到的消息并进行必要的业务逻辑处理。
处理方法:
- 中断驱动 :通过中断服务程序处理接收到的消息。
- 轮询方式 :通过轮询检查消息框的状态来处理接收到的消息。
// 代码示例:通过中断处理接收到的消息
void CAN_RX_ISR(void) {
// 检查消息框状态,处理接收到的消息
}
在本章节中,我们详细介绍了过程专家工具的界面和功能,以及如何使用它来简化CAN端口编程和报文处理的复杂性。我们还探讨了报文发送和接收的实现方法,以及在实际应用中可能遇到的一些注意事项。通过以上内容,读者应该能够更好地理解和掌握如何在实际项目中使用和优化CAN通讯技术。
5. CAN通讯高级策略和故障排除
5.1 CAN滤波器配置和过滤机制
CAN滤波器的主要目的是决定哪些报文被接收以及哪些被忽略,这是确保数据流管理的重要步骤。滤波器配置不当可能导致不必要的报文干扰,降低通信效率。
5.1.1 滤波器的配置方法
- 标识符过滤 :通过设置报文的ID,过滤器可以决定接收还是忽略某个报文。例如,如果只对ID为0x123的报文感兴趣,那么其他所有报文都将被忽略。
- ** маскирование**:在过滤时可以使用 маски(屏蔽码),以确定哪些ID位是“关心”的,哪些是“不关心”的。例如, маски 0x7FF将只考虑报文ID的前11位,忽略剩下的位。
- 范围过滤 :某些控制器允许定义一个ID范围,例如0x100到0x200之间,只有在这个范围内的报文才会被接收。
/* 一个简单的CAN滤波器配置示例 */
void CAN_Filter_Config(void)
{
/* 初始化滤波器结构 */
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterNumber = 0; // 选择滤波器
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // 设置过滤模式为ID掩码
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // 设置32位过滤器
sFilterConfig.FilterIdHigh = (uint16_t)(0x123 << 5); // ID高位
sFilterConfig.FilterIdLow = (uint16_t)(0x0000); // ID低位
sFilterConfig.FilterMaskIdHigh = (uint16_t)(0x7FF << 5); // 高位 маски
sFilterConfig.FilterMaskIdLow = (uint16_t)(0x0000); // 低位 маски
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; // 报文将被放置在FIFO0
sFilterConfig.FilterActivation = ENABLE; // 激活滤波器
sFilterConfig.SlaveStartFilterBank = 14; // 从过滤器组14开始
// 应用滤波器配置
if(HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
// 处理错误...
}
}
5.1.2 过滤机制的工作原理和应用
当CAN控制器接收到一个报文时,它会将报文的标识符与所有激活的滤波器进行比较。如果标识符与任何滤波器的配置相匹配,则报文被传递到相应的FIFO队列中。否则,报文被忽略。
过滤器的应用场景非常广泛,例如,它们可以用来区分不同类型的消息,或对车辆的不同子系统进行分组,确保只有相关数据被传递给特定的处理模块。
5.2 中断驱动通讯的实现和优势
5.2.1 中断驱动通讯的实现方法
中断驱动的CAN通信方法依赖于中断来处理接收到的报文。当CAN控制器接收到一个报文时,会触发一个中断。在中断服务例程(ISR)中,接收到的数据会被读取和处理。
/* CAN接收中断服务例程示例 */
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
{
// 读取消息时出错处理...
}
// 处理接收到的数据
// ...
}
5.2.2 中断驱动通讯的优势和应用场景
中断驱动通讯的主要优势在于实时性。它允许系统在接收到数据时立即做出响应,这对于需要即时处理数据的应用非常有用,例如实时控制系统或安全关键系统。
中断驱动方法特别适合于那些数据流量不是非常高,但是要求快速响应的应用场景。这种方法可以降低CPU的负载,因为它不需要周期性地轮询CAN控制器来检查是否有新数据到来。
5.3 CAN通信中的错误处理策略
5.3.1 错误检测和诊断方法
在CAN通信中,常见的错误检测机制包括循环冗余校验(CRC)和帧检查序列(FCS)。当接收到一个报文时,接收端会验证报文的CRC,并检查帧的格式和内容,以此来确定报文是否在传输过程中出错。
5.3.2 错误处理策略和恢复机制
当检测到错误时,通常会采取以下步骤进行恢复:
- 错误通知 :CAN控制器会向系统发送一个错误通知,告知错误类型。
- 自动重传 :在某些情况下,如果报文发送失败,CAN控制器会自动尝试重新发送报文。
- 软件重置 :如果错误持续存在,软件可以通过重置CAN控制器或整个CAN总线来尝试恢复。
错误恢复机制是实现健壮CAN通信系统的必要组成部分。它们确保了系统能够持续运行,即使在面对传输错误时也能保持通信的完整性。
简介:MC9S12系列微控制器是飞思卡尔设计的高性能16位微控制器,广泛应用于汽车电子和工业控制等多节点实时数据交换的领域。本指南详细介绍了实现MC9S12中CAN通讯的关键知识,包括CAN控制器的工作原理、CAN总线配置、消息处理、工具使用、端口编程、报文的发送与接收、错误处理、滤波器配置以及中断驱动等内容。

3636


被折叠的 条评论
为什么被折叠?



