打印

STM32F103RBT6 CAN通信问题,

[复制链接]
5662|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whitemomo|  楼主 | 2013-4-18 10:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用ST的例程环回模式是可以的,小弟是新手,请问要改成正常模式怎么改?
我只是改了CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  发现发送不成功,发送后检查状态CAN_TransmitStatus  一直没有CANTXOK,(用示波器看TX引脚也没有波形)是不是还要改别的地方?
发送程序如下:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
unsigned char TestTx=0;  //发送成功标志
/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
unsigned char CAN_MessageSend(void); //报文发送函数
void delay(void);
/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
  /* System Clocks Configuration */
  RCC_Configuration();
  /* NVIC Configuration */
  NVIC_Configuration();
  
  /* GPIO ports pins Configuration */
  GPIO_Configuration();
  
  TestTx = CAN_MessageSend();
   
   
  while (1)
  {
    /* CAN transmit at 100Kb/s and receive by polling in normal mode */
   
     if (TestTx == 1)
    {
       GPIO_SetBits(GPIOA,GPIO_Pin_11);
       delay();   // LED1闪烁一次,发送一个字符
       GPIO_ResetBits(GPIOA,GPIO_Pin_11);
       delay();
    }
  }
}
void delay(void)
{
  unsigned int a,b;
  for(a=0;a<10000;a++)
  {
    for(b=0;b<100;b++);
  }
}
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;
  
  /* 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 */
    RCC_PCLK1Config(RCC_HCLK_Div1);
    /* Select HSE as system clock source,系统为8MHz */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
    /* Wait till HSE is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x04)
    {
    }
  }
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , 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 CAN pin: RX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //只能工作在此速度下
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//只能工作在此速度下
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE); //将PD1映射为CAN_TX,将PD0映射为CAN_RX
  
}
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the NVIC and Vector Table base address.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#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
}
unsigned char CAN_MessageSend(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CanTxMsg TxMessage;
  u32 i = 0;
  u8 TransmitMailbox = 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; //禁止接收FIFO锁定模式
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级
  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);
  /* transmit */
  TxMessage.StdId=0x11;
  TxMessage.RTR=CAN_RTR_DATA;//数据帧
  TxMessage.IDE=CAN_ID_STD;//标准帧格式
  TxMessage.DLC=2; //帧长度,单位:字节
  TxMessage.Data[0]=0xCA;//待传数据
  TxMessage.Data[1]=0xFE;
  /*数据发送*/
  TransmitMailbox=CAN_Transmit(&TxMessage);
  i = 0;
  while((CAN_TransmitStatus(TransmitMailbox) != CANTXOK) && (i != 0xFF)) //等待CAN总线传输数据成功,老是卡在这边最后成发送不成功
  {
    i++;
  }
  if(i==0xff)//发送超时,但发送不成功
  {
    return 0;
  }
  return 1; /* Test Passed */
}
我用的是IAR的编程环境以及EmbededDebug v2.0调试软件,就是问题不知道在哪儿,求大神帮忙啊


相关帖子

沙发
阿南| | 2013-4-18 10:45 | 只看该作者
帮顶
可以去ST MCU版问问

使用特权

评论回复
板凳
whitemomo|  楼主 | 2013-4-18 12:06 | 只看该作者
求大哥们帮忙啊

使用特权

评论回复
地板
airwill| | 2013-4-18 12:11 | 只看该作者
你可以两个板连起来, 一起调试.
单独一个板子, 没有应答引起的.

使用特权

评论回复
5
whitemomo|  楼主 | 2013-4-18 13:30 | 只看该作者
airwill 发表于 2013-4-18 12:11
你可以两个板连起来, 一起调试.
单独一个板子, 没有应答引起的.

我有一个USB-CAN调试器,那就应该改相当于两块板子了吧。只是调试器里面的芯片是STM32F103C8T6的,不过这应该没有关系的吧

使用特权

评论回复
6
airwill| | 2013-4-18 17:37 | 只看该作者
有没有关系, 试试看吧

使用特权

评论回复
7
whitemomo|  楼主 | 2013-4-19 09:33 | 只看该作者
airwill 发表于 2013-4-18 17:37
有没有关系, 试试看吧

我想知道该怎么解决了。。。。现在觉得很烦躁啊

使用特权

评论回复
8
airwill| | 2013-4-19 09:40 | 只看该作者
我这么用, 可行的. 你那边是不是还会遇到问题, 我不好说.

"我想知道该怎么解决了。。。。现在觉得很烦躁啊"

做技术, 烦躁解决不了问题!
我的做法是, 感觉烦躁, 就出去逗个圈再回来, 等定心了再继续.
如何还不得定心, 请一天假, 出去逛湾去.

使用特权

评论回复
9
whitemomo|  楼主 | 2013-4-19 10:27 | 只看该作者
airwill 发表于 2013-4-19 09:40
我这么用, 可行的. 你那边是不是还会遇到问题, 我不好说.

"我想知道该怎么解决了。。。。现在觉得很烦躁啊 ...

我程序运行的时候吧。。数据能够进入邮箱,但是为什么一直都是在哎等待发送啊,然后就发送不出去了

使用特权

评论回复
10
午易丹| | 2013-4-27 22:02 | 只看该作者
GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);  你用的不是B口么?我觉得是应该是GPIO_PinRemapConfig(GPIO_Remap1_CAN,ENABLE); 不知道行不行

使用特权

评论回复
11
liushuwei12| | 2013-4-29 22:21 | 只看该作者
问题解决了吗?什么问题啊?
我这边的库里GPIO_PinRemapConfig()函数,只有GPIO_Remap1_CAN1或者GPIO_Remap2_CAN1参数,GPIO_Remap2_CAN没有选择哪个CAN1或CAN2.

使用特权

评论回复
12
chaihtao| | 2013-5-2 12:23 | 只看该作者
以前做过CAN的东西,感觉应该没有大问题,就得一点一点的检查,首先设置做好了么?装数据了么?启动发送了么?

使用特权

评论回复
13
jiaxinhui| | 2013-5-2 21:25 | 只看该作者
你的CAN收发芯片是什么型号?看看是否接线正确

使用特权

评论回复
14
yong_ning100| | 2014-3-11 14:39 | 只看该作者
liushuwei12 发表于 2013-4-29 22:21
问题解决了吗?什么问题啊?
我这边的库里GPIO_PinRemapConfig()函数,只有GPIO_Remap1_CAN1或者GPIO_Remap ...

楼主用的是CAN1CAN_REMAP[1:0]=”11”  映射到PD0和PD1

使用特权

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

本版积分规则

3

主题

10

帖子

1

粉丝