历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | CAN总线发送与接收函数

2019-09-30 来源:eefocus

初始化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);

}

推荐阅读

史海拾趣

E-tec Interconnect Ltd公司的发展小趣事

为了满足全球客户的需求,E-tec开始在全球范围内进行布局。他们在亚洲、欧洲和北美等地设立了生产基地和研发中心,实现了全球范围内的生产和销售。同时,E-tec还注重供应链的整合和优化,与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和成本控制。

上海晶岳(AFSEMI)公司的发展小趣事

在半导体行业中,供应链的稳定性和可靠性对于企业的生存和发展至关重要。晶岳电子深知这一点,因此一直致力于与流片及封装厂建立长期稳定的合作关系。公司的晶圆流片合作伙伴包括大陆的CSMC、ASMC,台湾的世界先进等公司;封装的合作伙伴则包括长电科技、上海芯哲等大陆上市企业。通过与这些合作伙伴的紧密合作,晶岳电子确保了产品质量的稳定性和交货期的可靠性,为公司的持续发展提供了有力保障。

这五个故事只是上海晶岳(AFSEMI)公司发展历程中的一部分,但它们充分展示了晶岳电子在电子行业中的崛起和成长。凭借对技术的执着追求和对市场的敏锐洞察,晶岳电子在激烈的市场竞争中脱颖而出,成为了行业内的一支重要力量。

Elite公司的发展小趣事

进入21世纪后,电子行业迎来了新的发展机遇和挑战。面对行业内的激烈竞争和技术的快速迭代,Elite意识到必须加快转型升级步伐。公司开始涉足智能家居、物联网等新兴市场领域,并成功推出了一系列具有竞争力的产品。这些新产品不仅为公司带来了新的增长点,也进一步巩固了Elite在电子行业的领先地位。

DBLECTRO公司的发展小趣事

在全球化的大背景下,迪贝电子也积极拓展海外市场。公司通过参加国际展览、与国际知名企业合作等方式,不断推广其品牌和产品。同时,公司还针对不同国家和地区的市场需求,推出了适应当地环境和使用习惯的产品。这些努力使得迪贝电子的产品逐渐得到了全球用户的认可和信赖。

EUCHNER公司的发展小趣事

随着全球化的发展,EUCHNER公司开始实施国际化战略,加强在全球市场的布局。公司在世界各地设立了多个分销处和办事处,以便更好地满足不同国家和地区的市场需求。同时,公司还积极与国际知名企业建立合作关系,共同推动工业自动化领域的进步。通过国际化战略和全球布局,EUCHNER公司的品牌影响力得到了进一步提升。

德力康(DLK)公司的发展小趣事

DLK公司一直将技术创新作为企业发展的核心驱动力。公司拥有一支高素质的研发团队,不断投入大量资金进行技术研发和产品创新。通过引进先进的生产设备和技术,结合自主研发,DLK公司成功开发出了一系列具有自主知识产权的连接器产品。这些产品不仅具有更高的性能和更稳定的品质,而且能够满足不同客户的个性化需求。技术创新使DLK公司在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

刚学visual studio 2005 下VC++编串口通信老是弄不通

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {                         if(COM1->Checked == true)   &nbs ...…

查看全部问答>

我想用testcap写了个虚拟摄像头驱动程序,但是我怎么把视频数据传递给驱动呢,谢谢你们指教!

我想用testcap写了个虚拟摄像头驱动程序,但是我怎么把视频数据传递给驱动呢,谢谢你们指教!…

查看全部问答>

wince下的ftp客户端问题

在wince(或wm5)下实现ftp客户端后,用gprs发数据失败 听说gprs在某一时间只会分配不固定的IP和一个可用端口,而ftp需要2个,一个传信息,一个传数据 请问如果用类似NAT穿透的技术能否达到目的? 我主要是想从wince上传文件到服务器,很多人都 ...…

查看全部问答>

labview怎么跟汇编语言联啊

想用labveiw做一些接口实验,但是需要用到汇编语言,怎么联啊…

查看全部问答>

纳米测量中学习曲线 和灵敏度/分辨率的挑战

仪器操作中繁琐的编程[1]工作以及神秘的种种细节会分散工作繁重的研究者的精力。许多电特性测量工具[2]都极为复杂,而且它们的数据传输机制极为冗琐,需要大容量的存储介质。图形分析所花费的时间也过长。学习和编程设定的工作会占用本来应该用于 ...…

查看全部问答>

用线程解决网络断开重连的问题

网络断开重连-------线程   网络断开后重连的问题,可以使用线程去重连,即创建一个线程专门负责去建立连接,如果连接断开,则由这个线程去重新连接,连接完成后,这个线程则会阻塞(休眠)。        ...…

查看全部问答>

FIR滤波问题

void fir_filter(void) {         int i,j;         float sum;         float x1[932];         float h[31]={ 0.01492972,0.01096342,0.01458647,0.0186, ...…

查看全部问答>

【TI首届低功耗设计大赛】第二个外设程序 MSP430FR5969读取ADXL362数据通过CC1101发送

本帖最后由 littleshrimp 于 2014-12-27 13:24 编辑 世界上最低功耗的MCUMSP430FR5969+世界最低功耗的加速度传感器ADXL362堪称完美组合。组合完能嘎蛤?谁知道,先跑起来再说。MSP430FR5969就不介绍了,那不是一搬的强大。ADXL362是一款超低功耗 ...…

查看全部问答>

TMDSEVM6678L

2015年2月份才能入关发货,还没到手,够新了吧,想换个达芬奇系列开发板,XDS560仿真器也行…

查看全部问答>