OpenEdv-开源电子网

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

can通信

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-4-9
在线时间
6 小时
发表于 2016-4-11 20:52:08 | 显示全部楼层 |阅读模式
1金钱
新手小白,用can通信发数据,却一直陷入死循环。数据发不出去。求大神指点,以下为我的程序代码。

can初始化程序及发送函数的定义:
#include "main.h"

uint8_t sbus_tx_buffer_data[8];//通过can1发送给电调的数据


/**************************************
函数功能:配置外设can1及相应的中断
函数形参:无
函数返回值:无
函数说明:CAN1_TX-----PA12    CAN1_RX-----PA11  
***************************************/
void CAN1_Configuration(void)
{
    CAN_InitTypeDef        can;
    CAN_FilterInitTypeDef  can_filter;
    GPIO_InitTypeDef       gpio;
    NVIC_InitTypeDef       nvic;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
//管脚复用
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);
//管脚设置
    gpio.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11;
    gpio.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(GPIOA, &gpio);
//can总线接收中断   
    nvic.NVIC_IRQChannel = CAN1_RX0_IRQn;
    nvic.NVIC_IRQChannelPreemptionPriority = 2;
    nvic.NVIC_IRQChannelSubPriority = 1;
    nvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic);
//can总线发送中断     
    nvic.NVIC_IRQChannel = CAN1_TX_IRQn;
    nvic.NVIC_IRQChannelPreemptionPriority = 1;
    nvic.NVIC_IRQChannelSubPriority = 1;
    nvic.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic);   

    CAN_DeInit(CAN1);
    CAN_StructInit(&can);
//can总线初始化   
    can.CAN_TTCM = DISABLE;
    can.CAN_ABOM = DISABLE;
    can.CAN_AWUM = DISABLE;
    can.CAN_NART = DISABLE;
    can.CAN_RFLM = DISABLE;
    can.CAN_TXFP = ENABLE;
    can.CAN_Mode =  CAN_Mode_LoopBack;
    can.CAN_SJW  = CAN_SJW_1tq;
    can.CAN_BS1 = CAN_BS1_16tq;
    can.CAN_BS2 = CAN_BS2_8tq;
    can.CAN_Prescaler = 1680;   //CAN BaudRate 42000k/(1+16+8)/1680=1kbps
    CAN_Init(CAN1, &can);
//can1总线滤器组初始化
        can_filter.CAN_FilterNumber=0;
        can_filter.CAN_FilterMode=CAN_FilterMode_IdMask;
        can_filter.CAN_FilterScale=CAN_FilterScale_32bit;
        can_filter.CAN_FilterIdHigh=0x0000;
        can_filter.CAN_FilterIdLow=0x0000;
        can_filter.CAN_FilterMaskIdHigh=0x0000;
        can_filter.CAN_FilterMaskIdLow=0x0000;
        can_filter.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;
        can_filter.CAN_FilterActivation=ENABLE;
        CAN_FilterInit(&can_filter);

  CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
  CAN_ITConfig(CAN1,CAN_IT_TME,ENABLE);
}


/**************************************
函数功能:can1总线发送中断
函数形参:无
函数返回值:无
函数说明:无
***************************************/
void CAN1_TX_IRQHandler(void)
{
    if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET) //等待发送完成
        {
           CAN_ClearITPendingBit(CAN1,CAN_IT_TME);//清除发送中断标志
          
    }
}

/**************************************
函数功能:can1总线接收中断
函数形参:无
函数返回值:无
函数说明:无
***************************************/
void CAN1_RX0_IRQHandler(void)
{
    CanRxMsg rx_message;
    int i=0;
    if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)//等待接收完成
        {
        CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);;//清除接收中断标志
        CAN_Receive(CAN1, CAN_FIFO0, &rx_message);//将所得数据存入结构体变量rx_message
                if(rx_message.StdId == 0x200)
                   {  for(i=0;i<8;i++)
                        printf("rxbuf[%d]:%d\r\n ",i,rx_message.Data[i]);
                   }
    }
}

/**************************************
函数功能:通过can1向左前轮发送数据函数
函数形参:u8* msg,u8 len(数据和数据长度)
函数返回值:无
函数说明:要注意发送ID
***************************************/
void Can_Send_Msg_lf(u8* msg,u8 len)
{       
       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x200;                         // 11位标准标识符为0x200为主控发送给电机的数据
  TxMessage.ExtId=0x00;                                 // 设置扩展标示符(29位)
  TxMessage.IDE=CAN_ID_STD;                         // 使用标准标示符
  TxMessage.RTR=CAN_RTR_DATA;                 // 消息类型为数据帧,一帧8位
  TxMessage.DLC=len;                                                         // 发送一帧信息

       
        for(i=0;i<8;i++)
        {
        sbus_tx_buffer_data[i]=(uint8_t)0x10;
        }
        for(i=0;i<8;i++)
                {
                        printf("sbus_tx_buffer_data[%d]  is  %0x\r\n  ",i,sbus_tx_buffer_data[i]);
                        printf("\n");
                }
       
  for(i=0;i<8;i++)
  TxMessage.Data[i]=sbus_tx_buffer_data[i];                                 // 第一帧信息  

  mbox= CAN_Transmit(CAN1, &TxMessage);
  printf(" mbox  is  %d\r\n  ", mbox);
   printf("\n");

        for(i=0;i<8;i++)
                {
                        printf("TxMessage.Data[%d]  is  %0x\r\n  ",i,TxMessage.Data[i]);
                        printf("\n");
                }       
i=0;
       
        while(CAN_TransmitStatus(CAN1, mbox)!=CAN_TxStatus_Ok)
          {
                mbox=CAN_Transmit(CAN1, &TxMessage);
                  
  
                  LED_GREEN_ON();  
                 
          }       
//          printf("传输完成!!!!\r\n");
          delay_ms(500);
          LED_GREEN_OFF();
}


主函数程序

int main(void)
{   

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        Led_Configuration();
        USART2_Configuration();
        USART3_Configuration();
        CAN1_Configuration();       
        CAN2_Configuration();       
        Buzzer_Configuration();           
        Power_Detection_Configuration();       
        pid_assignment();
    while(1)
    {
                        Can_Send_Msg_lf(sbus_tx_buffer_data,8);//通过can1向左前轮发送数据函数
                    printf("ok");
                        delay_ms(200);
    }
}



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-4-13 22:57:38 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 21:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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