|
发表于 2011-6-29 16:16:05
|
显示全部楼层
波特率配置:24M,设置为500Kbps
CAN0ADR=BRPEXT; //BRPEXT,BRP扩展寄存器索引号0x06
CAN0DATL=0x00; //
CAN0ADR=BITREG; //BITREG,位定时寄存器索引号0x03
CAN0DAT=0x58C2; //BRP=2,三分频0X58C2
//f=24M ,tq=(1/24M)*3=125ns 三分频,500Kb/s速率,1/500K=2000ns=16tq
//Sync_Seg/Prop_Seg/Phase_Seg1/Phase_Seg2 : 1tq/4tq/5tq/6tq
//BRPE = BRP – 1 = BRP 扩展寄存器 =3-1= 2
//SJW = min ( 4, Phase_Seg1)= 4; SJWp = SJW – 1 = 3
//TSEG1 = (Prop_Seg + Phase_Seg1 – 1) = 4 + 5 –1 = 8
//TSEG2 = (Phase_Seg2 – 1) = 5
//位时间寄存器 = TSEG2 * 0x1000 + TSEG1 * 0x0100 + SJWp * 0x0040 +BRPE = 0x58C2
发送前查询寄存器状态:
char val;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDRQST ;
val = CAN0DAT ;
while (val & 0x8000)
{ // IF1 是否正在忙着写其他,是则等待
CAN0ADR = IF1CMDRQST ;
val = CAN0DAT ;
}
查询总线状态:
CanState=CAN0STA;
while(CanState & 0x80 ==0x80)
{
CanState=CAN0STA;
}
我是这么写的,可能不合理,但没出问题,欢迎讨论,请指点! |
|