OpenEdv-开源电子网

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

还是CAN的问题

[复制链接]

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
发表于 2012-4-24 16:30:26 | 显示全部楼层 |阅读模式

各位帮帮忙,看看小弟的程序问题出在哪,搞了好几天了都不成功 单片机用的是STM32F103RBT6 CAN收发引脚用的是PA11和PA12
#include <stm32f10x_lib.h>
//#include "stm32f10x_it.h"

//typedef enum {FAILED=0 , PASSED=!FAILED} Teststatus;

vu32 ret=0;  //中断函数返回值
//volatile Teststatus TestRx;
ErrorStatus HSEStartUpStatus;

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void CAN_Interrupt(void);

int main()
{
     RCC_Configuration(); //时钟初始化

     GPIO_Configuration(); //IO引脚初始化
 
     NVIC_Configuration(); //中断初始化

     CAN_Interrupt();

     if(ret==1)
     {
      GPIO_SetBits(GPIOA,GPIO_Pin_8);
     }
     else
     {
      GPIO_ResetBits(GPIOA,GPIO_Pin_8);
     }  
     while(1)
     {
  
     }
}

 


void RCC_Configuration(void)
{
     RCC_DeInit();    //外设时钟复位

     RCC_HSEConfig(RCC_HSE_ON);  //使能外部高速晶振

     HSEStartUpStatus = RCC_WaitForHSEStartUp();  //等待外部时钟就绪
 
      if(HSEStartUpStatus == SUCCESS)
       {
          FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

          FLASH_SetLatency(FLASH_Latency_2);   //FLASH延时2个周期

          RCC_HCLKConfig(RCC_SYSCLK_Div1);   //AHB时钟=系统时钟 
  
         RCC_PCLK2Config(RCC_HCLK_Div1);    //APB2时钟=系统时钟

         RCC_PCLK1Config(RCC_HCLK_Div2);    //APB1时钟=系统时钟/2

         RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);  //PLL输入时钟=HSE时钟,PLL倍频数为9

         RCC_PLLCmd(ENABLE);

         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)   //等待PLL就绪
          {
          }

          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);     //设置PLL为系统时钟

          while(RCC_GetSYSCLKSource()!=0x08)  //等待PLL为系统时钟
          {
          }

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);  //使能PORTA时钟

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);  //使能外设CAN的时钟
       }
}


void GPIO_Configuration()
{
     GPIO_InitTypeDef GPIO_InitStructure;

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA,&GPIO_InitStructure);

     //配置PA11为CAN_RX
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

     //配置PA12为CAN_TX
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void NVIC_Configuration()
{
     NVIC_InitTypeDef NVIC_InitStructure;

    #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

 //使能CAN中断
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
     NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级为0
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;    //响应优先级为2
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
}


void CAN_Interrupt(void)
{
   CAN_InitTypeDef        CAN_InitStructure;
   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
//  CanTxMsg TxMessage;
// CanRxMsg RxMessage;
//  u16 i=0;
// u8 TransmitMailbox;

   CAN_DeInit();
   CAN_StructInit(&CAN_InitStructure);

   CAN_InitStructure.CAN_TTCM=DISABLE;    //禁止时间触发通信模式
   CAN_InitStructure.CAN_ABOM=DISABLE;    //软件对CAN_MCR寄存器的INRQ位置1后清零,CAN硬件检测到总线空闲就自动退出离线状态
   CAN_InitStructure.CAN_AWUM=DISABLE;    //睡眠模式由软件唤醒
   CAN_InitStructure.CAN_NART=DISABLE;    //报文发送失败后会自动重传
   CAN_InitStructure.CAN_RFLM=DISABLE;    //接收FIFO未被锁定,下一个报文会覆盖原有的报文
   CAN_InitStructure.CAN_TXFP=DISABLE;       //报文的优先级由标识符决定
   CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;  //CAN硬件工作在模式
   CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;   //重新跳跃宽度为1个时间份额
   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;    //时间段1为8个时间份额
   CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;   //时间段2为7个时间份额
   CAN_InitStructure.CAN_Prescaler=9;    //预分频系数为9  波特率为250k
 CAN_Init(&CAN_InitStructure);

   //过滤器初始化
   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=CAN_FIFO0;
   CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
   CAN_FilterInit(&CAN_FilterInitStructure);

 CAN_ITConfig(CAN_IT_FMP0,ENABLE);
}

