TMS320F28377X芯片can通信心得笔记

@[TO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

CAN总线异步半双工串口通信…的很多优点,广泛用于近距现场通信,以下是个人笔记:
Can总线通信协议:传输的为差分信号,两根线为CANH(“高位”) CANL(‘低位’) ,其二者电位差 分为显性(2V)与隐性(0V),显性为数字信号0,隐性为数字信号1;CAN总线物理上有:线与和回读机制(注意理解,核心)

提示:以下是本篇文章正文内容,下面案例可供参考

一、Can总线协议构成

主要分为三块:CAN控制器、CAN收发器、CAN总线;
1,CAN控制器:一般集成在MCU芯片内部,(外置也可以,自己搭配),买包含的MCU,查看其技术文档就是,此处TMS320F28377D和F2377S内部是包含有点的,
2,CAN收发器:自己搭配选择
3,CAN总线:有开环和闭环方式,两种都要并电阻,也就是简单的两根导线和电阻构成

二、CAN通信报文

在这里插入图片描述
注意看每部分构成的位数(数字),这是参考别人上传的图片,修改了其中错误的部分;
数据帧包含主要消息ID,数据长度,数据…

三、F28377X芯片内CAN控制器框图

在这里插入图片描述
图来源TI公司提供的该的芯片的技术文档,图中可以了解到的消息:
1,有32个消息对象(也可叫消息邮箱,可以使用);
,2,只能通过IFx接口寄存器间接访问CAN的消息邮箱;
3,有两条中断线CANINT0,CANINT1;接口 CAN RX和CAN TX到CAN收发器。
备注:消息邮箱,顾名思议,存储消息(数据帧,不只有 数据)消息邮箱有邮箱号,1到32号;
MCU(DSP)想发消息,实际是通IFx(接口寄存器,IF1和IF2)把消息(数据)给消息邮箱,再通过IFx告诉邮箱把数据发送出去;cpu想读消息,也是通过IFx接口寄存器去读消息邮箱的数据

四、F28377X芯片CAN通信流程(软件程序)

1,接口选择配置GPIO引脚给CAN收发器,电路设计时参考TI技术文件看GPIO引脚复用,在可用的GPIO中选择,配置GPIO功能为CAN RX与CAN TX;
2,配置CAN参数与初始化,最后启动CAN
3,配置建立消息邮箱;
4,收发消息的处理操作;(你想发什么消息,收到消息怎么做)
配置邮箱:配置邮箱号 ,消息ID ,掩码,邮箱方向(发送邮箱还是接受接收),
接收邮箱:当总线上数据帧消息ID与已建立的邮箱的消息ID匹配则写入该邮箱,总线上正常开启的设备都会收到总线上的信息,其中设备中的接收邮箱的消息ID匹配则接收成功,没有匹配者无操作;

五、F28377X芯片CAN通信中断

在这里插入图片描述
有三种中断类型可配置;
F28377x的CAN模块中断框图
在这里插入图片描述

六,结尾

理解有限,要想熟练准确运用CAN,得多看相关文档,TI提供那些技术文档要多看,和多码代码,加油兄弟们,姐妹们, 以上不一定很准确,若发现错误,谢谢指正`…

  • 5
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
针对 TI 公司的 TMS320F28377 芯片进行 CAN 通信编程,可以使用该芯片所提供的 HALCoGen 软件包来生成初始化代码。以下是一个简单的示例,展示了如何使用 HALCoGen 生成的代码进行 CAN 通信: 1. 在 HALCoGen 中配置 CAN 模块: - 打开 HALCoGen 软件包,并选择你的芯片型号。 - 在 "Device Configuration" 中启用 CAN 模块并进行相应的配置,如波特率、接收和发送缓冲区大小等。 - 生成代码并导出到你的工程目录。 2. 在你的工程中包含相关头文件: ```c #include "F2837xD_device.h" // TMS320F28377芯片设备头文件 #include "F2837xD_can.h" // CAN模块相关头文件 ``` 3. 初始化 CAN 模块: ```c void InitCan(void) { // 使用 HALCoGen 生成的初始化代码 InitSysCtrl(); InitGpio(); InitPieCtrl(); InitPieVectTable(); // 初始化 CAN 模块 InitCanA(); // 根据实际使用的 CAN 模块进行修改,如 InitCanA() 或 InitCanB() } ``` 4. 发送 CAN 消息: ```c void SendCanMessage(uint32_t msgId, uint32_t data) { struct ECAN_REGS ECanaShadow; // 设置 CAN 消息对象 ECanaShadow.CANME.all = ECanaRegs.CANME.all; ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; ECanaShadow.CANME.bit.ME0 = 1; // 使能消息对象 0 ECanaRegs.CANME.all = ECanaShadow.CANME.all; ECanaShadow.CANMD.bit.MD0 = 0; // 设置消息对象 0 为发送模式 ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; // 设置 CAN 消息数据和 ID ECanaMboxes.MBOX0.MDL.all = data; ECanaMboxes.MBOX0.MDH.all = msgId; // 发送 CAN 消息 ECanaShadow.CANTRS.all = ECanaRegs.CANTRS.all; ECanaShadow.CANTRS.bit.TRS0 = 1; // 触发发送消息对象 0 ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all; } ``` 5. 接收 CAN 消息: ```c void ReceiveCanMessage(void) { struct ECAN_REGS ECanaShadow; // 检查是否有新的接收消息 if (ECanaRegs.CANRMP.bit.RMP0 == 1) { // 读取接收到的 CAN 消息 uint32_t msgId = ECanaMboxes.MBOX0.MDH.all; uint32_t data = ECanaMboxes.MBOX0.MDL.all; // 处理接收到的消息 // 清除接收标志 ECanaShadow.CANRMP.all = ECanaRegs.CANRMP.all; ECanaShadow.CANRMP.bit.RMP0 = 1; ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; } } ``` 请注意,以上示例代码仅用于演示基本的 CAN 通信操作,并假设你已经正确配置了 CAN 模块的参数。具体的配置和操作可能因你的应用需求而有所不同,你需要根据 TI 提供的技术文档和参考手册进行进一步的学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值