打印

标题:关于STM32F205VC的CAN发送异常问题,请指教问题在哪,谢谢!

[复制链接]
5586|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ljhtj|  楼主 | 2013-8-6 18:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
目前调试STM32F205的CAN通信,发送数据总是错误,而且一直发送固定不变的数据,跟踪调试发现以下现象:
(1)问题出在CAN的发送函数uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)上,
同样的程序在STM32F103上运行正常,到STM32F205上则异常;
(2)在F103上执行到CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; 语句时
STID、EXID、IDE、RTR均能清零,能够将新的数据赋值给CAN_RI0R;
在STM32F205上运行时,CAN_RI0R寄存器数值不能清零,赋值语句也不能更改寄存器的数值
(3)同样的,设置DLC、DATA[0]-DATA[7]的寄存器操作在F103正常,在F205则不能更改;
(4)两个STM32F205的运行现象一致,应该不是单片机硬件的问题;
(5)CAN寄存器的强制赋值语句也不能改变其数值,如图所示数不变。
(6)CAN能够发送数据出来,可以更改波特率,都能发送。更改波特率1Mbps,500kbps,250kbps结果都是一样的;接收的肯定没有问题,两个USBCAN的接收器结果一致,其中包括使用周立功的USBCAN2。
就是发的数不变:始终是
ID:0x1ffffffe  数据帧  扩展帧  数据长度:0x05  数据:f5 ff ff ff f5

(7)使用的是STM32F205的CAN2
关于CAN的程序清单如下:

#include "stm32f2xx.h"
#include "main.h"
#include <stdio.h>

CanTxMsg TxMessage;
CanRxMsg RxMessage;
/* Private function prototypes -----------------------------------------------*/
void CAN_NVIC_Config(void);
void CAN_Config(void);
void Init_RxMes(CanRxMsg *RxMessage);

/**
  * @brief  Configures the CAN.
  * @param  None
  * @retval None
  */
void CAN_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;  
  
  /* CAN GPIOs configuration **************************************************/

  /* Enable GPIO clock */
  RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);

  /* Connect CAN pins to AF9 */
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);   //PB12
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);   //PB13
  
  /* Configure CAN RX and TX pins */
  GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

  /* CAN configuration ********************************************************/  
  /* Enable CAN clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
  
  /* CAN register init */
  CAN_DeInit(CANx);
  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_Mode = CAN_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
   
  /* CAN Baudrate = 500kBps (CAN clocked at 30 MHz) */
  /* 30/4=7.5 7.5/(1+6+8)=0.5
  */
  CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructure.CAN_Prescaler = 8;              
  CAN_Init(CANx, &CAN_InitStructure);

  CAN_FilterInitStructure.CAN_FilterNumber = 14;
  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 Structure preparation */
  TxMessage.StdId = 0x0012;
  TxMessage.ExtId = 0x1314;
  TxMessage.RTR = CAN_RTR_DATA;
  TxMessage.IDE = CAN_ID_STD;
  TxMessage.DLC = 8;
        TxMessage.Data[0] = 0xAB;
        TxMessage.Data[1] = 0xCD;
  TxMessage.Data[2] = 0x00;
        TxMessage.Data[3] = 0x00;
        TxMessage.Data[4] = 0x00;
        TxMessage.Data[5] = 0x00;
        TxMessage.Data[6] = 0x00;
        TxMessage.Data[7] = 0x00;
  /* Enable FIFO 0 message pending Interrupt */
  CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
}

/**
  * @brief  Configures the NVIC for CAN.
  * @param  None
  * @retval None
  */
