OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17417|回复: 8

STM32 CAN收发 PA11&PA12回环OK ,正常模式无数据发送,引脚无波形输出

[复制链接]

4

主题

12

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-5-27
在线时间
0 小时
发表于 2014-7-9 21:44:02 | 显示全部楼层 |阅读模式
5金钱

STM32 CAN收发 PA11&A12回环OK ,正常模式无数据发送,引脚无波形输出
请各位大侠指点,以下是我的代码
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "misc.h"
#include "stm32f10x_can.h"
#include "stm32f10x_gpio.h"

#define CAN_BAUDRATE 500
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;


__IO uint32_t ret = 0; /* for return of the interrupt handling */
volatile TestStatus TestRx;

/* Private functions ---------------------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
TestStatus CAN_Polling(void);
TestStatus CAN_Interrupt(void);

/****************************************************************************
* 名    称:int main(void)
* 功    能:主函数
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
int main(void)
{     
  RCC_Configuration();   //系统时钟设置及外设时钟使能
  NVIC_Configuration();   //中断源配置  
  
 
 
  /* CAN 500KB/s中断方式下的收发---正常通信模式 */
 
  
  while (1);
}

/****************************************************************************
* 名    称:void RCC_Configuration(void)
* 功    能:系统时钟配置为72MHZ, 外设时钟配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
void RCC_Configuration(void){

  SystemInit(); 
 
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1|RCC_APB1Periph_CAN2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC 
  | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
}




/****************************************************************************
* 名    称:void NVIC_Configuration(void)
* 功    能:中断源配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;  
 
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;   //CAN1 RX0中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //子优先级为0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


/****************************************************************************
* 名    称:TestStatus CAN_Interrupt(void)
* 功    能:中断模式下的CAN收发
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/
TestStatus CAN_Interrupt(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;  
  GPIO_InitTypeDef  GPIO_InitStructure;
  CanTxMsg TxMessage;
  //CanRxMsg RxMessage;
  //uint8_t TransmitMailbox = 0;


  GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);     //端口复用为CAN1   
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                 //PA11:CAN-RX 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //输入上拉
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12:CAN-TX 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* CAN寄存器初始化 */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);
    
  /* CAN单元初始化 */
  CAN_InitStructure.CAN_TTCM=DISABLE;   //MCR-TTCM  时间触发通信模式使能
  CAN_InitStructure.CAN_ABOM=DISABLE;   //MCR-ABOM  自动离线管理 
  CAN_InitStructure.CAN_AWUM=DISABLE;   //MCR-AWUM  自动唤醒模式
  //CAN_InitStructure.CAN_NART=ENABLE;   //MCR-NART  禁止报文自动重传  0-自动重传   1-报文只传一次
  CAN_InitStructure.CAN_NART=DISABLE;   //MCR-NART  禁止报文自动重传  0-自动重传   1-报文只传一次
  CAN_InitStructure.CAN_RFLM=DISABLE;   //MCR-RFLM  接收FIFO 锁定模式  0-溢出时新报文会覆盖原有报文  1-溢出时,新报文丢弃
  CAN_InitStructure.CAN_TXFP = ENABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  //CAN_InitStructure.CAN_TXFP=DISABLE;   //MCR-TXFP  发送FIFO优先级 0-优先级取决于报文标示符 1-优先级取决于发送请求的顺序
  //CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;   //BTR-SILM/LBKM   CAN环回模式
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;   //BTR-SJW 重新同步跳跃宽度 1个时间单元
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;   //BTR-TS1 时间段1 占用了2个时间单元
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;   //BTR-TS1 时间段2 占用了3个时间单元
  
#if CAN_BAUDRATE == 1000 /* 1MBps */
  CAN_InitStructure.CAN_Prescaler =6;   //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+2+3)/6=1Mbps
#elif CAN_BAUDRATE == 500 /* 500KBps */
  CAN_InitStructure.CAN_Prescaler =12;
#elif CAN_BAUDRATE == 250 /* 250KBps */
  CAN_InitStructure.CAN_Prescaler =24;
#elif CAN_BAUDRATE == 125 /* 125KBps */
  CAN_InitStructure.CAN_Prescaler =48;
#elif  CAN_BAUDRATE == 100 /* 100KBps */
  CAN_InitStructure.CAN_Prescaler =60;
#elif  CAN_BAUDRATE == 50 /* 50KBps */
  CAN_InitStructure.CAN_Prescaler =120;
#elif  CAN_BAUDRATE == 20 /* 20KBps */
  CAN_InitStructure.CAN_Prescaler =300;
#elif  CAN_BAUDRATE == 10 /* 10KBps */
  CAN_InitStructure.CAN_Prescaler =600;
