这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 关于CAN中断发送被挂起,已经解决问题

共18条 1/2 1 2 跳转至

关于CAN中断发送被挂起,已经解决问题

工程师
2012-05-06 21:04:01     打赏
       最近一直在测试CAN通信,搞了个中断方式的测试代码,目前在测试正常发送模式。
       测试过程中发现有问题,就是数据帧送到邮箱后没有发送出去,而是被挂起了,困扰了很久,特来请教!附上CAN部分的详细代码



关键词: 关于     中断     发送     挂起     已经     解决问题    

工程师
2012-05-06 21:06:55     打赏
2楼

#include "stm32f10x.h"
//#include "USART.h"
#include "delay.h"

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

unsigned char TestTx;  //发送成功标志


unsigned char CAN_MessageSend(void); //报文发送函数
void GPIO_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOE, &GPIO_InitStructure);

         GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );    //重影射CAN IO脚到 PB8,PB9
   /* 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_SetBits(GPIOE, GPIO_Pin_2);
 GPIO_SetBits(GPIOE, GPIO_Pin_3);
 GPIO_SetBits(GPIOE, GPIO_Pin_4);
 GPIO_SetBits(GPIOE, GPIO_Pin_5);
}
//系统中断管理
void NVIC_Configuration(void)
{
// NVIC_InitTypeDef NVIC_InitStructure;

   /* Configure the NVIC Preemption Priority Bits */ 
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

 #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

// /* enabling interrupt */
//   NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;  
//   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
//   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//   NVIC_Init(&NVIC_InitStructure);
}

//配置系统时钟,使能各外设时钟
void RCC_Configuration(void)
{
 SystemInit(); 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
                           |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                           |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
         |RCC_APB2Periph_ADC1  | RCC_APB2Periph_AFIO
                           |RCC_APB2Periph_SPI1, ENABLE );
  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
                           |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2                           
                           , ENABLE );
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
}


//配置所有外设
void Init_All_Periph(void)
{
 RCC_Configuration(); 
 GPIO_Configuration();
 NVIC_Configuration();
}
int main(void)

 Init_All_Periph();
  while(1)
   {
  /* CAN transmit at 100Kb/s and receive by polling in normal mode */
     TestTx = CAN_MessageSend();
     if (TestTx == 1)
     {
        GPIO_ResetBits(GPIOE,GPIO_Pin_5);
        delay_nms(1000);   // LED1闪烁一次,发送一个字符
        GPIO_SetBits(GPIOE,GPIO_Pin_5);
        delay_nms(1000);
     }
   }
}
unsigned char CAN_MessageSend(void)
{
  CAN_InitTypeDef   CAN_InitStructure;
  CanTxMsg TxMessage;
  volatile u8 TransmitMailbox = 0;
  u32 i;
   
  /* CAN register init */
  CAN_DeInit(CAN1);
  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=ENABLE; //自动重传模式
  CAN_InitStructure.CAN_RFLM=DISABLE; //禁止接收FIFO锁定模式,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文
  CAN_InitStructure.CAN_TXFP=DISABLE; //禁止发送FIFO优先级,优先级由报文的标识符来决定
  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=5;        //  (pclk1/((1+8+7)*9)) = 36Mhz/[(CAN_SJW_1tq+CAN_BS1_8tq+CAN_BS2_7tq)*(CAN_Prescaler)] = 100Kbits
                                            //  设定了一个时间单位的长度
 
  CAN_Init(CAN1,&CAN_InitStructure);

  /* transmit 1 message */
  TxMessage.StdId=0x01;
  //TxMessage.ExtId=0x1234;
  TxMessage.IDE=CAN_ID_STD;//使用标准格式,扩展格式为:TxMessage.IDE=CAN_ID_EXT;
  TxMessage.RTR=CAN_RTR_DATA; //数据帧
  TxMessage.DLC=1;
  TxMessage.Data[0]=0xDE;
  //TxMessage.Data[1]=0xCA;
 
  /*数据发送*/  
  TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
  i = 0;
  while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i != 0xFF)) //等待CAN总线传输数据成功
  {
      i++;
   
  }
  if(i==0xff)//发送超时,但发送不成功
  {
         GPIO_ResetBits(GPIOE,GPIO_Pin_4);
        delay_nms(1000);   // LED1闪烁一次,发送一个字符
        GPIO_SetBits(GPIOE,GPIO_Pin_4);
        delay_nms(1000);
    return 0;
  }

   return 1;
}


工程师
2012-05-06 21:10:01     打赏
3楼
红色代码标记地方,就是程序运行的BUG处,经过测试,系统运行到此处,而并没有返回1。没有分析出具体问题的原因,判断是发送不成功,超时了。请各位给分析下。

院士
2012-05-06 22:22:35     打赏
4楼
can通讯还没有进入学习呢。
太快了~~~

工程师
2012-05-07 00:01:13     打赏
5楼
手头没有扩展件,先做这个通信的啊

专家
2012-05-07 16:33:47     打赏
6楼
从字面上你的显示CAN总线发送失败,也就是发送不了数据!可能的原因:
1、你用的是中断发送么还是??请检查一下,如果是中断的话就看看中断入口!或者是修改中断服务入口

2、检查一下CAN总线的IO口对与否,是不是映射了还是没有映射!!

3、建议设置一下掩码地址

工程师
2012-05-07 16:54:22     打赏
7楼
是中断方式,可是在发送时没有使用中断,我刚才观察了寄存器的值。发现TSR寄存器没有发送成功也就是RQCP0==0,不知道怎么搞得。会不会是接收端程序的问题,要是接收端不能正常接收,是不是也会发送失败。

工程师
2012-05-07 16:56:11     打赏
8楼
IO口用的PB8,PB9啊,就是板子上的,这个已经映射了。帮我详细的看看吧,我实在崩溃了。

工程师
2012-05-07 19:12:41     打赏
9楼
楼主:你把以下这几行都屏蔽了,CAN中断向量好像等于没有了。 // /* enabling interrupt */ // NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC_Init(&NVIC_InitStructure);

工程师
2012-05-07 19:42:55     打赏
10楼
那个是接收的吧,发送时用不到吧

共18条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]