中断接收函数
void USB_LP_CAN_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(CAN_FIFO0, &RxMessage);
  
   if((RxMessage.IDE==CAN_ID_STD)&& (RxMessage.DLC==2) && (RxMessage.FMI==0) && ((RxMessage.Data[0]|RxMessage.Data[1]<<8)==0x5555))
   {
      ret = 1;
   }
   else
   {
      ret = 0;
   }   
 
   CAN_ITConfig(CAN_IT_FMP0,DISABLE); 
}

拜托各位了


 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2012-4-24 17:38:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
额,我也很惆怅啊。搞了好长时间都没搞定,唉……
STM32好难……
回复 支持 反对

使用道具 举报

2

主题

130

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1878
金钱
1878
注册时间
2011-9-16
在线时间
421 小时
发表于 2012-4-25 22:20:12 | 显示全部楼层

库函数的看起来真的很惆怅
我有代码是看了别人的库函数版本,然后再看寄存器转过来的
代码量看起来小多了,.H里面用到了一个结构体
模拟仿真过,仿真时设置成环回模式,能查看到发送和接收报文,并且用LED翻转显示收到数据。
以下是代码:有详尽注释,希望可以帮到你 注释后的数字是相应的寄存器在《STM32中文参考手册》中的页码
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "CAN.h"
 CAN_msg     CAN_TxMsg;    //发送邮箱
 CAN_msg     CAN_RxMsg;    //接收邮箱
 u8 CAN_TxRdy=0;     //发送就绪标志
 u8 CAN_RxRdy=0;     //接收就绪标志
 u8 CAN_TDTxR_DLC;     //数据长度,最高为1111
