在线时间970 小时
UID1694538
注册时间2018-5-21
NXP金币1947
TA的每日心情 | 奋斗 1 小时前 |
---|
签到天数: 1995 天 [LV.Master]伴坛终老
金牌会员
- 积分
- 11867
- 最后登录
- 2024-4-19
|
本帖最后由 yinwuqing 于 2019-4-1 00:43 编辑
控制器局域网(CAN-Controller Area Network)属于现场总线(Fieldbus)的范畴,CAN总线在汽车电子领域用的非常普遍,具有通信速率高、可靠性强、连接方便、性能价格比高等诸多特点。它是一种有效支持分布式控制或实时控制的串行通信网络,以其短报文帧及CSMA/CD-AMP(带有信息优先权及冲突检测的载波监听多路访问)的MAC(媒介访问控制)方式而倍受工业自动化领域中设备互连的欢迎。 CAN总线以报文为单位进行信息传送,它支持4种不同类型的报文帧:数据帧、远程帧、超载帧和错误帧。报文中包含信息标识符ID,它标志了报文的优先权。CAN总线上各个节点都可主动发送,总线上的报文采用标识符ID进行仲裁,ID值越小,优先级越高。具有最高优先权报文的节点赢得总线使用权,而其它节点自动停比发送。在总线再次空闲后,这些节点将自动重发原报文。网络中的所有节点都可由ID来自动决定是否接收该报文。每个节点都有ID寄存器和屏蔽寄存器接收到的报文只有与该屏蔽的功能相同时,该节点才开始正式接收报文,否则它将不理睬ID后面的报文。这使CAN系统非常灵活,可任意扩展或改变网络组成。
本次测试将CAN1L与CAN2L连接 CAN1H与CAN2H连接 插上跳线帽JP5 将开发板与电脑用9针串口线进行连接,程序通过串口输入字符,开发板接收到字符后通过CAN1发送出去,CAN2接收到CAN1发送出来的数据然后通过串口打印出来,实验现象相当于是串口发送字符然后回显出来。CAN波特率设置为500K 串口波特率9600
根据宝马LPC1768开发板提供的一些资料,将源码补充修改移植如下:
- #include "lpc17xx.h"
- #include "can.h"
- #include "uart.h"
- /*****************************************************************************
- ** Main Function main()
- ******************************************************************************/
- int main(void)
- {
- uint8_t i = 0;
- SystemInit(); /*初始化目标板,切勿删除 */
-
- CAN_setup(CAN1); /*设置CAN控制器1 */
- CAN_setup(CAN2); /*设置CAN控制器2*/
- CAN_start(CAN1); /*启动CAN控制器1 */
- CAN_start(CAN2); /*启动CAN控制器2 */
- CAN_waitReady(CAN1); /*等待CAN控制器1就绪 */
- CAN_waitReady(CAN2); /*等待CAN控制器2就绪 */
- CAN_TxMsg[CAN1].id = 22; /*初始化帧信息*/
- CAN_TxMsg[CAN1].len = 1;
- CAN_TxMsg[CAN1].format = STANDARD_FORMAT;
- CAN_TxMsg[CAN1].type = DATA_FRAME;
- for (i = 0; i < 8; i++)
复制代码- #include "lpc17xx.h" /* LPC17xx definitions */
- #include "uart.h"
- #include "can.h"
- volatile unsigned char UART2_BUF;
- void UART2_IRQHandler(void)
- {
- uint32_t flag;
- flag = LPC_UART2->IIR; /* 读取(清除)中断中断状态 */
- flag &= 0x0F;
-
- if((flag == 0X04) && (LPC_UART2->LSR & 0X01))
复制代码- #include "CAN.h"
- CAN_FRAME CAN_TxMsg[2]; /* 发送缓冲区 */
- CAN_FRAME CAN_RxMsg[2]; /* 接收缓冲区 */
- unsigned int CAN_TxRdy[2] = {0,0}; /* 发送可用标识 */
- unsigned int CAN_RxRdy[2] = {0,0}; /* 接收完成标识 */
- /************************************************************
- ** 波特率设置
- ** NT = Nominal bit time = TSEG1 + TSEG2 + 3
- ** SP = Sample point = ((TSEG2 +1) / (TSEG1 + TSEG2 + 3)) * 100%
- ** SAM, SJW, TSEG1, TSEG2, NT, SP
- **************************************************************/
- const uint32_t CAN_BIT_TIME[] = {
复制代码
|
|