打印

exam的例程中的can求助,香版主帮忙

[复制链接]
6287|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mike58|  楼主 | 2008-1-6 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调英倍特板子的stm32中的can程序
例子是自收自发模式,我修改为普通模式,但是在应用中,发送接收的时候就出问题了

比如:
can发送邮箱3个都是满的,可是就是发不出去信号,按照datasheet一步步来写程序还是不成。
单步调过了,实在看不出什么问题


请高手帮忙!谢谢
沙发
香水城| | 2008-1-6 16:28 | 只看该作者

如果是英蓓特板子上的例程,要请英蓓特的朋友来解答了

我这里还没有做到这个部分,需要请英蓓特的朋友来解答,我可以帮你转告他们。

使用特权

评论回复
板凳
mike58|  楼主 | 2008-1-6 17:37 | 只看该作者

好的,谢谢香版主

那就有劳你了

使用特权

评论回复
地板
lvkush0903| | 2008-1-6 20:24 | 只看该作者

同问!can好像有这个问题

我用stm的固件程序发现
使用普通模式从初始化模式中退出时
MSR中的INRQ总还是1!
不知有谁用通过can一并请教了

使用特权

评论回复
5
ijk| | 2008-1-6 21:46 | 只看该作者

STM32的CAN没有问题啊

STM32的CAN,可以参考如下初始化代码:
  CAN_InitTypeDef CAN_InitStructure;
  RCC_ClocksTypeDef RCC_ClocksStatus;
  u32 prescaler;

  // CAN IO configuration ------------------------------------//
  // Enable GPIOB & AFEN(Alternate Function) clock //
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  // remap(Remap1_CAN) CAN to PB8, PB9 as CAN_RX, CAN_TX - to avoid v glitch on CAN_TX pin
  GPIO_PinRemapConfig(GPIO_Remap1_CAN, ENABLE);// Remap1 of CAN

  // Set PB8 as floating IN - CAN_RX
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // Set PB9 as PP AF first - CAN_TX
  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);

  // Get clock prescaler for CAN
  RCC_GetClocksFreq(&RCC_ClocksStatus);
  // Get the multipier for APB1_CLK - based on 8M Hz
  prescaler = RCC_ClocksStatus.PCLK1_Frequency/8000000;
  // CAN configuration --------------------------------------//
  // CAN configured as follow:
  //      - BaudRate = 100k baud  
  //      - CAN_TTCM disabled
  //      - CAN_ABOM disabled
  //      - CAN_AWUM disabled
  //      - CAN_NART disabled
  //      - CAN_RFLM disabled
  //      - CAN_TXFP disabled
  //      - Normal Mode
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = DISABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_7tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler = 5 * prescaler;// @various APB clock

  CAN_Init(&CAN_InitStructure);

使用特权

评论回复
6
ijk| | 2008-1-6 21:49 | 只看该作者

STM32的CAN

STM32的CAN,可以参考如下发送代码:

  CAN_FilterInitTypeDef CAN_FilterInitStruct;
  CanTxMsg TxMessage;
  CanRxMsg RxMessage;
  u32 i;

  //    Filter setup
  CAN_FilterInitStruct.CAN_FilterNumber=1;
  //CAN_FilterInitStruct.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStruct.CAN_FilterMode= CAN_FilterMode_IdList;
  CAN_FilterInitStruct.CAN_FilterScale=CAN_FilterScale_16bit;
  CAN_FilterInitStruct.CAN_FilterIdHigh=0x6420;//standID:0x321,IDE=0 stand,RTR=0 data frame
  CAN_FilterInitStruct.CAN_FilterIdLow=0x0000;//no mask
  CAN_FilterInitStruct.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStruct.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStruct.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;
  CAN_FilterInitStruct.CAN_FilterActivation=ENABLE;    
  CAN_FilterInit(&CAN_FilterInitStruct);

  //Enter Normal mode from sleep mode
  CAN_WakeUp();  

  //Send message
  TxMessage.StdId=0x123;
  TxMessage.IDE=0;
  TxMessage.RTR=0;
  TxMessage.DLC=7;
  TxMessage.Data[0]=0x01;
  TxMessage.Data[1]=0x02;
  TxMessage.Data[2]=0x04;
  TxMessage.Data[3]=0x08;
  TxMessage.Data[4]=0xFF;
  TxMessage.Data[5]=0x55;
  TxMessage.Data[6]=0xAA;
  CAN_Transmit(&TxMessage);