/////////////////CAN设置/////////////////////////////////////
void CAN_setup(void)
{
  u8 brp=20;           //获取主时钟频率  APB1ENR时钟频率为36M
  RCC->APB1ENR|=1<<25;              //RCC_APB1ENR_CANEN; //开启CAN使能时钟
  RCC->APB2ENR|=1<<0;               //RCC_APB2ENR_AFIOEN; //开启辅助时钟
  AFIO->MAPR&=0XFFFF9FFF;   //清除复用重映射配置寄存器13,14位,
  AFIO->MAPR|=0X00004000;   //配置为10;IO口重映射至PB8.PB9
  RCC->APB2ENR|=1<<3;               //RCC_APB2ENR_IOPBEN; //开启IO口B时钟
  GPIOB->CRH&=~(0X0F<<0);   //清除PB8状态寄存器~(1111<<0)
  GPIOB->CRH|=(0X08<<0);   //设定pb8上下拉输入1000
  GPIOB->CRH&=~(0XF<<4);   //清空pb9状态寄存器
  GPIOB->CRH|=(0X0B<<4);   //设定PB9推挽输出
  MY_NVIC_Init(1,1,USB_HP_CAN_TX_IRQChannel,2);//发送中断使能
  MY_NVIC_Init(1,1,USB_LP_CAN_RX0_IRQChannel,2);//接收中断使能
  CAN->MCR|=1<<4;     //置NART位为1,禁止自动重传  403
  CAN->MCR|=1<<0;                   //置INRQ位为1,请求初始化    403 (CAN_MCR_NART|CAN_MCR_INRQ);//初始化模式,禁止重传
  CAN->IER|=1<<0;     //发送邮箱空中断允许   409
  CAN->IER|=1<<1;                   //FIFO0消息挂号中断允许      409 (CAN_IER_FMPIE0|CAN_IER_TMEIE);
  //brp=(brp/18)/500000;    //波特率设置500Kb/s,计算波特率分频器值
  CAN->BTR&=~(((0X03)<<24)|((0x07)<<20)|((0x0f)<<16)|(0x1ff)); //清空BTR寄存器相关位 410  400
  CAN->BTR|=(((1&0X03)<<24)|((7&0X07)<<20)|((8&0X0F)<<16)|(brp-1));//设置BTR寄存器  410 400
 
  }   /* TSEG1 = 12, TSEG2 = 5, SJW = 4 => 1 CAN bit = 18 TQ, sample at 72%    */
  //////////////从初始化模式进入正常工作模式/////////////////////////////////////////////
  void CAN_start(void)
  {
   CAN->MCR&=0xfffffffe;
   while(CAN->MSR&(0x01));
   CAN->MCR&=0xfffffffd;               //清零INRQ位,进入正常模式
   //while(~(CAN->MSR&0x01));               //等待硬件对INAK位清零,确认退出初始化
   }
   //////////////设置工作模式///////////////////////////////////////////
  void CAN_testmode(void)
  {
   CAN->BTR&=0x3fffffff;   //清空BTR 的SILM LBKM位 410
   CAN->BTR|=0XC0000000;//设置BTR 的LBKM位为高,环回模式  410
 
   }
  ///////////////检测发送邮箱为空////////////////////////////////////////////////
  void CAN_waitReady(void)
  {
   while((CAN->TSR&(1<<26))==0);    //检测发送邮箱0标志位,为1则为空,为0不为空
   CAN_TxRdy=1;         //置发送就绪标志位为1
  }
  ///////////////发送数据//////////////////////////////////////
  void CAN_wrMsg(CAN_msg *msg)
  {
   CAN->sTxMailBox[0].TIR=(u8)0;  //发送邮箱标示符寄存器复位 清零
   if(msg->format ==STANDARD_FORMAT)//如果是标准11位标示符帧
      {msg->id=33 ;
    CAN->sTxMailBox[0].TIR|=0x4200000;//(msg->id<<21)|CAN_ID_STD; //则标示符左移21位,高11位为标准标示符,标示符选择位置0  411
    }
   else          //如果是29位扩展标示符帧
      {
    CAN->sTxMailBox[0].TIR|=(u8)(msg->id<<3)|CAN_ID_EXT;  //标示符左移3位,高29位为标示符(扩展标示符) 标示符选择位置1  411
    }
   if(msg->type==DATA_FRAME)    //如果消息为数据帧
       {
     CAN->sTxMailBox[0].TIR|=CAN_RTR_DATA;//标示符寄存器RTR位置0,数据帧
       }
   else          //如果为远程帧
       {
     CAN->sTxMailBox[0].TIR|=CAN_RTR_REMOTE; //标示符寄存器RTR置1,远程帧
  }
   CAN->sTxMailBox[0].TDLR=(((u8)msg->data[3]<<24)|((u8)msg->data[2]<<16)|((u8)msg->data[1]<<8)|((u8)msg->data[0]));    //数据位低4字节写入发送邮箱0
                           
         
         
   CAN->sTxMailBox[0].TDHR=(((u8)msg->data[7]<<24)|((u8)msg->data[6]<<16)|((u8)msg->data[5]<<8)|((u8)msg->data[4]));    //数据位高4字节写入发送邮箱0
                           
         
         
   CAN->sTxMailBox[0].TDTR&=0xfffffff0;  //设置消息长度DLC清0
   CAN->sTxMailBox[0].TDTR|=0x00000004;  //设置消息长度为4个字节
   CAN->IER|=1<<0;                  //发送邮箱空中断使能 409
   CAN->sTxMailBox[0].TIR|=1<<0;                //发送消息 411
 
   }
   ///////////////读取邮箱数据并释放//////////////////////////////////////////////////////////////
  void CAN_rdMsg(CAN_msg *msg)
    {
  if((CAN->sFIFOMailBox[0].RIR&CAN_ID_EXT)==0) //如果是11位标准标识符
     {
   msg->format=STANDARD_FORMAT;     //消息为标准格式
   msg->id=(u32)0x000007ff&(CAN->sFIFOMailBox[0].RIR>>21); //标示符等于标示符位右移21位与0x7ff
         }
  else   //如果是29位扩展标识符
      {
   msg->format=EXTENDED_FORMAT;     //消息格式为扩展标示符格式
   msg->id=(u32)0x0003ffff&(CAN->sFIFOMailBox[0].RIR>>3); //标示符等于标示符位右移3位与上0x3ffff
         }
     if((CAN->sFIFOMailBox[0].RIR&CAN_RTR_REMOTE)==0) //如果消息为数据帧  
      {
    msg->type=DATA_FRAME;
   }
  else                                          //数据位远程帧
      {
    msg->type=REMOTE_FRAME;
   }
   msg->len = (unsigned char)0x0000000F & CAN->sFIFOMailBox[0].RDTR;  //读取数据长度
 
   msg->data[0] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR);    //读取数据低4字节
   msg->data[1] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 8);
   msg->data[2] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 16);
   msg->data[3] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDLR >> 24);
 
   msg->data[4] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR);   //读取数据高4字节
   msg->data[5] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 8);
   msg->data[6] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 16);
   msg->data[7] = (unsigned int)0x000000FF & (CAN->sFIFOMailBox[0].RDHR >> 24);

   CAN->RF0R |= 1<<5;                                   //释放接收邮箱0 407
 }
