OpenEdv-开源电子网

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

stm32f105的CAN2口发送接收都失败。

[复制链接]

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
发表于 2014-9-26 15:27:34 | 显示全部楼层 |阅读模式
5金钱
现在单独测试两个口的发送,用示波器直接测量单片机的can两个引脚,CAN1的有方波,而CAN2 没有。起初怀疑单片机有问题,换了个一个还是这样,现在附上例程,求指点:
程序如下:
#include "stm32f10x.h"
#include"can.h"
/*******************************************************************
函数名称:CAN2_Init(u16 Baud)   *
函数功能:CAN2初始化函数   *
输入参数:u16 Baud:CAN2发送数据的波特率   *
输出参数:无   *
*******************************************************************/
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{

GPIO_InitTypeDef GPIO_InitStructure; 
CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE 
    NVIC_InitTypeDef  NVIC_InitStructure;
#endif
/*CAN1端口初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟                    
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO
/*CAN2端口初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTB时钟                    
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN2时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO
GPIO_PinRemapConfig(GPIO_Remap_CAN2,DISABLE);  
  /*CAN单元设置*/
  CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式
  CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理
  CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
  CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 
  CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的  
  CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 
  CAN_InitStructure.CAN_Mode= mode;         //模式设置: mode:0,普通模式;1,回环模式; 
  /*设置波特率*/
  CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
  CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
  CAN_InitStructure.CAN_BS2=tbs2; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq
  CAN_InitStructure.CAN_Prescaler=brp;        //分频系数(Fdiv)为brp+1
  CAN_Init(CAN1, &CAN_InitStructure);         // 初始化CAN1
CAN_Init(CAN2, &CAN_InitStructure);         // 初始化CAN2 
/*滤波器设置*/
CAN2->FMR|=14<<8; //设置CAN2的开始滤波器编号为14
  CAN_FilterInitStructure.CAN_FilterNumber=0;  //过滤器0
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位 
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器关联到FIFO0
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器

  CAN_FilterInit(&CAN_FilterInitStructure);//CAN1滤波器初始化
CAN2->FMR|=14<<8; //设置CAN2的开始滤波器编号为14
CAN_FilterInitStructure.CAN_FilterNumber=14;  //过滤器14
CAN_FilterInit(&CAN_FilterInitStructure);//CAN2滤波器初始化
#if CAN_RX0_INT_ENABLE

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.    
  
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn|USB_LP_CAN2_RX0_IRQn;  //USB低优先级或者CAN接收0中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
#if CAN_RX0_INT_ENABLE //使能RX0中断
//中断服务函数    
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
for(i=0;i<8;i++)
printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data);
}
void USB_LP_CAN2_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
int i=0;
    CAN_Receive(CAN2, 0, &RxMessage);
for(i=0;i<8;i++)
printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data);
}
#endif

