[STM32F1] F103使用CAN死活不通,求助各位

[复制链接]
2201|5
 楼主| 老牛09 发表于 2015-11-5 15:11 | 显示全部楼层 |阅读模式
CAN, pi, IO, ni, GPIO
自己做的F103 + MCP2551的板,CAN死活不通,以为硬件设计有问题,又单独用焊片2551小板, 接到一个F405的板子上,能正常发送数据给别的CAN设备了,在接到103上,还是不通, 怀疑做的板有问题,又找一个F103的开发板来测,接这个2551小板,还是不通,现在软件硬件都查了无数回了,还是没找到原因:'(,
103回环模式,引脚有波形,正常下无,总线上以无波形。

测试代码:
  1. //can function ------------------------------------------------
  2. #define CAN_REMAP
  3. #define USE_CAN
  4. int canStat = 0;
  5. static void can_rcc_config()
  6. {
  7.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  8.     //RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
  9.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_CAN1, ENABLE);
  10.    
  11. #ifdef CAN_REMAP   
  12.     //Remap  to PB8, PB9
  13.         GPIO_PinRemapConfig( GPIO_Remap1_CAN1, ENABLE);
  14. #endif
  15. }
  16. static void can_gpio_config()
  17. {
  18.     GPIO_InitTypeDef initStructure;

  19. #ifdef CAN_REMAP
  20.         //CAN RX
  21.     initStructure.GPIO_Pin  = GPIO_Pin_8;
  22.     initStructure.GPIO_Speed = GPIO_Speed_50MHz;
  23.     initStructure.GPIO_Mode = GPIO_Mode_IPU;
  24.     GPIO_Init( GPIOB, &initStructure );

  25.     //CAN TX
  26.     initStructure.GPIO_Pin  = GPIO_Pin_9;
  27.     initStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  28.     GPIO_Init( GPIOB, &initStructure );
  29. #else
  30.     //CAN RX
  31.     initStructure.GPIO_Pin  = GPIO_Pin_11;
  32.     initStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.     initStructure.GPIO_Mode = GPIO_Mode_IPU;
  34.     GPIO_Init( GPIOA, &initStructure );

  35.     //CAN TX
  36.     initStructure.GPIO_Pin  = GPIO_Pin_12;
  37.     initStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  38.     GPIO_Init( GPIOA, &initStructure );
  39. #endif       
  40.     //?
  41.         //GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN0);
  42.     //GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1); //GPIOA12复用为CAN1
  43. }
  44. static void can_config()
  45. {
  46.     CAN_InitTypeDef initStructure;
  47.     CAN_FilterInitTypeDef filterInitStructure;

  48.     //CAN_DeInit( CAN1 );
  49.     CAN_StructInit(&initStructure );
  50.     initStructure.CAN_TTCM = DISABLE;
  51.     initStructure.CAN_ABOM = DISABLE;  //如果ABOM位为’1’,bxCAN进入离线状态后,就自动开启恢复过程
  52.     initStructure.CAN_AWUM = DISABLE;
  53.     initStructure.CAN_NART = DISABLE;  // DISABLE;  //禁止自动重发
  54.     initStructure.CAN_RFLM = DISABLE;
  55.     initStructure.CAN_TXFP = DISABLE;
  56.     initStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack , CAN_Mode_Normal;
  57.     initStructure.CAN_SJW  = CAN_SJW_1tq;  // CAN_SJW_1tq;
  58.     initStructure.CAN_BS1  = CAN_BS1_8tq; //CAN_BS1_5tq; // CAN_BS1_8tq;
  59.     initStructure.CAN_BS2  = CAN_BS2_7tq;// CAN_BS2_3tq;  // CAN_BS2_7tq;
  60.    
  61.     //36M / ( 1 + 5 + 3 ) / 16 = 250kbps
  62.     //2,1,9 = 1M;   8,7,9 = 250k
  63.     initStructure.CAN_Prescaler = 9; //16
  64.     CAN_Init(CAN1, &initStructure );

  65.     filterInitStructure.CAN_FilterNumber = 0;
  66.     filterInitStructure.CAN_FilterMode   = CAN_FilterMode_IdMask;
  67.     filterInitStructure.CAN_FilterScale  = CAN_FilterScale_32bit;
  68.     filterInitStructure.CAN_FilterIdHigh = 0x0000;// << 3;
  69.     filterInitStructure.CAN_FilterIdLow  = 0x0000;
  70.     filterInitStructure.CAN_FilterMaskIdHigh = 0x0000;// << 3;
  71.     filterInitStructure.CAN_FilterMaskIdLow  = 0x0000;
  72.     filterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
  73.     filterInitStructure.CAN_FilterActivation = ENABLE;
  74.     CAN_FilterInit( &filterInitStructure );

  75. }


  76. void can_sendData()
  77. {
  78.     static uint32_t count = 0;
  79.     int tryCount = 0;
  80.     uint8_t ret = 0;

  81.     uint8_t transmitMailbox = 0;
  82.     CanTxMsg txMessage;
  83.     CanRxMsg rxMessage;

  84.     //txMessage.ExtId = 0x00AA0000;
  85.     txMessage.StdId = 0x123;
  86.     txMessage.ExtId = 0x12345;
  87.     txMessage.RTR = CAN_RTR_DATA;
  88.     txMessage.IDE = CAN_ID_EXT;
  89.     //txMessage.IDE = CAN_ID_STD;
  90.     txMessage.DLC = 8;
  91.     txMessage.Data[0] = 0x00;
  92.     txMessage.Data[1] = 0x12;
  93.     txMessage.Data[2] = 0x34;
  94.     txMessage.Data[3] = 0x56;
  95.     txMessage.Data[4] = ((char*)&count)[0];// 0x78;
  96.     txMessage.Data[5] = ((char*)&count)[1];//0xAB;
  97.     txMessage.Data[6] = ((char*)&count)[2];//0xCD;
  98.     txMessage.Data[7] = ((char*)&count)[3];//0xEF;
  99.     count++;

  100.     transmitMailbox = CAN_Transmit(CAN1, &txMessage );
  101.    
  102.     if( transmitMailbox < 3 )
  103.     {
  104.         ret = CAN_TransmitStatus(CAN1, transmitMailbox);
  105.         while( tryCount < 1000 && (ret) != CANTXOK )
  106.         {
  107.             ret = CAN_TransmitStatus(CAN1, transmitMailbox);
  108.             tryCount++;
  109.         };
  110.     }

  111. }