void CAN_NVIC_Config(void)
{
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  Initializes the Rx Message.
  * @param  RxMessage: pointer to the message to initialize
  * @retval None
  */
void Init_RxMes(CanRxMsg *RxMessage)
{
  uint8_t i = 0;

  RxMessage->StdId = 0x00;
  RxMessage->ExtId = 0x00;
  RxMessage->IDE = CAN_ID_STD;
  RxMessage->DLC = 0;
  RxMessage->FMI = 0;
  for (i = 0;i < 8;i++)
  {
    RxMessage->Data = 0x01;
  }
}

        uint8_t j;
void CAN(void)
{
  uint32_t i;
  CanTxMsg TxMessage2;

CANx->sTxMailBox[0].TIR = 0x00;
CANx->sTxMailBox[0].TDTR = 0x00;
CANx->sTxMailBox[0].TDLR = 0x00;
CANx->sTxMailBox[0].TDHR = 0x00;
CANx->sTxMailBox[1].TIR = 0x00;
CANx->sTxMailBox[1].TDTR = 0x00;
CANx->sTxMailBox[1].TDLR = 0x00;
CANx->sTxMailBox[1].TDHR = 0x00;
CANx->sTxMailBox[2].TIR = 0x00;
CANx->sTxMailBox[2].TDTR = 0x00;
CANx->sTxMailBox[2].TDLR = 0x00;
CANx->sTxMailBox[2].TDHR = 0x00;       
       
       
       
  TxMessage2.StdId = 0x00;
  TxMessage2.ExtId = 0x1314;
  TxMessage2.RTR = CAN_RTR_DATA;
  TxMessage2.IDE = CAN_ID_EXT;
  TxMessage2.DLC = 8;
        TxMessage2.Data[0] = 0xAB;
        TxMessage2.Data[1] = 0xCD;
  TxMessage2.Data[2] = 0x00;
        TxMessage2.Data[3] = 0x00;
        TxMessage2.Data[4] = 0x00;
        TxMessage2.Data[5] = 0x00;
        TxMessage2.Data[6] = 0x00;
        TxMessage2.Data[7] = 0x00;
  
  /* NVIC configuration */
  CAN_NVIC_Config();

  /* CAN configuration */
  CAN_Config();
  CAN_WakeUp(CAN2);
       
  TxMessage.Data[0] = 0x12;
  j = CAN_Transmit(CAN2, &TxMessage2);  
  
  while(1)
  {
    j = CAN_Transmit(CAN2, &TxMessage2);  
    for(i=0;i<9000000;i++);
  }
}

跟踪调试的图片如下:
沙发
ljhtj|  楼主 | 2013-8-6 18:20 | 只看该作者
调试截图

明文_问题.JPG (256 KB )

明文_问题.JPG

使用特权

评论回复
板凳
cjhk| | 2013-8-6 19:29 | 只看该作者
不是很了解   楼主  帮你顶一个   再看看别人的意见   这一块  基本没有涉足过

使用特权

评论回复
地板
gaobq| | 2013-8-7 10:10 | 只看该作者
F1系列和F2系列的CAN有什么不同之处吗?请高手关注一下

使用特权

评论回复
5
IJK| | 2013-8-7 10:20 | 只看该作者
STM32F103的CAN跟 STM32F205的CAN有些不一样。
STM32F205的CAN2 建议可以找一下ST提供的例子。

使用特权

评论回复
6
ljhtj|  楼主 | 2013-8-7 15:23 | 只看该作者
IJK 发表于 2013-8-7 10:20
STM32F103的CAN跟 STM32F205的CAN有些不一样。
STM32F205的CAN2 建议可以找一下ST提供的例子。 ...

谢谢,我再找找问题

使用特权

评论回复
7
杨爱林林| | 2013-8-7 15:48 | 只看该作者
给两点建议
1  两个STM32F205的运行现象一致,觉得应该是硬件的问题  可以配合can调试工具 联pc调试
2  CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; 是不是应该改为
   CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ;

使用特权

评论回复
8
airwill| | 2013-8-7 16:32 | 只看该作者
STM32F205 之比 F103 就是双 CAN. 基本功能都没有变.
我的移植倒是没有遇到什么问题.
不知道为什么要初始化0. 比如那个 DLC.
/* CAN Baudrate = 500kBps (CAN clocked at 30 MHz) */
  /* 30/4=7.5 7.5/(1+6+8)=0.5
  */
   CAN_InitStructure.CAN_Prescaler = 8;         
既然是 4 分频, 这里又为什么是8

使用特权

评论回复
9
puchuang| | 2013-8-7 19:07 | 只看该作者
问题解决了  还是版主给力  NB

使用特权

评论回复
10
gaobq| | 2013-8-7 19:11 | 只看该作者
回复airwill:
程序代码里面分频写成8,是测试不同的波特率,做实验遗留的。
我这个代码也是把官方库的例程改过来的,我得只是和官方库使用的管脚不一致,难道是落了什么细节?
关于“初始化0”,是因为CAN寄存器的数值改变不了,我尝试强制清零寄存器。

回复杨爱林林:
那一句代码是官方库CAN_Transmit函数的语句,跟踪执行发现,CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ;语句执行后,CAN的相关寄存器将清零,可以将新的帧数据,在F103下是正常的,单是到了205下就不好使了,CAN寄存器的数值改变不了,故而始终发送一样的数据帧出来。

使用特权

评论回复
11
gaobq| | 2013-8-7 19:13 | 只看该作者
考虑使用官方提供的例程再尝试一下,不使用自己的工程,ST的例程应该是可靠的。
我曾经怀疑编译器的问题,将所有优化都屏蔽了,证明没关系。

使用特权

评论回复
12
gaobq| | 2013-8-8 19:14 | 只看该作者
官方的例程和工程文件CAN通信正常,估计是我移植的时候,还是哪里没考虑到,或者有低级错误。我花了半天时间,将原来的工程都移植到这个以CAN为起始的工程里了,事情解决了,但是仍然没有找到问题。

使用特权

评论回复
13
hawksabre| | 2013-8-8 21:03 | 只看该作者
学习学习   好好看看   谢谢了  楼主  

使用特权

评论回复
14
fjdu2006| | 2015-11-11 21:29 | 只看该作者
puchuang 发表于 2013-8-7 19:07
问题解决了  还是版主给力  NB

怎么解决的?我也碰到同样的问题

使用特权

评论回复
15
zhjyuanji| | 2015-11-12 09:12 | 只看该作者

最近在做STM32F205的一个项目,芯片买来第一次能写进去程序但是再往后就写不进去了(通过USART1串口烧程序),烧写软件提示可以读到芯片PID,但是烧写数据一直是0KB,BOOT1和BOOT0都按照要求拉低拉高,Vcap1和Vcap2也都接上电容了,Vbat拉高,但是还是不行,求助

使用特权

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

本版积分规则

17

主题

467

帖子

0

粉丝