你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32的can调试时,can-tx引脚没有数据输出

[复制链接]
spbird 提问时间:2012-2-14 17:47 /
<span style="font-size: medium; "><span style="font-family: 宋体; ">  各位砖家: 
使用stm32的开发板有一个多月了,在实验can端口,碰到了问题,can_TX管脚没有数据输出,想了很多办法一直没有解决。 

--------------------------------------------------------------------------------------------------------------------------- 

首先是开发板的例程,can工作的回环模式(CAN_Mode_LoopBack) 
按照ST的参考手册,此时TX内部与RX连接,同时外部的TX脚仍然有信号输出。 

例程下载成功,也从串口收到了成功的提示信息,如: 

 这个一个CAN(回环模式和中断模式)测试程序......  

 CAN 回环测试初始化成功......  

 CAN 回环测试成功......  

 这个一个CAN(回环模式和中断模式)测试程序......  

 CAN 回环测试初始化成功......  

 CAN 回环测试成功......  

但无论是示波器,还是逻辑分析仪,都无法从CAN_TX(PB9)上采集到相关的CAN数据。 

--------------------------------------------------------------------------------------------------------------------------- 

在这个例程中,CAN初始化是这样的: 

/* 
 * 函数名:CAN_GPIO_Config 
 * 描述  :CAN GPIO 和时钟配置 
 * 输入  :无 
 * 输出  : 无 
 * 调用  :内部调用 
 */ 
static void CAN_GPIO_Config(void) 

  GPIO_InitTypeDef GPIO_InitStructure;  
  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA, ENABLE);                                           

  /* CAN1 Periph clock enable */ 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); 

  /* Configure CAN pin: RX */                        // PB8 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                     // 上拉输入 
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
  
  /* Configure CAN pin: TX */                        // PB9 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  // 复用推挽输出 
  GPIO_Init(GPIOB, &GPIO_InitStructure); 

//#define GPIO_Remap_CAN    GPIO_Remap1_CAN1 本实验没有用到重映射I/O 
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); 



/* 
 * 函数名:CAN_NVIC_Configuration 
 * 描述  :CAN RX0 中断优先级配置 
 * 输入  :无 
 * 输出  : 无 
 * 调用  :内部调用 
 */ 
static void CAN_NVIC_Configuration(void) 

  NVIC_InitTypeDef NVIC_InitStructure; 

  /* Enable CAN1 RX0 interrupt IRQ channel */ 
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     // 主优先级为0 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
  NVIC_Init(&NVIC_InitStructure); 


/* 
 * 函数名:CAN_Polling 
 * 描述  :配置 CAN 的工作模式为 回环模式 
 * 输入  :无 
 * 输出  : -PASSED   成功 
 *         -FAILED   失败 
 * 调用  :内部调用 
 */ 
TestStatus CAN_Polling(void) 

  CAN_InitTypeDef        CAN_InitStructure; 
  CAN_FilterInitTypeDef  CAN_FilterInitStructure; 
  CanTxMsg TxMessage; 
  CanRxMsg RxMessage; 
  uint32_t i = 0; 
  uint8_t TransmitMailbox = 0; 

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

  /* CAN cell init */ 
  CAN_InitStructure.CAN_TTCM=DISABLE;          // 时间触发通信禁止 
  CAN_InitStructure.CAN_ABOM=DISABLE;          // 离线退出是在中断置位清0后退出 
  CAN_InitStructure.CAN_AWUM=DISABLE;          // 自动唤醒模式:清零sleep 
  CAN_InitStructure.CAN_NART=DISABLE;          // 自动重新传送豹纹,知道发送成功 
  CAN_InitStructure.CAN_RFLM=DISABLE;          // FIFO没有锁定,新报文覆盖旧报文   
  CAN_InitStructure.CAN_TXFP=DISABLE;          // 发送报文优先级确定:标志符 
  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;         // 回环模式 
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;          // 1tq、BS1、BS2的值跟波特率有关 
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; 
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; 
  CAN_InitStructure.CAN_Prescaler=5;             // 分频系数为5 
  CAN_Init(CAN1, &CAN_InitStructure);            // 初始化CAN1  

  /* 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_FilterInitStructure.CAN_FilterActivation=ENABLE; 
  CAN_FilterInit(&CAN_FilterInitStructure); 

  /* transmit */ 
  TxMessage.StdId=0x11;         // 设定标准标识符(11位,扩展的为29位) 
  TxMessage.RTR=CAN_RTR_DATA;        // 传输消息的帧类型为数据帧(还有远程帧) 
  TxMessage.IDE=CAN_ID_STD;         // 消息标志符实验标准标识符 
  TxMessage.DLC=2;           // 发送两帧,一帧8位 
  TxMessage.Data[0]=0xCA;         // 第一帧数据 
  TxMessage.Data[1]=0xFE;         // 第二帧数据 

  TransmitMailbox=CAN_Transmit(CAN1, &TxMessage); 
  i = 0; 
// 用于检查消息传输是否正常 
  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)) 
  { 
    i++; 
  } 

  i = 0; 
// 检查返回的挂号的信息数目 
<span style="line-height: 21px; background-color: rgb(209, 217, 226); ">  while((CAN_MessagePending(CAN1, CAN_FIFO0) 
收藏 评论5 发布时间:2012-2-14 17:47

举报

5个回答
废鱼 回答时间:2012-2-15 10:44:44

RE:stm32的can调试时,can-tx引脚没有数据输出

循环模式,是指CAN通过内部连接起来,而外部CANRX引脚是不会有数据的.这个你可以详细阅读手册的CAN循环模式.
环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。
S_Jack 回答时间:2016-10-21 10:45:02
楼主  我也遇到这个问题...想请教下
奏奏奏 回答时间:2016-10-21 12:45:29
安 发表于 2012-2-15 10:44
循环模式,是指CAN通过内部连接起来,而外部CANRX引脚是不会有数据的.这个你可以详细阅读手册的CAN循环模式.
...

跟版主学习一下,最近做的项目有用CAN通讯
车厘子 回答时间:2016-10-21 13:14:17
zhulikai 回答时间:2016-10-26 11:02:48
为啥我在做环回模式的时候,也能用示波器看出接收端的波形呢。。。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版