嵌入式作业(八)CAN总线

作业:

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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值