CAN总线发送与接收函数
来源:互联网 发布:linux客户端是什么意思 编辑:程序博客网 时间:2024/06/11 23:42
初始化CAN模块
void INIT_CAN0(void) { if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态 CAN0CTL0_INITRQ =1; // 进入初始化状态 while (CAN0CTL1_INITAK==0); //等待进入初始化状态 CAN0BTR0_SJW = 0; //设置同步 CAN0BTR0_BRP = 7; //设置波特率 CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s // 关闭滤波器 CAN0IDMR0 = 0xFF; CAN0IDMR1 = 0xFF; CAN0IDMR2 = 0xFF; CAN0IDMR3 = 0xFF; CAN0IDMR4 = 0xFF; CAN0IDMR5 = 0xFF; CAN0IDMR6 = 0xFF; CAN0IDMR7 = 0xFF; CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用外部晶振,使用总线时钟源 CAN0CTL0 = 0x00; //返回一般模式运行 while(CAN0CTL1_INITAK); //等待回到一般运行模式 while(CAN0CTL0_SYNCH==0); //等待总线时钟同步 CAN0RIER_RXFIE = 1; //禁止接收中断}
Bool MSCAN0SendMsg(struct can_msg msg){ unsigned char send_buf, sp; if(msg.len > 8) // 检查数据长度 return(FALSE); if(CAN0CTL0_SYNCH==0) // 检查总线时钟 return(FALSE); send_buf = 0; do { CAN0TBSEL=CAN0TFLG; // 寻找空闲的缓冲器 send_buf=CAN0TBSEL; } while(!send_buf); CAN0TXIDR0 = (unsigned char)(msg.id>>3);<span style="font-family: Arial, Helvetica, sans-serif;">// 写入标识符</span> CAN0TXIDR1 = (unsigned char)(msg.id<<5); if(msg.RTR) CAN0TXIDR1 |= 0x10; // RTR = 阴性 for(sp = 0; sp < msg.len; sp++) // 写入数据 *((&CAN0TXDSR0)+sp) = msg.data[sp];
CAN0TXDLR = msg.len; // 写入数据长度 CAN0TXTBPR = msg.prty; // 写入优先级 CAN0TFLG = send_buf; // 清 TXx 标志 (缓冲器准备发送) return(TRUE); }
接收函数
Bool MSCAN0GetMsg(struct can_msg *msg){ unsigned char sp2; if(!(CAN0RFLG_RXF)) // 检测接收标志 return(FALSE); if(CAN0RXIDR1_IDE) <span style="font-family: Arial, Helvetica, sans-serif;">// 检测 CAN协议报文模式 (一般/扩展) 标识符</span> // IDE = Recessive (Extended Mode) return(FALSE); msg->id = (unsigned int)(CAN0RXIDR0<<3) <span style="font-family: Arial, Helvetica, sans-serif;">// 读标识符</span><span style="font-family: Arial, Helvetica, sans-serif;">| </span> (unsigned char)(CAN0RXIDR1>>5); if(CAN0RXIDR1&0x10) msg->RTR = TRUE; else msg->RTR = FALSE; msg->len = CAN0RXDLR; <span style="font-family: Arial, Helvetica, sans-serif;">// 读取数据长度 </span> for(sp2 = 0; sp2 < msg->len; sp2++)<span style="font-family: Arial, Helvetica, sans-serif;">// 读取数据</span> msg->data[sp2] = *((&CAN0RXDSR0)+sp2); CAN0RFLG = 0x01; <span style="font-family: Arial, Helvetica, sans-serif;">// 清 RXF 标志位 (缓冲器准备接收)</span> return(TRUE);}
0 0
- CAN总线发送与接收函数
- socket中的发送与接收函数
- socket中的发送与接收函数
- Cotex-M3 LM9S92 CAN总线发送数据
- 485总线与CAN总线的区别
- CAN总线多帧即连续帧数据发送 拆包与重装
- CAN总线疑惑与解答
- CAN总线与CANOPEN协议
- STM32--CAN简单接收和发送
- STM32 CAN 发送和接收过滤原理
- 邮件发送与接收
- 广播发送与接收
- socket 发送与接收
- 发送与接收事件
- STM32的CAN总线的接收双FIFO使用方法
- 单片机串口接收发送函数
- socket函数接收发送详解
- can总线与485总线有什么区别?
- 字符串转成实数-atof
- ACM--百分比求值--HDOJ 1701--ACMer--水
- 序列和索引
- JD 2016年实习生笔试题
- 训练3 习题11
- CAN总线发送与接收函数
- GC基本概念
- 架构漫谈(三):如何做好架构之识别问题
- java 二进制和十六进制的互转
- java中16位或32位MD5加密
- popupwindow实现类似ActionBar右侧更多效果
- POJ3630 静态建立trie
- Cocos开发VR菜鸟宝典 第三讲:Cocos 开发 VR环境搭建
- iOS 9 Auto Layout界面自动布局系列6-自适应布局