OpenEdv-开源电子网

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

CAN总线发送数据问题

[复制链接]

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
发表于 2014-1-8 11:30:42 | 显示全部楼层 |阅读模式
     我使用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 ;            
}
}

什么原因呢?先谢谢大家了



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

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2014-1-8 11:54:15 | 显示全部楼层
把初始化部分加上    CAN1->MCR|=1<<4;   //禁止自动重传后  , sta |= CAN1->TSR&(1<<1);    CAN发送成功状态不正确,
sta |= CAN1->TSR&(1<<0);   sta |=((CAN1->TSR&(1<<26))>>24);           //TME0     这两个状态正确了
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2014-1-8 17:00:50 | 显示全部楼层
经过调试观察TSR寄存器,发现是邮箱0 错误发送失败引起的,什么原因啊?如何解决呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-8 17:50:30 | 显示全部楼层
你有两个板子在测试没有?
CAN正常通信,需要2个板子才能测试!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2014-1-8 20:17:10 | 显示全部楼层
我其中的一个用的USBCAN模块 ,用它自身带的上位机软件它是正常的
回复 支持 反对

使用道具 举报

17

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-8-23
在线时间
0 小时
发表于 2014-1-9 03:06:01 | 显示全部楼层
看看CAN收发器芯片供电电压
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
 楼主| 发表于 2014-1-9 08:15:04 | 显示全部楼层
测了,供电电压正常,5V,谢谢兄弟
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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