打印

关于STM32F10X CAN通讯的问题请教

[复制链接]
1946|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aminzeng|  楼主 | 2011-11-10 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教:
我的程序如下,但调试时始终发不出去(示波器没波形),不知道什么原因?
请各位帮我审一下,谢谢了。我卡这里都一天了。

时钟:
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC);

GPIO初始化:
GPIO_InitTypeDef GPIO_InitStructure;
/* 将所有GPIO口的时钟都开启 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
                         RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE , ENABLE);
/* PB5配置为推挽输出 */
/* 用于控制程序工作指示灯 */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
/* PD8~PD15配置为推挽输出 */
/* 用于控制数码管的显示值 */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
/* PC6、PC7配置为推挽输出 */
/* 用于控制数码管的位置DIG1和DIG2 */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6|GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
/* PA8、PA9配置为推挽输出 */
/* 用于控制数码管的位置DIG3和DIG4 */
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9;
   GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

/* 配置CAN通迅的: RX  = PD0*/
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
  
   /* 配置CAN通迅的: TX  = PD1*/
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
/* 重映像AFIO,使PD0、PD1为CAN的RX和TX */
   GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);

CAN初始化:
CAN_InitTypeDef     CAN_InitStructure;
CAN_FilterInitTypeDef   CAN_FilterInitStructure;
/* CAN时钟开启 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

/* CAN初始化 */
   /* CAN寄存器初始化 */
   CAN_DeInit(CAN1);
   CAN_StructInit(&CAN_InitStructure);
   /* CAN cell init:设置CAN的MCR和BTR寄存器 */
   CAN_InitStructure.CAN_TTCM  = DISABLE;    /* 关闭时间触发通信模式 */
   CAN_InitStructure.CAN_ABOM  = DISABLE;   /* 软件对INRQ置1并清0后,检测到128次11位连续的隐性位,就退出离线状态 */
   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_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 = 45;    /* 波特率分频器:tq = 5*tPCLK 计算得到:波特率100kb/s*/
   CAN_Init(CAN1, &CAN_InitStructure);      /* 完成后退出初始化状态,进入正常工作模式 */
   /* CAN filter init */
   CAN_FilterInitStructure.CAN_FilterNumber  = 0;  /* 待初始化过滤器序号 */
   CAN_FilterInitStructure.CAN_FilterMode   = CAN_FilterMode_IdMask; /* 标识符屏蔽位模式和标识符列表模式选择 */
   CAN_FilterInitStructure.CAN_FilterScale   = CAN_FilterScale_32bit; /* 标识符位宽设置:2个16位或1个32位 */
   CAN_FilterInitStructure.CAN_FilterIdHigh  = 0x0000;/* 标识符寄存器高16位 */
   CAN_FilterInitStructure.CAN_FilterIdLow   = 0x0000;/* 标识符寄存器低16位 */
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;/* 屏蔽寄存器高16位 */
   CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0x0000;/* 屏蔽寄存器低16位 */
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment= 0;  /* 过滤器被关联到FIFO0 */
   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
   CAN_FilterInit(&CAN_FilterInitStructure);


CAN发送:
CanTxMsg TxMessage;
   CanRxMsg RxMessage;
   u16 i=0;
   u8 TransmitMailbox;
TxMessage.StdId=0x11;
   TxMessage.RTR=CAN_RTR_DATA;
   TxMessage.IDE=CAN_ID_STD;
   TxMessage.DLC=2;
   TxMessage.Data[0]=0xCA;
   TxMessage.Data[1]=0xFE;
for(;;)
{
  OSTimeDly(500);
  
  TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);      
   }

相关帖子

沙发
wenzj12345| | 2012-5-31 11:37 | 只看该作者
收了!谢谢 ~先试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

5

帖子

1

粉丝