使用特权

评论回复
7
leebai_001| | 2008-1-7 08:45 | 只看该作者

STM32的CAN接口与STR730来比较的话,显的过于简单

STM32的CAN接口看样子是从ST72F561系列演化而来的,CAN接口显得过于简单,如果设计到多ID通讯时,软件的开销过大。相比较而言,STR730系列的CAN接口比较合理,操作也比较简单。
STM32的标准例程测试过没有什么问题。
下面的例程为正常测试程序,需要两个CAN配合来完成测试。
void CAN_Ini()
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=ENABLE;//ENABLE
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; 
  CAN_InitStructure.CAN_SJW=CAN_SJW_3tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_10tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;
  CAN_InitStructure.CAN_Prescaler=65;
  CAN_Init(&CAN_InitStructure);
  /*该波特率为非标准的*/
  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=0;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;//CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
}
void CanMange(void)
{
  /**/
  CanTxMsg TxMessage;
  CanRxMsg RxMessage;
  u16 i=0;
  u8 TransmitMailbox;

  if(CAN_MessagePending(CAN_FIFO0)>1) //Can receive data
  {
    GPIO_WriteBit(GPIOC,GPIO_Pin_9, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_9)));
    /* receive */
    RxMessage.StdId=0x00;
    RxMessage.IDE=CAN_ID_STD;
    RxMessage.DLC=0;
    for(i=0;i<8;i++)
    RxMessage.Data=0x00;
    CAN_Receive(CAN_FIFO0, &RxMessage);

    if(RxMessage.StdId==ConvertID(0x0006))
    {
        GPIO_WriteBit(GPIOC,GPIO_Pin_8, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_8)));
    }
    if (RxMessage.IDE!=CAN_ID_STD) return ;

    if (RxMessage.DLC!=8) return ;

    /* transmit */
    TxMessage.StdId=ConvertID(0xc8);
    TxMessage.RTR=CAN_RTR_DATA;
    TxMessage.IDE=CAN_ID_STD;
    TxMessage.DLC=8;
    /*--*/
    for(i=0;i<8;i++)
    TxMessage.Data=RxMessage.Data;

    TransmitMailbox=CAN_Transmit(&TxMessage);
    i=0;
    while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)&&(i!=0xFF))
    i++;
  
  }
}

使用特权

评论回复
8
小野狼| | 2008-1-7 09:29 | 只看该作者

技术支持今天没来

来了我让他来看看是什么问题,呵呵,非常抱歉让楼主等了

使用特权

评论回复
9
mike58|  楼主 | 2008-1-7 10:44 | 只看该作者

谢谢那么多热心人!现在还是在引脚上看不到波形

我把can重新映射到PD0,PD1口。可以看到发送器中的数据在发送和变化
在相应的引脚PD0,PD1中却找不到

然后更为奇观,发送器到一定时间大约十几到几十帧数据的时候,TXRQ被置位,再也发不动了

使用特权

评论回复
10
grant_jx| | 2008-1-7 21:24 | 只看该作者

想问一问

你测试的时候是否是两个CAN连在一起?如果总线上只有两个端点,是否包含了那个120欧姆的电阻?


你现在的代码是用上面的拿一个?你的代码要求CAN外设工作在什么模式?如果不是自回环模式,发送的消息是要等应答的,如果没有,可能导致发送错误寄存器错误累计值大于128,如果是255,CAN自动离线。这个错误的管理是CAN的协议规定的,你可以参考CAN Bus协议2.0B。

或者测试的时候,你可以将CAN_MCR的NART置1,不去理会任何与发送有关的消息。


使用特权

评论回复
11
zhaokerong| | 2008-1-12 14:22 | 只看该作者

can例程的问题