////////////////////////设置标示符过滤器组/////////////////////////////////////////////////////////////////////////////

  void CAN_wrFilter (unsigned int id, unsigned char format) 
{
  static unsigned short CAN_filterIdx = 0;   //标示符设置数量索引
         unsigned int   CAN_msgId     = 0;   //变量用于存储需要设定的标示符
 
   if (CAN_filterIdx > 13)        //检查CAN过滤器是否已满,最高到13
     {                      
      return;          //如果已满-返回
     }
   if (format == STANDARD_FORMAT)       //如果是标准帧,标准帧是11位ID(报文识别码)
     {                                        // Standard ID
      CAN_msgId  |= (unsigned int)(id << 21) | CAN_ID_STD;//标示符左移21位并添加帧识别码,得到32位的标示符字
     } 
  else                                        //如果是扩展帧,扩展帧是29位ID(报文识别码)
  {                                           // Extended ID
      CAN_msgId  |= (unsigned int)(id <<  3) | CAN_ID_EXT;//标示符左移3位并添加帧识别码,得到32位的标示符字
  }
                                              // set Initialisation mode for filter banks
                                              //CAN过滤器组工作在初始化模式
  CAN->FMR  |=  1<<0; 
                                              // deactivate filter                 
  CAN->FA1R &=  ~(unsigned int)(1 << CAN_filterIdx);

                                              // initialize filter
                                              // set 32-bit scale configuration
                                              //初始化过滤器
                                              //过滤器位宽为单个32位
  CAN->FS1R |= (unsigned int)(1 << CAN_filterIdx);
  // set 2 32-bit identifier list mode
  //过滤器组x的2个32位寄存器工作在标识符列表模式
  CAN->FM1R |= (unsigned int)(1 << CAN_filterIdx);
  //  32-bit identifier
  //32位标识符
  CAN->sFilterRegister[CAN_filterIdx].FR1 = CAN_msgId;
  //  32-bit identifier
  //32位标识符
  CAN->sFilterRegister[CAN_filterIdx].FR2 = CAN_msgId;
  // assign filter to FIFO 0
  //过滤器被关联到FIFO0
  CAN->FFA1R &= ~(unsigned int)(1 << CAN_filterIdx); 
  // activate filter
  //过滤器被激活
  CAN->FA1R  |=  (unsigned int)(1 << CAN_filterIdx); 
  // reset Initialisation mode for filter banks
  //CAN过滤器组工作在正常模式
  CAN->FMR &= ~(1<<0);                        // 该位置0为正常模式  415
  // increase filter index
  //设置的过滤器数量增加
  CAN_filterIdx += 1;
}

/*----------------------------------------------------------------------------
  CAN transmit interrupt handler
  CAN发送中断
 *----------------------------------------------------------------------------*/
