初级会员

- 积分
- 115
- 金钱
- 115
- 注册时间
- 2014-8-29
- 在线时间
- 11 小时
|
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
帮看看是怎么回事,怀疑是波特率问题 |
|