//can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)
//len:数据长度(最大为8)     
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
// 其他,失败;
u8 Can1_Send_Msg(u8* msg,u8 len)
{
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12; // 标准标识符为0
  TxMessage.ExtId=0x12; // 设置扩展标示符(29位)
  TxMessage.IDE=0; // 使用扩展标识符
  TxMessage.RTR=0; // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len; // 发送两帧信息
  for(i=0;i<len;i++)
  TxMessage.Data=msg; // 第一帧信息          
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;

}
//can口接收数据查询
//buf:数据缓存区;  
//返回值:0,无数据被收到;
// 其他,接收的数据长度;
u8 Can1_Receive_Msg(u8 *buf)
{     
  u32 i;
CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //没有接收到数据,直接退出 
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//读取数据
    for(i=0;i<8;i++)
    buf=RxMessage.Data;  
return RxMessage.DLC;
}
u8 Can2_Send_Msg(u8* msg,u8 len)
{
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12; // 标准标识符为0
  TxMessage.ExtId=0x12; // 设置扩展标示符(29位)
  TxMessage.IDE=0; // 使用扩展标识符
  TxMessage.RTR=0; // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len; // 发送两帧信息
  for(i=0;i<len;i++)
  TxMessage.Data=msg; // 第一帧信息          
  mbox= CAN_Transmit(CAN2, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束
  if(i>=0XFFF)return 1;
  return 0;

}
//can口接收数据查询
//buf:数据缓存区;  
//返回值:0,无数据被收到;
// 其他,接收的数据长度;
u8 Can2_Receive_Msg(u8 *buf)
{     
  u32 i;
CanRxMsg RxMessage;
    if( CAN_MessagePending(CAN2,CAN_FIFO0)==0)return 0; //没有接收到数据,直接退出 
    CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);//读取数据
    for(i=0;i<8;i++)
    buf=RxMessage.Data;  
return RxMessage.DLC;
}
主函数循环如下
while(1)
{for(i = 0;i < 8;i++)
canbuf=cnt+i;

Can2_Send_Msg(canbuf,8); 

求大神指点

最佳答案

查看完整内容[请看2#楼]

以下代码本人测试通过的,可以参考如下: u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode,u8 dev_index) { u32 id; GPIO_InitTypeDef GPIO_InitStructure;  CAN_InitTypeDef        CAN_InitStructure; CAN_FilterInitTypeDef  CAN_FilterInitStructure; #if CAN1_RX0_INT_ENABLE      NVIC_InitTypeDef  NVIC_InitStructure; #endif RCC_APB2PeriphC ...
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-8-7
在线时间
7 小时
发表于 2014-9-26 15:27:35 | 显示全部楼层
以下代码本人测试通过的,可以参考如下:
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode,u8 dev_index)
{
u32 id;
GPIO_InitTypeDef GPIO_InitStructure; 
CAN_InitTypeDef        CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN1_RX0_INT_ENABLE 
    NVIC_InitTypeDef  NVIC_InitStructure;
#endif

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTB时钟
                 
/**********  CAN1 TX PIN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
    /**********  CAN1 RX PIN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO 

/* Remap CAN1 GPIOs */
//GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); //CAN1 重映射 PB8 ,PB9

/* CAN1 and CAN2 Periph clocks enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);   //使能CAN1时钟 
CAN_DeInit(CAN1);
//CAN单元设置
CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式  //
CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 //
  CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
  CAN_InitStructure.CAN_NART=DISABLE; //报文自动传送 //
  CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 // 
  CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 //
  CAN_InitStructure.CAN_Mode= mode;         //模式设置: mode:0,普通模式;1,回环模式; //
  //设置波特率
  CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
  CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
  CAN_InitStructure.CAN_BS2=tbs2; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq
  CAN_InitStructure.CAN_Prescaler=brp;          //分频系数(Fdiv)为brp+1 //
  CAN_Init(CAN1, &CAN_InitStructure);           // 初始化CAN1 

/* CAN1 filter init */
id = dev_index;
id <<= 19;
id |= 0x90000004;
CAN_FilterInitStructure.CAN_FilterNumber=0;  //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
  CAN_FilterInitStructure.CAN_FilterIdHigh=id>>16;////32位ID
  CAN_FilterInitStructure.CAN_FilterIdLow=id;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xb7f8;//32位MASK
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

id = 0x10000004;
CAN_FilterInitStructure.CAN_FilterNumber=1;  //过滤器1
CAN_FilterInitStructure.CAN_FilterIdHigh=id>>16;////32位ID
  CAN_FilterInitStructure.CAN_FilterIdLow=id;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xb7f8;//32位MASK
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

#if CAN1_RX0_INT_ENABLE

CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.    
  
  NVIC_InitStructure.NVIC_IRQChannel = 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;
}   
//////////////////////////////////////////////////////////////////////////////////
//CAN2初始化
//tsjw:重新同步跳跃时间单元.范围:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
//tbs2:时间段2的时间单元.范围:1~8;
//tbs1:时间段1的时间单元.范围:1~16;  CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
//注意以上参数任何一个都不能设为0,否则会乱.
//波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);
//mode:0,普通模式;1,回环模式;
//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);
//则波特率为:36M/((1+8+7)*5)=450Kbps
//返回值:0,初始化OK;
//    其他,初始化失败;


u8 CAN2_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
u32 id;
GPIO_InitTypeDef GPIO_InitStructure; 
CAN_InitTypeDef        CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN2_RX1_INT_ENABLE 
    NVIC_InitTypeDef   NVIC_InitStructure;
#endif

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTB时钟

/**********  CAN2 TX PIN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
    /**********  CAN2 RX PIN ***************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO 

/* Remap CAN2 GPIOs */
//GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE); //CAN2 重映射 PB5 ,PB6

/* CAN2 Periph clocks enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);   //使能CAN2时钟 
CAN_DeInit(CAN2);
//CAN单元设置
CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式  //
CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 //
  CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
  CAN_InitStructure.CAN_NART=DISABLE; //报文自动传送 //
  CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 // 
  CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 //
  CAN_InitStructure.CAN_Mode= mode;         //模式设置: mode:0,普通模式;1,回环模式; //
  //设置波特率
  CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
  CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq
  CAN_InitStructure.CAN_BS2=tbs2; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tq
  CAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1 //
 CAN_Init(CAN2, &CAN_InitStructure);            // 初始化CAN2

/* CAN2 filter init */
id = 0x00000004;
CAN_FilterInitStructure.CAN_FilterNumber=14;  //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
  CAN_FilterInitStructure.CAN_FilterIdHigh=id>>16;////32位ID
  CAN_FilterInitStructure.CAN_FilterIdLow=id;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x8000;//32位MASK
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO1;//过滤器0关联到FIFO1
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

id = 0x80000004;
CAN_FilterInitStructure.CAN_FilterNumber=15;  //过滤器1
CAN_FilterInitStructure.CAN_FilterIdHigh=id>>16;////32位ID
  CAN_FilterInitStructure.CAN_FilterIdLow=id;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x8000;//32位MASK
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0006;
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

#if CAN2_RX1_INT_ENABLE

CAN_ITConfig(CAN2,CAN_IT_FMP1,ENABLE);//FIFO1消息挂号中断允许.    
  
  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            // 次优先级为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
 
#if CAN1_RX0_INT_ENABLE //使能RX0中断
//中断服务函数    
void CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
int i=0;
 Can1_Led_pluse();

    CAN_Receive(CAN1, 0, &RxMessage);

/*********************数据入列*******************************/
CAN1_Rev_rear = (CAN1_Rev_rear+1)%MAXLEN;
CAN1_Rev_buf[CAN1_Rev_rear].ID_00 = RxMessage.ExtId;
CAN1_Rev_buf[CAN1_Rev_rear].ID_01 = RxMessage.ExtId>>8;
CAN1_Rev_buf[CAN1_Rev_rear].ID_02 = RxMessage.ExtId>>16;
CAN1_Rev_buf[CAN1_Rev_rear].ID_03 = RxMessage.ExtId>>24;
CAN1_Rev_buf[CAN1_Rev_rear].len = RxMessage.DLC;                           //读数据长度
CAN1_Rev_buf[CAN1_Rev_rear].mailbox_index = RxMessage.FMI; //过滤器匹配序号
for(i=0;i<CAN1_Rev_buf[CAN1_Rev_rear].len;i++)
{
CAN1_Rev_buf[CAN1_Rev_rear].buf = RxMessage.Data;                  //收数据
}
CAN1_Rev_num ++;
if(CAN1_Rev_num>MAXLEN)
{
CAN1_Rev_num = MAXLEN;
CAN1_Rev_front = CAN1_Rev_rear;
}
}
#endif