我也遇到了上面的问题,怎么都发不出去数,我的程序跟上面的一样,可就是没有。我用的是正常模式。

使用特权

评论回复
12
zhaokerong| | 2008-1-12 14:27 | 只看该作者

can

不知道那位大虾有调好的经验,请帮忙指点一下,谢了!

使用特权

评论回复
13
grant_jx| | 2008-1-12 15:53 | 只看该作者

我想楼上的也许应该把问题描述清楚一些

首先你的测试环境是怎样的?正常模式?

STM32的CAN模块是有很多种模式的。在正常模式下CAN通讯测试是要求至少要有两个节点才是可以保证通讯正常的基本条件,同时还必须要两个末尾节点要有120欧姆的电阻。这些条件是否都可以保证?

硬件能够保证,那初始化模式是否可以通过?两个通讯的节点波特率设置得是否有一样?报文的验收滤波器设置呢?

如果能确认设置都是没有问题的,那发送不成功后错误状态寄存器CAN_ESR指示的又是什么信息?


问问题是要讲究技巧的,如果不描述清楚就算知道也是没有人有办法帮上忙的。

使用特权

评论回复
14
zhaokerong| | 2008-1-12 20:19 | 只看该作者

can问题

我是程序跟7楼的一样,工作在正常模式下,两个CAN点通讯,一个是电脑的CAN卡,另一个是万利的板子。120欧姆的电阻都有。可以通过初始化。
  while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)&&(i!=0xFF))
    i++;
这句进去怎么也出不来了,我试着把CANTXOK该改为CANTXFAILD,可以跳出来。三个邮箱全是满的。不知道是不时有什么地方要设置我没有设置。会不回库文件CAN。C里有什么需要改变的?没做过,这是第一次,望大家赐教

使用特权

评论回复
15
leebai_001| | 2008-1-14 08:22 | 只看该作者

还有两个步骤没有说明

1.CAN口时钟使能
   /* TIM4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4|RCC_APB1Periph_CAN, ENABLE);
  /* Enable GPIOC,GPIOA,USART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1
                         |RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);

2.CAN口初始化
  测试的CAN口需要重新映射
 /*---  -----------------------------------*/
  GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);
  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

使用特权

评论回复
16
zhaokerong| | 2008-1-14 10:35 | 只看该作者

谢谢帮忙

谢谢版主帮忙!你说的我都已经设置了,可CAN_ESR里的数是0x00800033。CAN_TSR里里的数是0x19000008,CAN_MCR_INRQ 里的数一直是1,不知道那里的问题。现在输出的CANL和CANH用万用表的短路档打是短路的,这可能是那里出问题了呀!再次感谢你的帮忙!

使用特权

评论回复
17
zhaokerong| | 2008-1-14 10:54 | 只看该作者

can程序

