CAN总线发送与接收函数

发布者:liliukan最新更新时间:2019-09-30 来源: eefocus关键字:CAN总线  发送  接收函数 手机看文章 扫描二维码
随时随地手机看文章

初始化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);// 写入标识符

  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)             // 检测 CAN协议报文模式 (一般/扩展) 标识符

    // IDE = Recessive (Extended Mode)

    return(FALSE);                               

  msg->id = (unsigned int)(CAN0RXIDR0<<3) // 读标识符|

            (unsigned char)(CAN0RXIDR1>>5); 

  if(CAN0RXIDR1&0x10)

    msg->RTR = TRUE;

  else

    msg->RTR = FALSE;                                   

  msg->len = CAN0RXDLR;            // 读取数据长度                                  

  for(sp2 = 0; sp2 < msg->len; sp2++)// 读取数据

    msg->data[sp2] = *((&CAN0RXDSR0)+sp2);                              

  CAN0RFLG = 0x01;                  // 清 RXF 标志位 (缓冲器准备接收)

  return(TRUE);

}

关键字:CAN总线  发送  接收函数 引用地址:CAN总线发送与接收函数

上一篇:stm32的can总线理解及应用——程序对应stm32f103系列
下一篇:STM32之CAN系列经验总结

推荐阅读最新更新时间:2024-11-13 22:11

STM32中USART常用的发送函数
1.中断模式 void USART2_IRQHandler(void) //串口2中断服务程序 { u8 u8Temp; /*****************发送中断************************************/ if (USART_GetITStatus(USART2, USART_IT_TXE) == SET) { if(TX2_cn == TX2_no) { DIS_485TX(); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); USART_ITConfig(USART2, USART_IT_RXNE, EN
[单片机]
如何用您的手机控制CAN总线
传统的CAN通信仅局限于PC机与电气导线连接的现场应用,面对当今移动设备大规模占据生活中的各个领域,我们CAN通信也不能固步自封,在无线与APP应用领域,使用手机等移动设备监控CAN总线成为未来一个趋势。 自1990年奔驰公司发布了第一辆使用CAN-bus通信的轿车之后,CAN-bus便成为了通讯界里一颗闪亮的星星,在车载设备的通讯中更是一枝独秀。但面对目前这快速发展的新世界,传统应用方案下的线缆组网,PC机监控已无法满足我们新时代的需求,限制了CAN-bus通信的应用场合。 如果说手机的使用拉近了人与人之间的距离,那么智能手机的出现,各种APP应用程序的深入用户群体,则是完全改变了新时代人类的生活方式。物联网、智能工厂、
[嵌入式]
如何用您的手机控制<font color='red'>CAN总线</font>
STM32串口发送数据详解
串口的中断方式: /** * @brief Enables or disables the specified USART interrupts. * @param USARTx: where x can be 1 or 2 to select the USART peripheral. * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * @arg USART_IT_WU: Wake up interru
[单片机]
STM32串口<font color='red'>发送</font>数据详解
认识CAN总线
目前我们的救援机器人的上下层通讯用的是CAN总线的方式,那么what is CAN zongxian? 它又有什么特点呢? 1、什么是CAN总线 介绍CAN总线之前我们先来介绍下什么是总线吧:总线将分散的有通信能力的测量控制设备作为网络节点,连接成能相互沟通信息,共同完成自控任务的控制网络。就像这样 简单说,现场总线就是以数字通信替代了传统4-20mA 模拟信号 及普通开关量信号的传输,是连接智能现场设备和自动化系统的全数字、双向、多站的通信系统。而今天要讲的CAN总线就是是国际上应用最广泛的现场总线之一。(这么NB啊) CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任
[嵌入式]
STM8L 在USART中使用DMA来发送接收数据
以USART为例子来使用DMA 分两部分,第一为,DMA这个外设自身的配置;第二为,USART的DMA部分配置, DMA与USART的DMA配置 void SYS_DMA_Init(void) { CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE); /span //打开时钟,很重要 /* Deinitialize DMA channels */ DMA_GlobalDeInit(); DMA_DeInit(DMA1_Channel1); DMA_DeInit(DMA1_Channel2); /* DMA channel Rx of USART Co
[单片机]
微信BUG还是手机BUG? 发送19+15个句号导致手机崩溃
 新浪手机讯 9月25日下午消息,有用户在使用微信时发现,当发送“19。。。。。。。。。。。。。。。”(19后面为15个句号)时,手机会出现崩溃的情况,目前已有多名用户中招。据了解,这并不是病毒问题,应该是系统BUG。   目前出现这个问题的手机有:荣耀8、华为Mate 9、华为P10、华为P9、魅族MX6、OPPO A73这6款机型,而相应的微信版本为6.5.15.13(全新版本为6.5.17)。所以据猜测,可能是微信版本方面出现的BUG,但也有很大几率与手机本身的适配相关,因为小米手机在测试中并没有出现崩溃的情况。   对于这个问题相关用户表示,暂时没有有效的解决办法,只能重启手机并删除相应的聊天窗口,但这意味着聊天记录也会
[手机便携]
串行口通信上位机发送0~65536间的数据,数码管上显示
一. 硬件设计 二. 软件设计 1. 程序功能 以16进制发送一个0-65536之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定. 2. 程序源码 #include reg52.h #define uchar unsigned char #define uint unsigned int #define BUF_LEN 2 sbit dula = P2 ^ 6; sbit wela = P2 ^ 7; uint inbuf , dData; uchar flag, count; uchar wan, qian, bai, shi, ge; //数码管编码表 uc
[单片机]
串行口通信上位机<font color='red'>发送</font>0~65536间的数据,数码管上显示
基于CAN总线的多ECU通信平台设计
  引言   随着集成电路和单片机在汽车上的广泛应用,现代汽车上的电子控制器的数量越来越多,常见的有发动机的电子燃油喷射装置、防抱死制动装置(ABS)、安全气囊装置、电动门窗装置、主动悬架等。电控系统的增加虽然提高了轿车的动力性、经济性和舒适性,但随之增加的复杂电路也降低了汽车的可靠性,增加了维修的难度。从布线角度分析,传统的电子气系统大多采用点对点的单一通信方式,相互之间少有联系,这样必然造成宠大的布线系统。因此,一种新的概念——汽车上电子控制器局域网络CAN,也就应运而生。为使不同厂家生产的零部件能在同一辆汽车上协调工作,必须制定标准。按照ISO有关标准,CAN的拓扑结构为总线式,因此称为CAN总线。 CAN总线被设计作为汽
[单片机]
基于<font color='red'>CAN总线</font>的多ECU通信平台设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved