作业:
1.对于
can
的驱动函数文件加注释。在
can
(加注释)
.c
中标了“
//2024.6
”的语句加以理解并写出注释。放入博客中。
2.实验完成后,将结果截图、连线照片、实验原理图和
CAN
原理介绍,放入博客中。
首先是结果截图,展示 :
代码修改:
NodeA-main.c:
while(1)
{
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
if (mMainLoopCount<=12889000) continue;
mMainLoopCount=0;
can_send(CAN_1, txMsgID, 20, (uint8_t*)"32106200027");//发送内容
printf("\n");
}
CAN原理介绍:
CAN
协议特点:
(1)
多主控制
I2C
有主从机之分,
CAN
无所谓主机从机。在总线空闲时,所有的单元都可开始发送消息(多主控制)。“最先”访问总线的单元可获得发送权(不管后面消息的优先级是否比自身的高)。多个单元“同时”开始发送时,发送高优先级
ID
消息的单元可获得发送权(只在同时发送时起作用)。
(2) 消息的发送
CAN的标识符
ID
其实非地址,而是一种表征优先级的标识符。在
CAN 协议中,所有的 消息都以固定的格式发送。当两个以上的单元同时开始发送消息时,根据ID (
标识符
)
决 定优先级,对各消息
ID
的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高) 的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作
can(注释).c:
//======================================================================
// 文件名称:can.c
// 功能概要:uart底层驱动构件源文件
// 版权所有:苏州大学嵌入式系统与物联网研究所(sumcu.suda.edu.cn)
// 更新记录:2021-02-03 V1.0 JJL
//======================================================================
#include "can.h"
CAN_TypeDef *CAN_ARR[] = {(CAN_TypeDef *)CAN1_BASE}; // CAN寄存器数组,包含一个指向CAN1_BASE地址的指针
IRQn_Type table_irq_can[2] = {CAN1_RX0_IRQn, CAN1_RX1_IRQn}; // 中断请求号数组,包含 CAN1 的两个接收中断请求号
uint8_t can_send_once(uint8_t canNo, uint32_t DestID, uint16_t len, uint8_t *buff);
uint8_t CAN_HWInit(uint8_t CANChannel);
uint8_t CAN_SWInit_Entry(uint8_t canNo);
void CAN_SWInit_CTLMode(uint8_t canNo);
void CAN_SWInit_BT(uint8_t canNo, uint32_t CANMode, uint32_t Prescaler);
uint8_t CAN_SWInit_Quit(uint8_t canNo);
uint8_