OpenEdv-开源电子网

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

求助!64pin的stm32f105的can1无法工作

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-11
在线时间
0 小时
发表于 2014-12-17 08:34:56 | 显示全部楼层 |阅读模式
5金钱
程序在f107开发板上可以运行,can1和can2收发正常。现将程序移植到f105上,修改了端口定义之后发现can2可以发报文,can1无法发出报文,不知道问题在那边。f107的can1端口在gpioD,而f105的can1在gpioB上,但是我改了端口设置,并且两种重映射都试过了均无法使can1工作,跪求原子哥指点!

主函数
#include "stm32f10x.h"
#include "SysTick.h"
#include "led.h"
//#include "usart1.h"
uint32_t ticktime;
#include "can.h"
#include<stdio.h>

__IO uint32_t flag = 0xff; //用于标志是否接收到数据,在中断函数中赋值
CanTxMsg TxMessage;     //发送缓冲区


typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;


void NVIC_Configuration(void);

void I2C_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure; 

/* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  
    
  /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;       // 开漏输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

int main(void)
{

    uint8_t TransmitMailbox = 0;
// I2C_GPIO_Config();
CAN_Config();
CAN_SetMsg();
LED_GPIO_Config();
SysTick_Init();
USART1_Config();
NVIC_Configuration();
// printf("\r\n 这是一个测试程序\r\n");
// TxMessage.Data[0] = 0x13;
//     CAN_Transmit(CAN2, &TxMessage);
       TxMessage.Data[0] = 0x55;
      CAN_Transmit(CAN2, &TxMessage);  
 Delay_us(200000);
while(1)
{
// GPIO_ResetBits(GPIOD,GPIO_Pin_7);
//    Delay_us(100000);
// GPIO_SetBits(GPIOD,GPIO_Pin_7);
//    Delay_us(100000);
//
//   TxMessage.Data[0] = 0x55;
//       CAN_Transmit(CAN2, &TxMessage);  
//  Delay_us(200000);
//   printf("\r\n 这是一个测试程序\r\n");
//
////     Delay_us(200000);
//  
//   TxMessage.Data[0] = 0xAA;
//      CAN_Transmit(CAN2, &TxMessage);
//    Delay_us(100000);
TxMessage.Data[0] = 0x56;
      CAN_Transmit(CAN2, &TxMessage);
  Delay_us(100000);
  TxMessage.Data[0] = 0x13;
      CAN_Transmit(CAN2, &TxMessage);
  Delay_us(100000);

}
    
}
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 
  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  NVIC_Init(&NVIC_InitStructure);
}

can配置函数



#include "can.h" 

extern   CanTxMsg TxMessage;

static 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 = 0x00;
  }
}
/*
 * 函数名:CAN_GPIO_Config
 * 描述  :CAN的GPIO 配置,PB8上拉输入,PB9推挽输出
 * 输入  :无
 * 输出 : 无
 * 调用  :内部调用
 */
static void CAN_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   
  /*外设时钟设置*/
/* GPIOB, GPIOD and AFIO clocks enable */
 
 
 /* Configure CAN1 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   
  /* Configure CAN2 RX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure CAN1 TX pin */
  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);

  /* Configure CAN2 TX pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

   GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE);
   GPIO_PinRemapConfig(GPIO_Remap_CAN2, ENABLE);
//   GPIO_PinRemapConfig(GPIO_Remap_PD01, ENABLE);


}

/*
 * 函数名:CAN_NVIC_Config
 * 描述  :CAN的NVIC 配置,第1优先级组,0,0优先级
 * 输入  :无
 * 输出 : 无
 * 调用  :内部调用
 */
//static void CAN_NVIC_Config(void)
//{
//   NVIC_InitTypeDef NVIC_InitStructure;
// /* Configure one bit for preemption priority */
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// /*中断设置*/
//// 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);
//}

/*
 * 函数名:CAN_Mode_Config
 * 描述  :CAN的模式 配置
 * 输入  :无
 * 输出 : 无
 * 调用  :内部调用
 */
static void CAN_Mode_Config(void)
{
    CAN_InitTypeDef        CAN_InitStructure;
/************************CAN通信参数设置**********************************/
// /*CAN寄存器初始化*/
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB, ENABLE);
//
//  /* CAN1 and CAN2 Periph clocks enable */
//  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE); 
   CAN_DeInit(CAN1);
  CAN_DeInit(CAN2);
  CAN_StructInit(&CAN_InitStructure);
  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_Mode = CAN_Mode_LoopBack;  /*工作在正常模式*/
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 4;
  CAN_Init(CAN1, &CAN_InitStructure);
  CAN_Init(CAN2, &CAN_InitStructure);
}

/*
 * 函数名:CAN_Filter_Config
 * 描述  :CAN的过滤器 配置
 * 输入  :无
 * 输出 : 无
 * 调用  :内部调用
 */
static void CAN_Filter_Config(void)
{
   CAN_FilterInitTypeDef  CAN_FilterInitStructure;

 /* CAN1滤波器初始化*/
  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);
  
  /* CAN2滤波器初始化*/
  CAN_FilterInitStructure.CAN_FilterNumber = 14;
  CAN_FilterInit(&CAN_FilterInitStructure);
// /*CAN通信中断使能*/
// CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
  CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}


/*
 * 函数名:CAN_Config
 * 描述  :完整配置CAN的功能
 * 输入  :无
 * 输出 : 无
 * 调用  :外部调用
 */
void CAN_Config(void)
{
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO  | RCC_APB2Periph_GPIOB, ENABLE);

  /* CAN1 and CAN2 Periph clocks enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2, ENABLE); 
//    /* Remap CAN1 and CAN2 GPIOs */

   CAN_GPIO_Config();
  CAN_Mode_Config();  
 
//  CAN_NVIC_Config();
 
 
  CAN_Filter_Config();
  
}


/*
 * 函数名:CAN_SetMsg
 * 描述  :CAN通信报文内容设置
 * 输入  :无
 * 输出 : 无
 * 调用  :外部调用
 */  
void CAN_SetMsg(void)
{  
   TxMessage.StdId = 0x321;        /*设定标准标识符*/
  TxMessage.ExtId = 0x01;         /*设定扩展标识符*/
  TxMessage.RTR = CAN_RTR_DATA;  /*数据帧*/
  TxMessage.IDE = CAN_ID_STD;  /*使用标准标识符*/
  TxMessage.DLC = 1;  /*待传输消息的帧长度*/
}
/**************************END OF FILE************************************/


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-11
在线时间
0 小时
 楼主| 发表于 2014-12-17 08:38:33 | 显示全部楼层
将主函数里can发送函数里的can2改成can1也没用,实在不知道哪里错了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-17 23:21:45 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 19:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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