#if CAN2_RX1_INT_ENABLE //使能RX0中断
//中断服务函数    
void CAN2_RX1_IRQHandler(void)
{
  CanRxMsg RxMessage;
int i=0;
Can2_Led_pluse();
    CAN_Receive(CAN2, 1, &RxMessage);

 /*********************数据入列*******************************/
CAN2_Rev_rear = (CAN2_Rev_rear+1)%MAXLEN;
CAN2_Rev_buf[CAN2_Rev_rear].ID_00 = RxMessage.ExtId;
CAN2_Rev_buf[CAN2_Rev_rear].ID_01 = RxMessage.ExtId>>8;
CAN2_Rev_buf[CAN2_Rev_rear].ID_02 = RxMessage.ExtId>>16;
CAN2_Rev_buf[CAN2_Rev_rear].ID_03 = RxMessage.ExtId>>24;
CAN2_Rev_buf[CAN2_Rev_rear].len = RxMessage.DLC;                           //读数据长度
CAN2_Rev_buf[CAN2_Rev_rear].mailbox_index = RxMessage.FMI; //过滤器匹配序号
for(i=0;i<CAN2_Rev_buf[CAN2_Rev_rear].len;i++)
{
CAN2_Rev_buf[CAN2_Rev_rear].buf = RxMessage.Data;                  //收数据
}
CAN2_Rev_num ++;
if(CAN2_Rev_num>MAXLEN)
{
CAN2_Rev_num = MAXLEN;
CAN2_Rev_front = CAN2_Rev_rear;
}
}
#endif

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-26 23:07:18 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2014-10-7 08:23:45 | 显示全部楼层
回复【3楼】taoxu991:
---------------------------------谢谢,您有空能把完整的代码发到我的邮箱里吗?811323585@qq.com,
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2014-10-7 15:58:52 | 显示全部楼层
回复【3楼】taoxu991:
---------------------------------
您的代码我试过了,为什么CAN2口在正常模式下没有波形,但是在静默模式下却有啊?求指教
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-12-23 17:50:10 | 显示全部楼层
回复【5楼】玄子:
---------------------------------
解决了么,这两个CAN 是可以独立工作的么?你用的107吧
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2015-4-14 11:02:37 | 显示全部楼层
回复【6楼】wwjdwy:
---------------------------------
解决了,105
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-4-24
在线时间
0 小时
发表于 2015-4-27 14:50:42 | 显示全部楼层
两个can工作模式一定要一样吗?一旦我用正常模式发给回环模式的can数据时  回环模式的can接口就不能发数据了。这是可能是因为什么呢?
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2015-4-27 19:45:58 | 显示全部楼层
回环模式指的的一个口自己的行为。
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

