我使用STM32 F103RBCPU 做CAN总线通讯,当回环测试的时候获得发送状态正确,
//............................................................
u8 Can_Tx_Staus(u8 mbox)
{
u8 sta=0;
switch (mbox)
{
case 0:
sta |= CAN1->TSR&(1<<0); //RQCP0
sta |= CAN1->TSR&(1<<1); //TXOK0
sta |=((CAN1->TSR&(1<<26))>>24); //TME0
break;
case 1:
sta |= CAN1->TSR&(1<<8)>>8; //RQCP1
sta |= CAN1->TSR&(1<<9)>>8; //TXOK1
sta |=((CAN1->TSR&(1<<27))>>25); //TME1
break;
case 2:
sta |= CAN1->TSR&(1<<16)>>16; //RQCP2
sta |= CAN1->TSR&(1<<17)>>16; //TXOK2
sta |=((CAN1->TSR&(1<<28))>>26); //TME2
break;
default:
sta=0X05; //??????????,???¨?§°?.
break;
}
return sta;
}
读回的sta值为7 ,但是我使用正常模式时 ,读回的状态 sta 值为0 ,怎么回事呢?
CAN 初始化代码如下:
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode){
u16 i=0;
GPIO_InitTypeDef GPIO_InitStructure;
//CAN_InitTypeDef CAN_InitStructure;
// CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //????PORTB?±??
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); //????CAN1?±??
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //
GPIO_Init(GPIOB, &GPIO_InitStructure); //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure); //
if(tsjw==0||tbs2==0||tbs1==0||brp==0)return 1;
tsjw-=1;//??????1.???????è??
tbs2-=1;
tbs1-=1;
brp-=1;
CAN1->MCR=0x0000;
CAN1->MCR|=1<<0;
while((CAN1->MSR&1<<0)==0)
{
i++;
if(i>100)return 2; //???????????????§°?
}
CAN1->MCR|=0<<7;
CAN1->MCR|=0<<6;
CAN1->MCR|=0<<5;
// CAN->MCR|=1<<4; //
CAN1->MCR|=0<<3; //
CAN1->MCR|=0<<2; //
CAN1->BTR=0x00000000; //
CAN1->BTR|=0<<31;
CAN1->BTR|=mode<<30; //
CAN1->BTR|=tsjw<<24; //
CAN1->BTR|=tbs2<<20; //
CAN1->BTR|=tbs1<<16; //
CAN1->BTR|=brp<<0; //
//?¨????:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)
CAN1->MCR&=~(1<<0); //
while((CAN1->MSR&1<<0)==1)
{
i++;
if(i>0XFFF0)return 3;//???????????????§°?
}
CAN1->FMR|=1<<0; //
CAN1->FA1R&=~(1<<0); //?
CAN1->FS1R|=1<<0; //
CAN1->FM1R|=0<<0; //
CAN1->FFA1R|=0<<0; //
CAN1->sFilterRegister[0].FR1=0X00000000; //
CAN1->sFilterRegister[0].FR2=0X00000000; //
CAN1->FA1R|=1<<0; //
CAN1->FMR&=0<<0; //
#if CAN_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //FIFO0???????????????í.
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // ?÷????????1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // ??????????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
CAN的发送函数如下:
u8 Can_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat){
u8 mbox;
if(CAN1->TSR&(1<<26))mbox=0;
else if(CAN1->TSR&(1<<27))mbox=1;
else if(CAN1->TSR&(1<<28))mbox=2;
else return 0XFF;
CAN1->sTxMailBox[mbox].TIR=0;
if(ide==0)
{
id&=0x7ff;
id<<=21;
}
else
{
id&=0X1FFFFFFF;
id<<=3;
}
CAN1->sTxMailBox[mbox].TIR|=id;
CAN1->sTxMailBox[mbox].TIR|=ide<<2;
CAN1->sTxMailBox[mbox].TIR|=rtr<<1;
len&=0X0F;
CAN1->sTxMailBox[mbox].TDTR&=~(0X0000000F);
CAN1->sTxMailBox[mbox].TDTR|=len;
//??·???????????????.
CAN1->sTxMailBox[mbox].TDHR=(((u32)dat[7]<<24)|
((u32)dat[6]<<16)|
((u32)dat[5]<<8)|
((u32)dat[4]));
CAN1->sTxMailBox[mbox].TDLR=(((u32)dat[3]<<24)|
((u32)dat[2]<<16)|
((u32)dat[1]<<8)|
((u32)dat[0]));
CAN1->sTxMailBox[mbox].TIR|=1<<0;
return mbox;
}
主函数如下:
int main(void) {
u8 Msg;
u8 i=0,t=0;
u8 cnt=0;
u8 canbuf[8]={1,2,3,4,5,6,7,8};
u8 res;
u8 data;
u8 mode=0;
delay_init();
NVIC_Configuration();
CAN_Mode_Init(1,3,4,45,mode); //CAN??????,?¨????100Kbps
while(1)
{
res=Can_Send_Msg(canbuf,8);
if(res) Main_state= Can_Send_failse ;
else Main_state= Can_Send_ok ;
}
}
什么原因呢?先谢谢大家了
|