- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验18 CAN总线传输
【实验目的】
了解CAN总线工作原理;
学习LPC系列处理器CAN总线模块的使用方法;
【实验要求】
正确配置LPC处理器IO端口并正确初始化CAN总线模块;
编写程序实现CAN总线数据传输。
【实验原理】
一、LPC系列处理器CAN总线模块及CAN总线的原理
参见《ARM与嵌入式系统——基于LPC2470和IAR开发环境》中有关CAN总线的章节,重点掌握CAN总线工作原理及CAN总线模块的寄存器使用、数据传输操作方法等内容。本实验提供程序实现LPC处理器两个CAN总线模块之间的数据传输。程序通过串口把CAN发送数据读入LPC处理器,处理器把数据从CAN模块1发出,数据通过对连线发到CAN模块2;程序把数据从CAN模块2读出进行比较,验证数据传输正确后从串口回显传输数据。本程序使用了两种中断源:串口接收数据中断和CAN模块接收中断。
二、CAN总线收发器TJA1040简介
LPC处理器拥有两个CAN总线通道控制器,所以实验板只要增加CAN总线收发器就可以方便实现CAN总线。LPC处理器两个CAN总线通道各使用一片TJA1040。TJA1040是一款符合CAN 2.0规范,数据率可高达1Mbps的CAN总线收发器。TJA1040器件主要引脚功能说明如表18-1所示。
表16-1
引脚名称
功能说明
TXD
传输数据输入
RXD
接收数据输出
CANL
CAN总线低输出
CANH
CAN总线高输出
STB
就绪状态控制:高为就绪状态,低为正常状态。
三、实验板CAN总线电路
1.原理图
图16-2
2.说明
TJA1040的STB接地,使器件工作在正常模式下,RXD和TXD分别接CAN总线模块的RD和TD引脚。所以程序在初始化CAN模块时要先初始化I/O模块,正确配置引脚P0.0~1和P0.4~5。
四、程序工程模板说明
实验提供的程序工程模板中,主要有以下几个目录:
1.Common:共有四个源程序文件:cstartup.s79芯片的初始化汇编代码、target.c目标板的初始化C语言代码、irq.c中断实现程序、timer.c定时器程序。
2.Target:存放CAN模块的源程序CAN.c和串口模块源程序UART0.c。
3.User:存放CAN总线测试源程序testcan.c。
五、驱动程序说明
1. CAN.c说明
在本例中使用到的目标板驱动程序为CAN.c,提供函数如下:
1)CAN_Init():对CAN模块进行初始化,设置CAN模块工作模式,并挂载数据接收中断函数CAN_Handler。
2)CAN_Handler():CAN总线接收数据中断服务程序。通过判断CAN状态字调用不同通道的接收函数CAN_ISR_Rx1()或者CAN_ISR_Rx2()。具体CAN状态字意义请查阅教材CAN总线通信部分内容。
3)CAN_ISR_Rx1():CAN总线1通道接收数据。该函数只被中断服务函数调用。
4)CAN1_SendMessage():CAN总线1通道发送数据。
5)Msgconvert():把从CAN总线通道接收到数据转换成字符串格式,以便串口打印输出。
2.CAN.h说明
CAN.h是CAN.c的配套头文件,内容主要有:CAN总线传输时序的宏定义,CAN总线帧格式的结构体以及CAN.c中的几个函数的extern外部函数声明。
3.UART0.c说明
本文件提供串口0的基本读写函数及初始化函数,具体功能与串口实验中各函数功能相同。
4.UART0.h说明
本文件为UART0.c包含头文件,提供串口宏及外部函数说明。
【实验内容与步骤】
一、阅读例程
仔细阅读并理解实验提供的CAN.c和UART0.c源程序。掌握CAN总线读写方法以及用中断实现串口的读写方法。
二、编写用户测试程序
1、在源文件testcan.c中输入以下程序:
#include LPC2468.h /* LPC23xx definitions */
#include type.h
#include irq.h
#include can.h
#include timer.h
#include uart0.h
#include target.h
CAN_MSG MsgBuf_TX1, MsgBuf_TX2; // TX and RX Buffers for CAN message
CAN_MSG MsgBuf_RX1, MsgBuf_RX2; // TX and RX Buffers for CAN message
volatile DWORD CAN1RxDone, CAN2RxDone;
extern volatile DWORD UART0Count;
extern volatile BYTE UART0Buffer
文档评论(0)