16

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-15
在线时间
7 小时
发表于 2016-4-21 09:14:08 | 显示全部楼层
我正在调试f105的双can,遇到一个奇怪问题,程序是网络上的,如果编译时定义USE_STDPERIPH_DRIVER, STM32F10X_HD,,但是提示CAN2_NVIC_Config undefine,如果把can2部分的程序注释掉则can1可以收发;如果编译时定义USE_STDPERIPH_DRIVER, STM32F10X_CL,则提示USB_LP_CAN1_RX0_IRQn  undefine,如果把USB_LP_CAN1_RX0_IRQn改为CAN1_RX0_IRQn,编译可以通过了,但是程序运行就跑飞了,应该是中断入口不对,求哪位用过f105 can的给一个含完整头文件的例程。我用的startup_stm32f10x_cl.s是V3.5.0的,
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2017-4-14 14:08:35 | 显示全部楼层
西部经典 发表于 2016-4-21 09:14
我正在调试f105的双can,遇到一个奇怪问题,程序是网络上的,如果编译时定义USE_STDPERIPH_DRIVER, STM32F1 ...

STM32F105是互联型产品,所以只能定义STM32F10X_CL,同事启动文件也一样,
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-5-25
在线时间
0 小时
发表于 2017-5-25 09:21:46 | 显示全部楼层
楼主,你的问题是怎么解决的?我遇到跟你一样的情况
回复

使用道具 举报

12

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2014-5-14
在线时间
56 小时
 楼主| 发表于 2017-5-26 10:15:46 | 显示全部楼层
ruanxiaoke 发表于 2017-5-25 09:21
楼主,你的问题是怎么解决的?我遇到跟你一样的情况

我的是硬件问题,光耦隔离的时候有虚焊
有梦想,哪里都是你的舞台。哪怕从零开始,日积月累。终将厚积薄发!
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2018-4-8
在线时间
9 小时
发表于 2018-4-10 19:39:55 | 显示全部楼层
taoxu991 发表于 2014-9-26 15:27
**** 作者被禁止或删除 内容自动屏蔽 ****

请问为什么没有使能AFIO时钟可以重映射?还有我想问下您的32位MASK是怎么确定的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 11:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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