#endif  

  //CAN_InitStructure.CAN_TXFP=DISABLE;
  //CAN_InitStructure.CAN_Mode=CAN_Mode_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(CAN1, &CAN_InitStructure);

  /* CAN过滤器初始化 */
  CAN_FilterInitStructure.CAN_FilterNumber=0; //
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //FM1R  过滤器组0的工作模式。
  //0: 过滤器组x的2个32位寄存器工作在标识符屏蔽位模式; 
//1: 过滤器组x的2个32位寄存器工作在标识符列表模式。
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //FS1R 过滤器组0(13~0)的位宽。
  //0:过滤器位宽为2个16位; 1:过滤器位宽为单个32位。
  
  /* 使能报文标示符过滤器按照标示符的内容进行比对过滤,扩展ID不是如下的就抛弃掉,是的话,会存入FIFO0。 */
  CAN_FilterInitStructure.CAN_FilterIdHigh=(((u32)0x1234<<3)&0xFFFF0000)>>16; //要过滤的ID高位 
  CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x1234<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位 
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
  
//  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
//  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
//  /* 全为0,忽略了报文标识符判别 */
//  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
//  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; //FFAx : 过滤器位宽设置 报文在通过了某过滤器的过滤后,
  //将被存放到其关联的FIFO中。 0:过滤器被关联到FIFO0; 1:过滤器被关联到FIFO1。
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //FACTx : 过滤器激活 软件对某位设置1来激活相应的过滤器。只有对FACTx位清0,
  //或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器
//x(CAN_FxR[0:1])。 0:过滤器被禁用; 1:过滤器被激活。
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 接收中断使能 */ 
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

  /* 发送一帧报文 */
  TxMessage.StdId=0x00;
  TxMessage.ExtId=0x1234;
  TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xDE;
  TxMessage.Data[1]=0xCA;
  CAN_Transmit(CAN1, &TxMessage);

  /* 等待接收成功标志置位 */
  ret = 0xFF;  
  while(ret == 0xFF);

  /* 接收中断禁止*/
  CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE);

  return (TestStatus)ret;
}

/******************* (C) COPYRIGHT 2011 奋斗STM32 *****END OF FILE****/



void USB_LP_CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;

  RxMessage.StdId=0x00;
  RxMessage.ExtId=0x00;
  RxMessage.IDE=0;
  RxMessage.DLC=0;
  RxMessage.FMI=0;
  RxMessage.Data[0]=0x00;
  RxMessage.Data[1]=0x00;

  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  /* 比较是否是发送的数据和ID */ 
//  if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT)
//     && (RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA))
//  {
  /* 比较报文长度与内容 */ 
  if((RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA))
  {
    ret = 1;       //接收成功

  }
  else
  {
    ret = 0;   //接收失败
  }
}

最佳答案

查看完整内容[请看2#楼]

PA11和PA12作为CAN接口脚为什么还要重映射?把它设为上拉复用输入和推挽输出就是作为CAN总线引脚来使用了,不用重映射的。 你这样初始化把CAN引脚重映射到PB8\PB9去了,又没有初始化PB的GPIO,当然量不到波形。 把GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);     //端口复用为CAN1 这一句注释掉再试试, 另外既然不用重映射,RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2014-4-14
在线时间
104 小时
发表于 2014-7-9 21:44:03 | 显示全部楼层
PA11和PA12作为CAN接口脚为什么还要重映射?把它设为上拉复用输入和推挽输出就是作为CAN总线引脚来使用了,不用重映射的。
你这样初始化把CAN引脚重映射到PB8\PB9去了,又没有初始化PB的GPIO,当然量不到波形。
把GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);     //端口复用为CAN1
这一句注释掉再试试,
另外既然不用重映射,RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);这句也最好注释掉,但注释掉上面那句应该就能看到波形了。
原子站长,不用两个板子,他说的是芯片上,明显是用示波器量的,除非静默回环模式,否则示波器怎么都该在CANTX管脚上看到波形。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-9 23:25:29 | 显示全部楼层
有两个板子测试没有?
正常模式必须有2个板子测试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-5-27
在线时间
0 小时
 楼主| 发表于 2014-7-10 07:33:52 | 显示全部楼层
现在,芯片上,都没有波形
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-10 23:30:12 | 显示全部楼层
回复【3楼】chengxl2010:
---------------------------------
接2个板子,通信才可能有波形的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
发表于 2014-8-23 23:58:38 | 显示全部楼层
回复【5楼】翼间:
---------------------------------
明显不是原子板  楼上想多了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2014-12-24
在线时间
0 小时
发表于 2014-12-25 12:00:21 | 显示全部楼层
回复【5楼】翼间:
---------------------------------
顶老兄,按照你的方法,我无法中断接收的问题也解决了,谢谢!
回复

使用道具 举报

14

主题

225

帖子

3

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2014-7-8
在线时间
26 小时
发表于 2015-3-12 07:45:44 | 显示全部楼层
回复【5楼】翼间:
---------------------------------
好评。。。。。。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-9-23
在线时间
0 小时
发表于 2015-6-12 18:46:53 | 显示全部楼层
楼上好样的。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表