void USB_HP_CAN_TX_IRQHandler (void)
 {
                                    // request completed mbx 0
                                    //邮箱0请求完成  当发送完成后硬件对该位置1 407
 if (CAN->TSR & (1<<0))    //检测是否置1来判断发送已完成
  {
                                   // reset request complete mbx 0
                                   //复位邮箱0请求,对该位写1可以清0该位    407
    CAN->TSR |= 1<<0;
                                    // disable  TME interrupt      
                                                      
    CAN->IER &= ~(1<<0);     //禁止发送邮箱空中断             
 
   CAN_TxRdy = 1;
  }
}       

/*----------------------------------------------------------------------------
  CAN receive interrupt handler
  CAN接收中断
 *----------------------------------------------------------------------------*/
void USB_LP_CAN_RX0_IRQHandler (void) {
                                      // message pending ?
                                      //接收到CAN报文,通过判断报文数目判断是否有报文
  if (CAN->RF0R & (1<<0))
  {       
                                   // read the message
                                   //接收报文
   CAN_rdMsg (&CAN_RxMsg);

    CAN_RxRdy = 1;                    // set receive flag
  }
}


////////////////////////CAN初始化////////////////////////////////////////////////////////////////////////
void can_Init (void)
{

  CAN_setup ();                                   // setup CAN interface
  CAN_wrFilter (33, STANDARD_FORMAT);             // Enable reception of messages,filter set

  /* COMMENT THE LINE BELOW TO ENABLE DEVICE TO PARTICIPATE IN CAN NETWORK   */
  //CAN_testmode(CAN_BTR_SILM | CAN_BTR_LBKM);      // Loopback, Silent Mode (self-test)
 
  //软件仿真使用环回模式
  //CAN_testmode(CAN_BTR_SILM | CAN_BTR_LBKM); /* Loopback and           */
  //硬件仿真使用正常模式
   CAN_testmode(); //正常模式
  // leave init mode
  //进入正常模式
   CAN_start ();
  // wait til mbx is empty
  //等待CAN就绪
   CAN_waitReady ();
}

以下是.H文件
#ifndef _CAN_H_
#define _CAN_H_

#define STANDARD_FORMAT  0
#define EXTENDED_FORMAT  1

#define DATA_FRAME       0
#define REMOTE_FRAME     1

#define CAN_ID_STD                 ((u32)0x00000000)  /* Standard Id */
#define CAN_ID_EXT                 ((u32)0x00000004)  /* Extended Id */


typedef struct  {
  unsigned int   id;                 // 29 bit identifier
  unsigned char  data[8];            // Data field
  unsigned char  len;                // Length of data field in bytes
  unsigned char  format;             // 0 - STANDARD, 1- EXTENDED IDENTIFIER
  unsigned char  type;               // 0 - DATA FRAME, 1 - REMOTE FRAME
} CAN_msg;

/* Functions defined in module CAN.c */
void CAN_setup         (void);
//void CAN_init          (void);
void CAN_start         (void);
void CAN_waitReady     (void);
void CAN_wrMsg         (CAN_msg *msg);
void CAN_rdMsg         (CAN_msg *msg);
void CAN_wrFilter      (unsigned int id, unsigned char filter_type);
void can_Init (void);
void CAN_testmode      (void);

extern CAN_msg       CAN_TxMsg;      // CAN messge for sending
extern CAN_msg       CAN_RxMsg;      // CAN message for receiving                               
extern u8  CAN_TxRdy;      // CAN HW ready to transmit a message
extern u8   CAN_RxRdy;      // CAN HW received a message

#endif // _CAN_H_

