打印

STM32 环回模式CANTX引脚上没有波形

[复制链接]
10373|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
high0006|  楼主 | 2011-7-21 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、环回模式,也就是LOOPBACK模式下能够实现收发,让其一直发送数据,STM32的CANTX引脚上没有波形,不知道是什么问题?
2、我设置的CAN波特率为250Kbits,请问一下,在这个波特率下一直不停地循环发送数据,示波器能不能看到CANTX引脚上的波形?我的意思是会不会频率太高示波器无法看到波形?
请各位大侠帮帮我啊!
3、STM32,我用的can收发器为SN65HVD232
4、都说实现收发需要两个节点,我想请问一下,我只用STM32一直不停地发数据,没有接收端,这样CANTX上会有信号么?
沙发
相信哥咯| | 2011-7-21 10:13 | 只看该作者
哥啊,我也在搞这个东西啊调不通
1.我的也没有
4.我环回正常,但是调成正常模式就一直发不出去数据

使用特权

评论回复
板凳
high0006|  楼主 | 2011-7-21 10:16 | 只看该作者
跟2楼握爪,一起加油啊

使用特权

评论回复
地板
Itachi80| | 2011-7-21 11:33 | 只看该作者
本帖最后由 Itachi80 于 2011-7-21 11:37 编辑

前段时间调过一下,用泰克示波器能看到明显的波形,我用的是PCA82C250,环回模式没测过,用两个节点测得


  /* Configure CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

void CAN_Configuration(void)
{
  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=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=0x000;
  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);
}

使用特权

评论回复
5
high0006|  楼主 | 2011-7-21 15:03 | 只看该作者
4# Itachi80
你好,可以看看你的完整么?

使用特权

评论回复
6
high0006|  楼主 | 2011-7-21 15:04 | 只看该作者
4# Itachi80
打错了,可以看看你的完整程序么?

使用特权

评论回复
7
ziyueyoulang| | 2011-7-21 15:06 | 只看该作者
:P   把你的完整程序贴上去 让我们看看

使用特权

评论回复
8
high0006|  楼主 | 2011-7-21 15:09 | 只看该作者
4# Itachi80
另外,stm32工作电压3.3v,PCA82C250工作电压5v,这样PCA82C250可以用在stm32的CAN上面么?

使用特权

评论回复
9
Itachi80| | 2011-7-21 15:44 | 只看该作者
/*******************************************************************************
* File Name          : main.c
* Author             : Guofeng Chen
* Date First Issued  : 2010.10.14
* Description        : Main program of the commnication between the PC and stm32
********************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"

/* Local includes ------------------------------------------------------------*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
vu32 ret; /* for return of the interrupt handling */
volatile TestStatus TestRx;
ErrorStatus HSEStartUpStatus;

/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void CAN_Configuration(void);

  int text_1=5,text_2=5;
  extern vu16  CAN_ID ;

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{

#ifdef DEBUG
  debug();
#endif
  CanTxMsg TxMessage;
  u32 i;
  /* System Clocks Configuration */
  RCC_Configuration();

  /* NVIC Configuration */
  NVIC_Configuration();
  
  /* GPIO ports pins Configuration */
  GPIO_Configuration();

  CAN_Configuration();




  while(1)
  {          
        for(i=0;i<0xffff;i++)  ;
               
  /* transmit 1 message */         
  TxMessage.StdId=0x0002;          
// TxMessage.ExtId=0x34;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xaa;                  
  TxMessage.Data[1]=0xaa;
  CAN_Transmit(&TxMessage);






  }
}

/*******************************************************************************
* 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)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

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

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* 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_GPIOA  | RCC_APB2Periph_GPIOC, ENABLE);

  /* CAN Periph clock enable */
  RCC_APB1PeriphClockCmd(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_8 | GPIO_Pin_9;
  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_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*******************************************************************************
* 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_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
*******************************************************************************/
void CAN_Configuration(void)
{
  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=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Normal ;//LoopBack  
  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=0x000;
  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);


}




#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert 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\r\n", file, line) */

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
high0006 + 1
10
Itachi80| | 2011-7-21 15:47 | 只看该作者
8# high0006

可以,照用不误

使用特权

评论回复
11
high0006|  楼主 | 2011-7-21 15:50 | 只看该作者
9# Itachi80 谢谢了……我开始怀疑是不是我的硬件出问题了!能看看你的电路图么?谢谢了啊!!非常感谢!!

使用特权

评论回复
12
Itachi80| | 2011-7-21 15:56 | 只看该作者
11# high0006
基本没电路图呀,两个最小系统板,两个PCA82C250做的接口

使用特权

评论回复
13
high0006|  楼主 | 2011-7-21 16:07 | 只看该作者
12# Itachi80 这是我的CAN收发器电路,麻烦大侠看看有没有什么问题……

未命名.jpg (94.08 KB )

未命名.jpg

使用特权

评论回复
14
Itachi80| | 2011-7-21 16:10 | 只看该作者
13# high0006

没用过这芯片,应该和PCA82C250差不多吧,斜率电阻端可以直接接地,其他也没什么问题,注意你的两个CAN ID不能一样

使用特权

评论回复
15
high0006|  楼主 | 2011-7-21 16:17 | 只看该作者
14# Itachi80
我现在仅仅是想看看我的STM32的can能不能将数据发送出去,也就是说只有一个CAN,不接收数据,我想用示波器看CAN总线对地有没有波形,不知这个思路可对?也就不存在你刚刚所说的问题了……

使用特权

评论回复
16
wolf1983abc| | 2011-7-21 16:38 | 只看该作者
PCA82C250可以和SN65HVD232
通讯,
只有一个can在正常模式是不行的,要两个CAN,
stm32 CAN是先检测总线上的电平状态之后,才发出数据,
一个can没有正常通讯形成不了回路,可定就没什么波形了,
两个can连接时别忘记120的电阻,形成回路

使用特权

评论回复
17
wolf1983abc| | 2011-7-21 16:42 | 只看该作者
原理图应该没什么问题,我用的10k,5脚没用也是悬空的

使用特权

评论回复
18
Itachi80| | 2011-7-21 16:44 | 只看该作者
15# high0006
一小时发帖过5了。。没试过只用一个,环回能成功应该代码问题不大了。CAN总线上应该是有两个120欧德,我是直接接60欧上去的,你贴代码看看吧

使用特权

评论回复
19
high0006|  楼主 | 2011-7-21 17:08 | 只看该作者
16# wolf1983abc
82c250和tja1050也能通讯吧?我想确认一下,232那个芯片可能坏了,我对他一直不踏实,只剩下TJA1050了,于是我又折腾了一下。

使用特权

评论回复
20
high0006|  楼主 | 2011-7-21 17:11 | 只看该作者
真是太感谢各位了

使用特权

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

本版积分规则

0

主题

16

帖子

1

粉丝