下面是我的程序,希望香主帮我看看那里有问题。
 int main(void)
{

#ifdef DEBUG
  debug();
#endif

  /* System Clocks Configuration */
  RCC_Configuration();

  /* NVIC Configuration */
  NVIC_Configuration();
  
  /* GPIO ports pins Configuration */
  GPIO_Configuration();
  
  while (1)
  {
  /* CAN transmit at 100Kb/s and receive by polling in loopback mode*/
  TestRx = CAN_Polling();

  if (TestRx == FAILED)
  {
    /* Turn on led connected to PC.06 pin (LD3) */
    GPIO_SetBits(GPIOC, GPIO_Pin_6);
  }
  else
  {
    /* Turn on led connected to PC.04 pin (LD5) */
    GPIO_SetBits(GPIOC, GPIO_Pin_4);
  }

  /* CAN transmit at 500Kb/s and receive by interrupt in loopback mode*/
  TestRx = CAN_Interrupt();

  if (TestRx == FAILED)
  {
    /* Turn on led connected to PC.05 pin (LD4) */
    GPIO_SetBits(GPIOC, GPIO_Pin_5); 
  }
  else
  {
    /* Turn on led connected to PC.07 pin (LD2) */
    GPIO_SetBits(GPIOC, GPIO_Pin_7);
  }
  } 
  while (1)
  {
  }
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Select HSE as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

    /* Wait till HSE is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x04)
    {
    }
  }
  
  /* GPIOA and GPIOC clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO  , ENABLE);

  /* CAN Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 |RCC_APB1Periph_CAN, ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the NVIC and Vector Table base address.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

  /* enabling interrupt */
  NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
* Function Name  : CAN_Polling
* Description    : Configures the CAN and transmit and receive by polling
* Input          : None
* Output         : None
* Return         : PASSED if the reception is well done, FAILED in other case
*******************************************************************************/
TestStatus CAN_Polling(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  CanRxMsg RxMessage;
  u32 i = 0;
  u8 TransmitMailbox;

  GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);
  

  
   /* CAN register init */
   CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);
  
  
  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;
  CAN_Init(&CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=0;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
  CAN_WakeUp();
  /* transmit */
  CAN->MCR |= 0x00000000;
  TxMessage.StdId=0x0010;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.DLC=8;
  TxMessage.Data[0]=0xCA;
  TxMessage.Data[1]=0xFE;
  TxMessage.Data[2]=0xCA;
  TxMessage.Data[3]=0xCA;
  TxMessage.Data[4]=0xCA;
  TxMessage.Data[5]=0xCA;
  TxMessage.Data[6]=0xCA;
  TxMessage.Data[7]=0xCA;
  TransmitMailbox=CAN_Transmit(&TxMessage);
  CAN->sTxMailBox[TransmitMailbox].TIR |= 0x00000001;
  i = 0;
  while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF))
  {
    i++;
  }

  i = 0;
  while((CAN_MessagePending(CAN_FIFO0) < 1) && (i != 0xFF))
  {
    i++;
  }

  /* receive */
  RxMessage.StdId=0x0001;
  RxMessage.IDE=CAN_ID_STD;
  RxMessage.DLC=2;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;
  CAN_Receive(CAN_FIFO0, &RxMessage);

  //if (RxMessage.StdId!=0x01) return FAILED;

  if (RxMessage.IDE!=CAN_ID_STD) return FAILED;

  //if (RxMessage.DLC!=2) return FAILED;

  //if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) return FAILED;
  
  return PASSED; /* Test Passed */
}

/*******************************************************************************
* Function Name  : CAN_Interrupt
* Description    : Configures the CAN and transmit and receive by interruption
* Input          : None
* Output         : None
* Return         : PASSED if the reception is well done, FAILED in other case
*******************************************************************************/
TestStatus CAN_Interrupt(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  u32 i = 0;

  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=DISABLE;
  CAN_InitStructure.CAN_AWUM=DISABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=1;
  CAN_Init(&CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 message pending interrupt enable */ 
  CAN_ITConfig(CAN_IT_FMP0, ENABLE);

  /* transmit 1 message */
  TxMessage.StdId=0x12;
  TxMessage.ExtId=0x34;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xDE;
  TxMessage.Data[1]=0xCA;
  CAN_Transmit(&TxMessage);

  /* initialize the value that will be returned */
  //ret = 0xFF;
       
  /* receive message with interrupt handling */
  i=0;
  while((ret == 0xFF) && (i < 0xFFF))
  {
    i++;
  }
  
  if (i == 0xFFF)
  {
    ret=0;  
  }

  /* disable interrupt handling */
  CAN_ITConfig(CAN_IT_FMP0, DISABLE);

  return (TestStatus)ret;
}

#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)

  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d ", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

使用特权

评论回复
18
zhaokerong| | 2008-1-14 18:13 | 只看该作者

运行模式

我想问一下版主,为什么我把 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack该成
 CAN_InitStructure.CAN_Mode=CAN_Mode_Normal以后,系统还是工作在LoopBack模式下,甚至我把这句删掉,系统依然工作在LoopBack模式下?
怎么才能让系统工作在正常模式下?

使用特权

评论回复
19
zhxlx| | 2008-3-4 10:08 | 只看该作者

关注CAN调试

我是刚开始调试,希望大家多讨论些

使用特权

评论回复
20
totoko163| | 2008-3-4 13:23 | 只看该作者

CAN

先做个标记,用到CAN时候参考.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