以下是主程序部分:
int main(void)      // 主函数,int类型,无参数
{
 u32 i=0;
 Stm32_Clock_Init(9);  //  调用系统时钟初始化子程序
 delay_init(72);   //  调用延时初始化子程序
 IOSET_init();    //  调用io口初始化子程序
 WM_Init(9000,0);   //   定时器4初始化,设定PWM频率=72MHz/9000=8KH
 
  can_Init ();                                    // initialise CAN interface
 
                               // initialise message to send
  for (i = 0; i < 8; i++) CAN_TxMsg.data = 0;
 
 
 
 
 
 
   
 while(1)
 {
       delay_us(160);


 if (CAN_TxRdy)
    {
       if(++i==600)
       {

   CAN_TxMsg.id = 33;
   CAN_TxMsg.len = 4;
         CAN_TxMsg.format = STANDARD_FORMAT;//使用标准帧
         CAN_TxMsg.type = DATA_FRAME;//数据帧

 


          //i=0;
          //下面是数据报文
          CAN_TxMsg.data[0] = 1;
          CAN_TxMsg.data[1] = 2;
          CAN_TxMsg.data[2] =3;
          CAN_TxMsg.data[3] =4;
         
          //发送CAN报文
          CAN_TxRdy = 0;
          CAN_wrMsg (&CAN_TxMsg);
       }
       else if(i==1200)
       {
          i=0;
          //下面是数据报文
          CAN_TxMsg.data[0] = 0;
          CAN_TxMsg.data[1] = 1;
          CAN_TxMsg.data[2] = 1;
          CAN_TxMsg.data[3] = 1;
         
          //发送CAN报文
          CAN_TxRdy = 0;
          CAN_wrMsg (&CAN_TxMsg);
       }
      
    }
   

    if (CAN_RxRdy)
    {
       CAN_RxRdy = 0;
      
       if(CAN_RxMsg.data[0]==1)////PC8状态
            LED1=0;
       else
          LED1=1;
      
       if(CAN_RxMsg.data[1]==2)////PC9状态
          LED2=0;
       else
          LED2=1;
      
       if(CAN_RxMsg.data[2]==3)////PC10状态
          LED3=0;
       else
          LED3=1;
      
       if(CAN_RxMsg.data[3]==4)////PC11状态
          LED4=0;
       else
          LED4=1;
      
    }

 }
 }

以下是仿真截图


 


 


 


 



 

回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2012-4-26 08:39:43 | 显示全部楼层
LZ确认进入中断后是关中断而不是清除中断标志位吗?

初步分析了下,基本运行条件是具备的。
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2012-5-14
在线时间
3 小时
发表于 2012-5-15 14:54:27 | 显示全部楼层
回复【4楼】mackyming:
---------------------------------
你好,能把这些资料包括仿真软件上位机和程序发给我么,有急用。我的邮箱xingyang104@163.com,非常感谢
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2011-8-16
在线时间
0 小时
 楼主| 发表于 2012-5-15 20:27:04 | 显示全部楼层
回复【4楼】mackyming:
---------------------------------
多谢,您的这个工程我在网上下载过。我要做的是用STM32接收SJA1000发过来的数据,网上有人说这两种的CAN帧格式还不一样,我一直没找到哪里不一样,不知道您了解么?
STM32好难……
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2012-5-16 17:33:26 | 显示全部楼层
回复【7楼】毛驴太君:
---------------------------------
格式是一样的,只是时基可能根据设计有所不同.
首先建议检查硬件,看发送时有没有出现显性错误.
如果有示波器,检查线路上关键节点是否有信号.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2013-1-30 14:36:31 | 显示全部楼层
回复【4楼】mackyming:
---------------------------------
非常感谢呀,你的回复解决了我大问题了。
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2013-12-14 21:06:31 | 显示全部楼层
回复【9楼】bxl131:
---------------------------------
问题解决了么?我现在调自发自收,其实已经出来很多了现象了,因为我调的是手柄,所以我希望可以按下按键后再出现象!我想的是把按下的数据放在
TxMessage.Data[0]=    里。。。不知道可以实现么?
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2013-12-14 21:06:46 | 显示全部楼层
回复【8楼】shihantu:
---------------------------------
问题解决了么?我现在调自发自收,其实已经出来很多了现象了,因为我调的是手柄,所以我希望可以按下按键后再出现象!我想的是把按下的数据放在 
TxMessage.Data[0]=    里。。。不知道可以实现么?
回复 支持 反对

使用道具 举报

8

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-7-20
在线时间
9 小时
发表于 2015-5-17 23:33:48 | 显示全部楼层
回复【4楼】 mackyming :
---------------------------------
你的程序,我有一个不明白的地方


回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 12:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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