OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6815|回复: 3

CAN通信求助各位:STM32自带CAN模块与STC+SJA100组合模块的通信

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-8-29
在线时间
11 小时
发表于 2014-8-29 14:00:49 | 显示全部楼层 |阅读模式
5金钱
STM32用的是STM32F103VET6,使用自带的CAN模块,其设置如下:
// CAN初始化
// tsjw 重新同步跳跃时间单元:范围 :1~3
//tbs2:时间段2的时间单元范围:1~8
//tbs1:时间段1的时间单元范围:1~16
//brp:波特率分频器范围:1~1024;(实际要加1,也就是1~1024)tp=(brp)*tpclk1
//注意以上参数任何一个都不能设为0,f否则会乱
//波特率=Fpclk1/((tbs1+tbs2+1)*brp);
//mode:0,普通模式;1,回环模式
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1) ;
//则波特率为36M/((8+7+1)*5)=450Kbps
//返回值:0;初始化 OK
// 其他,初始化失败
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
  u16 i=0;
  if(tsjw==0||tbs2==0||tbs1==0||brp==0)return 1;
  tsjw -= 1; // 先减去1.再用于设置
  tbs2 -= 1;
  tbs1 -= 1;
  brp  -= 1;
//  RCC->APB2ENR|=1<<2;    // 使能PORTA时钟
  GPIOA->CRH&=0XFFF00FFF;
  GPIOA->CRH|=0X000B8000; // PA11 RX ,PA12 TX 推挽输出
  GPIOA->ODR|=3<<11;
  RCC->APB1ENR|=1<<25;   // 使能CAN时钟,使用的是APB1的时钟(max:36M)
  CAN->MCR=0X00000000;       // 退出睡眠模式(同时设置所有位为0)
  CAN->MCR|=1<<0;         // 请求CAN 进入初始化模式
  while((CAN->MSR&1<<0)==0)
  {
    i++;
    if(i>100)return 2 ;  // 进入初始化失败
  }
  CAN->MCR|=0<<7;         // 非时间触发通信模式
  CAN->MCR|=0<<6;         // 软件自动离线管理
  CAN->MCR|=0<<5;         // 睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
  CAN->MCR|=1<<4;         // 禁止报文自动传送
  CAN->MCR|=0<<3;         // 报文不锁定,新的覆盖旧的
  CAN->MCR|=0<<2;         // 优先级由报文标识符决定
  CAN->BTR=0X00000000;    // 清除原来的设置
  CAN->BTR|=mode<<30;     // 模式设置  0,普通模式;1,回环模式
  CAN->BTR|=tsjw<<24;     // 重新同步跳跃宽度(tsjw)为tsjw+1个时间单位
  CAN->BTR|=tbs2<<20;     // tbs2=tbs2+1个时间单位
  CAN->BTR|=tbs1<<16;     // tbs1=tbs1+1个时间单位
  CAN->BTR|=brp<<0;       // 分频系数(Fdiv)为brp+1
                          // 波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)
  CAN->MCR&=~(1<<0);      // 请求CAN 退出初始化模式
  while((CAN->MSR&1<<0)==1)
  {
    i++;
    if(i>0xFFF0)return 3;  // 退出初始化模式失败
  }
  // 过滤器初始化
  CAN->FMR|=1<<0;           // 过滤组工作在初始化模式
  CAN->FA1R&=~(1<<0);       // 过滤器0不激活
  //CAN->FS1R|=1<<0;          // 过滤器位宽为32位
  CAN->FS1R&=~(1<<0);          // 过滤器位宽为2个16位
  CAN->FM1R|=0<<0;           // 过滤器0工作在标识符屏蔽位模式
  CAN->FFA1R|=0<<0;         // 过滤器0关联到FIFO0
  CAN->sFilterRegister[0].FR1=0X00000000;   //32位ID
  CAN->sFilterRegister[0].FR2=0X00000000;   //32位MASK
  //CAN->sFilterRegister[0].FR1=0X00000000;   //32位ID
  //CAN->sFilterRegister[0].FR2=0X00FF00FF;   //32位MASK
  CAN->FA1R|=1<<0;          //激活过滤器0
  CAN->FMR&=0<<0;           //过滤器组进入正常模式
  #if CAN_RX0_INT_ENABLE
    // 使能中断接收
    CAN->IER|=1<<1;         // FIFO0消息挂号中断允许
    MY_NVIC_Init(1,0,USB_LP_CAN_RX0_IRQChannel,2);  //组2
    //MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
  #endif
  return 0;
}
CAN_Mode_Init(1,6,8,30,mode);             // CAN初始化,波特率80kbps              这里请帮看一下,波特率初始化有问题没????

SJA100模块的设置是
unsigned char code SJA_BTR_CODETAB[]={
    0x53,0x2F,                //;20KBPS的预设值
    0x87,0xFF,                    //;40KBPS的预设值
    0x47,0x2F,                    //;50KBPS的预设值
    0x83,0xFF,                    //;80KBPS的预设值
    //0x04,0x2F,                    //;80KBPS的预设值
    0x43,0x2f,                    //;100KBPS的预设值
    0x03,0x1c,                    //;125KBPS的预设值
    0x81,0xfa,                    //;200KBPS的预设值
    0x01,0x1c,                    //;250KBPS的预设值
    0x80,0xfa,                    //;400KBPS的预设值
    0x00,0x1c,                    //;500KBPS的预设值
    0x80,0xb6,                    //;666KBPS的预设值
    0x00,0x16,                    //;800KBPS的预设值
    0x00,0x14                     //;1000KBPS的预设值
};
XBYTE[SJA1000_BUS_TIMER0] = SJA_BTR_CODETAB[ByteRate_80k]; //波特率设置


波特率设置为80Kbps,STM32发送,SJA1000接收;
发送的数据是 u8 CAN_SBuf[20]={0xAA,0xBB,0xCC,0x55,0x11,0x22,0x33,0x44};
接收到的数据是:10 00 6A 7B CC 95 11 22 33 84
帮看看是怎么回事,怀疑是波特率问题

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-8-29
在线时间
11 小时
 楼主| 发表于 2014-8-29 14:41:31 | 显示全部楼层
2块 STM32F103VET6板子之间通信没问题;2块SJA1000板子之间通信没问题,就是STM32F103VET6,和SJA1000时间通信不行,
更正一下,接收的数据是:08 10 00 6A 7B CC 95 11 22 33 84
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-8-29
在线时间
11 小时
 楼主| 发表于 2014-8-29 15:47:27 | 显示全部楼层
大神们指点一下,小弟初次调试CAN通信,,求帮忙一下。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-29 23:39:26 | 显示全部楼层
帮顶....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 08:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表