EDN China > 设计实例 > 通信 > 正文
?

基于dsPIC33FJ128MC506的CAN通信

山东省科学院自动化研究所 张云 李明强 庄汝科?? 2009年04月14日 ?? 收藏0

  系统硬件

  利用TJA1054作为CAN收发器,dsPIC33FJ128MC506 CAN通讯要注意的是,在处理器和收发器之间要加光耦以隔离两者之间的电源。原理图如图1所示。

  系统初始化

  Microchip公司的dspPIC33FJ128MC506芯片中ECAN通信模块的初始化分为五个部分:系统工作时钟设置、ECAN接收和发射缓冲区的设置、ECAN波特率的设置、接收过滤寄存器和屏蔽寄存器的设置以及ECAN收发器TJA1054的启动。

dsPIC33FJ128MC506 CAN通讯原理图

图1 dsPIC33FJ128MC506 CAN通讯原理图

  系统工作时钟设置

  dsPIC33FJ128MC506可以选择多种外部和内部振荡器作为时钟源,并通过时钟控制寄存器OSCCON进行设置。对时钟的选择要在系统的配置存储区(0x800000-0xFFFFFF)进行,在程序中一般通过几句宏指令语句指定。

  以下语句选择时钟并禁能看门狗,其他的功能请参看芯片说明书。

  _FOSCSEL(FNOSC_PRIPLL); //选用带PLL的主振荡器

  _FOSC(POSCMD_HS); // 主振荡器为HS型晶振

  _FWDT(FWDTEN_OFF); // 看门狗禁能

  下面的函数对系统时钟进行配置, 外部晶振为8MHz,系统工作时钟为40MHz。

  void oscConfig(void)

  {

  CLKDIVbits.PLLPRE = 0; //外设时钟2分频为4M

  PLLFBDbits.PLLDIV = 18; //20倍频,为80M

  CLKDIVbits.PLLPOST = 0; //外设时钟2分频为40M

  while(OSCCONbits.LOCK!=1){ }; //等待设置生效

  }

  ECAN接收和发射缓冲区的设置

  DMA(直接存储器访问)方式是外设SFR与RAM间进行数据复制的非常高效的机制,dsPIC33FJ128MC506的ECAN模块支持DMA传输,共有8个DMA通道可供选择。在此我们选用0和2通道分别作为ECAN1的发射和接收。初始化语句如下:

  DMA0通道初始化为ECAN1发射:

  void dma0init(void)

  {

  DMACS0=0; //清DMA控制器状态位

  DMA0CON=0x2020; //DMA为外设间接寻址模式,支持从DMA读,并写到外设

  DMA0PAD=0x0442; //DMA0PAD下载为ECAN1发射寄存器的地址

  DMA0CNT=0x0007; //传输计数寄存器为8

  DMA0REQ=0x0046; //DMA外设REQ编号选择位

  DMA0STA= __builtin_dmaoffset(ecan1msgBuf); //DMA起始地址位

  DMA0CONbits.CHEN=1;

  }

  DMA2通道初始化为ECAN1接收:

  void dma2init(void)

  {

  DMACS0=0; //清DMA控制器状态位

  DMA2CON=0x0020; //DM为外设间接寻址模式,支持从DMA写,并读到外设

  DMA2PAD=0x0440; //DMA0PAD下载为ECAN1接收寄存器的地址

  DMA2CNT=0x0007; //传输计数寄存器为8

  DMA2REQ=0x0022; //DMA外设REQ编号选择位

  DMA2STA= __builtin_dmaoffset(&ecan1msgBuf[2][0]); //DMA起始地址位

  DMA2CONbits.CHEN=1;

  }

  上面程序中的“DMA0STA= __builtin_dmaoffset(ecan1msgBuf);”和“ DMA2STA= __builtin_dmaoffset(&ecan1msgBuf[2][0]); ”分别指明了DMA的起始地址位为ecan1msgBuf和(&ecan1msgBuf[2][0],ecan1msgBuf是一个两维数组,在相关头文件中定义,其语句为:

  ECAN1缓冲器的设置:

  #define ECAN1_MSG_BUF_LENGTH 4 //长度为4个字

  //缓冲区为二维数据

  typedef unsigned int ECAN1MSGBUF [ECAN1_MSG_BUF_LENGTH][8];

  //数组位于DMA空间

  extern ECAN1MSGBUF ecan1msgBuf __attribute__((space(dma)));


上一页12345下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

dsPIC33FJ128MC506? CAN? TJA1054?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