icecut 发表于 2015-11-5 16:17 | 显示全部楼层
你先找个别人用着没问题的板子和代码.
 楼主| 老牛09 发表于 2015-11-6 22:17 | 显示全部楼层
icecut 发表于 2015-11-5 16:17
你先找个别人用着没问题的板子和代码.

我已经用了两个不同的板了,代码已都反复查过了。还是这样啊
457344370 发表于 2015-11-7 07:37 | 显示全部楼层
以前写的,当年调OSEK的时候随手写的,在C8T6和VET6上使用正常,波特率125K,中断接收

#include "stm32f10x.h"
#include "sys_can.h"

CanTxMsg CAN_TxMessage;
CanRxMsg CAN_RxMessage;

static void CAN_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
        /* Configure CAN pin: RX */                                                                                       // PB8
        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 */                                                                                       // PB9
        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);
}

static void CAN_NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

static void CAN_Mode_Config(void)
{
        CAN_InitTypeDef CAN_InitStructure;

        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);

        CAN_InitStructure.CAN_TTCM=DISABLE;                           //MCR-TTCM  关闭时间触发通信模式使能
        CAN_InitStructure.CAN_ABOM=ENABLE;                           //MCR-ABOM  自动离线管理
        CAN_InitStructure.CAN_AWUM=ENABLE;                           //MCR-AWUM  使用自动唤醒模式
        CAN_InitStructure.CAN_NART=DISABLE;                           //MCR-NART  禁止报文自动重传          DISABLE-自动重传
        CAN_InitStructure.CAN_RFLM=DISABLE;                           //MCR-RFLM  接收FIFO 锁定模式  DISABLE-溢出时新报文会覆盖原有报文  
        CAN_InitStructure.CAN_TXFP=DISABLE;                           //MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
        CAN_InitStructure.CAN_SJW=CAN_SJW_3tq;
        CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
        CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
        CAN_InitStructure.CAN_Prescaler =6;
        CAN_Init(CAN1, &CAN_InitStructure);
}

static void CAN_Filter_Config(void)
{
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        CAN_FilterInitStructure.CAN_FilterNumber=0;
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;        //工作在标识符掩码模式
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;        //过滤器位宽为单个32位。

        CAN_FilterInitStructure.CAN_FilterIdHigh= 0x400<<5;                                //要过滤的ID高位
        CAN_FilterInitStructure.CAN_FilterIdLow= CAN_RTR_Data|CAN_Id_Standard; //要过滤的ID低位
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xffff;                                                                //屏蔽0x400-0x4ff以外的所有ID
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xffff;                                                                        //屏蔽非标准数据帧
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0 ;                                //过滤器被关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                        //使能过滤器
        CAN_FilterInit(&CAN_FilterInitStructure);
       
        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}

void sys_canInit(void)
{
  CAN_GPIO_Config();
  CAN_NVIC_Config();
  CAN_Mode_Config();
  CAN_Filter_Config();
}


//#define USE_UCOS_II
#ifdef USE_UCOS_II
  extern void OSIntEnter(void);
  extern void OSIntExit(void);
  extern short OSTimeDlyResume(short);
#else
  #define OSIntEnter()
  #define OSIntExit()
  #define OSTimeDlyResume(x)
#endif


//extern void APP_CanMsg_Handler(void);//在CAN_Msg中定义
extern CanRxMsg CAN_RxMessage;

void USB_LP_CAN1_RX0_IRQHandler(void)
{
        OSIntEnter();
        if(CAN_GetITStatus(CAN1, CAN_IT_FMP0)!=RESET)
        {
//                APP_CanMsg_Handler();
    CAN_Receive(CAN1, CAN_FIFO0, &CAN_RxMessage);
//    OSTimeDlyResume(10);
        }
//        do
//        {
//                CAN_FIFORelease(CAN1,CAN_FIFO0);
//        }while(CAN_MessagePending(CAN1, CAN_FIFO0));
        OSIntExit();
}

void CAN1_RX1_IRQHandler(void)
{
        OSIntEnter();
        CAN_FIFORelease(CAN1,CAN_FIFO1);
        OSIntExit();
}

void CAN1_SCE_IRQHandler(void)
{
        OSIntEnter();
        if(CAN_GetITStatus(CAN1, CAN_IT_ERR)!=RESET)
        {
                CAN_ClearITPendingBit(CAN1, CAN_IT_ERR);
        }
        OSIntExit();
}
huangcunxiake 发表于 2015-11-7 20:13 来自手机 | 显示全部楼层
这也太费劲了,上面这位朋友的代码可以正常使用吗?硬件配置有问题没?
老鼠不怕猫 发表于 2015-11-9 11:40 | 显示全部楼层
本公司代理STM32&STM8全系列MCU,意法半导体指定认证代理商,有需要报价或要货的可以与我联络。qq2355925821,电话13802244205。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部