打印

请教香主:STM32 CAN正常发送模式

[复制链接]
9107|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
贝多芬爵士|  楼主 | 2011-4-29 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的自测模式通过了,Normal就是怎么有问题,我的源码:
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
                                                  |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF
                                                |RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                        //PB8 CAN1_RX
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;                        //上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  /*************CAN1_TX映射端口*****************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                        //PB9        CAN1_TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
       
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);                //GPIO_Remap2_CAN1,GPIO_Remap_CAN2






TestStatus CAN_Polling(void)
{
        u8 Error;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
        u32 i = 0;
        u8  TransmitMailbox = 0;
        /***CAN寄存器初始化**/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        /* CAN cell init */
        //CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_TTCM = DISABLE;                        //禁止时间触发模式
          CAN_InitStructure.CAN_ABOM = DISABLE;                        //失能自动离线管理
          CAN_InitStructure.CAN_AWUM = DISABLE;                        //失能自动唤醒模式
          CAN_InitStructure.CAN_NART = DISABLE;                        //失能非自动重传输模式
          CAN_InitStructure.CAN_RFLM = DISABLE;                        //失能接收FIFO锁定模式
          CAN_InitStructure.CAN_TXFP = DISABLE;                        //失能发送FIFO优先级
          //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;        //CAN工作在环回模式
          CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        //CAN工作在正常模式
          CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                //重新同步跳跃宽度1个时间单位
          CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;                //时间段1为8个时间单位
          CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;                //时间段2为7个时间单位
          CAN_InitStructure.CAN_Prescaler = 40;                        //时间单位的长度
                                                                                                        //BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)
                                                                                                        //CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 450k

        Error = CAN_Init(CAN1,&CAN_InitStructure);
        if(Error == 0)
        return FAILED;
        /****CAN滤波寄存器初始化****/
        CAN_FilterInitStructure.CAN_FilterNumber = 0;                                                //待初始化的过滤器,它的范围是 1到 13。
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;                //标识符屏蔽位模式
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;        //过滤器位宽32位
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                //过滤器高段位标识符,16位时第一个
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;                                //过滤器低段位标识符,16位时第二个
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                        //用来设定过滤器屏蔽标识符或者过滤器标识符
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;                        //过滤器 FIFO0 指向过滤器0
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                        //使能过滤器

        CAN_FilterInit(&CAN_FilterInitStructure);
        /* transmit */

        TxMessage.StdId = 0x01;                        //设定标准标识符。它的取值范围为 0到 0x7FF
        //TxMessage.ExtId = 0xFF;                        //设定扩展标识符。它的取值范围为 0到 0x3FFFF
        TxMessage.RTR = CAN_RTR_DATA;        //数据帧
        TxMessage.IDE = CAN_ID_STD;                //标准标识符
        TxMessage.DLC = 2;                                //设定待传输消息的帧长度。它的取值范围是 0 到0x8。
        TxMessage.Data[0] = 0x00;                //传送的数据  先发高位再发低位
        TxMessage.Data[1] = 0x02;
        //TxMessage.Data[2] = 0x03;
        //TxMessage.Data[3] = 0x04;
        //TxMessage.Data[4] = 0x05;
        //TxMessage.Data[5] = 0x06;
        //TxMessage.Data[6] = 0x07;
        //TxMessage.Data[7] = 0x08;

        TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
        i = 0;
        while( ( CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK ) && ( i != 0xFF ))
                {
                i++;
                }
       
        i = 0;
        while( ( CAN_MessagePending(CAN1,CAN_FIFO0) < 1 )&&(i != 0xFF ) )//返回挂号的信息数量
                {
                i++;
                }
        /* receive */
        RxMessage.StdId = 0x00;
        RxMessage.IDE = CAN_ID_STD;                //标准标识符
        RxMessage.DLC = 0;
        RxMessage.Data[0] = 0x00;
        RxMessage.Data[1] = 0x03;
        //RxMessage.Data[2] = 0x00;
        //RxMessage.Data[3] = 0x00;
        //RxMessage.Data[4] = 0x00;
        //RxMessage.Data[5] = 0x00;
        //RxMessage.Data[6] = 0x00;
        //RxMessage.Data[7] = 0x00;
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

        CAN_Data = RxMessage.Data[0];
        /*if (RxMessage.StdId!=0x11)
          {
            return FAILED;  
          }
        if(RxMessage.IDE != CAN_ID_STD)
        {
                return FAILED;
        }
        if (RxMessage.DLC!=8)
          {
            return FAILED;  
          } */
        //if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
          {
            //return FAILED;
          }
  
          return PASSED; /* Test Passed */
               
}


我的配置有问题吗?请指教啊!!用中断接收的

STM32---TEST.rar

3.46 MB

沙发
贝多芬爵士|  楼主 | 2011-4-29 10:39 | 只看该作者

请教香主:STM32 CAN正常发送模式

我的自测模式通过了,Normal就是怎么有问题,我的源码:
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
                                                  |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF
                                                |RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                        //PB8 CAN1_RX
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;                        //上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  /*************CAN1_TX映射端口*****************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                        //PB9        CAN1_TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
       
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);                //GPIO_Remap2_CAN1,GPIO_Remap_CAN2






TestStatus CAN_Polling(void)
{
        u8 Error;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
        u32 i = 0;
        u8  TransmitMailbox = 0;
        /***CAN寄存器初始化**/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        /* CAN cell init */
        //CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_TTCM = DISABLE;                        //禁止时间触发模式
          CAN_InitStructure.CAN_ABOM = DISABLE;                        //失能自动离线管理
          CAN_InitStructure.CAN_AWUM = DISABLE;                        //失能自动唤醒模式
          CAN_InitStructure.CAN_NART = DISABLE;                        //失能非自动重传输模式
          CAN_InitStructure.CAN_RFLM = DISABLE;                        //失能接收FIFO锁定模式
          CAN_InitStructure.CAN_TXFP = DISABLE;                        //失能发送FIFO优先级
          //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;        //CAN工作在环回模式
          CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        //CAN工作在正常模式
          CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                //重新同步跳跃宽度1个时间单位
          CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;                //时间段1为8个时间单位
          CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;                //时间段2为7个时间单位
          CAN_InitStructure.CAN_Prescaler = 40;                        //时间单位的长度
                                                                                                        //BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)
                                                                                                        //CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 450k

        Error = CAN_Init(CAN1,&CAN_InitStructure);
        if(Error == 0)
        return FAILED;
        /****CAN滤波寄存器初始化****/
        CAN_FilterInitStructure.CAN_FilterNumber = 0;                                                //待初始化的过滤器,它的范围是 1到 13。
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;                //标识符屏蔽位模式
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;        //过滤器位宽32位
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                //过滤器高段位标识符,16位时第一个
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;                                //过滤器低段位标识符,16位时第二个
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                        //用来设定过滤器屏蔽标识符或者过滤器标识符
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;                        //过滤器 FIFO0 指向过滤器0
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                        //使能过滤器

        CAN_FilterInit(&CAN_FilterInitStructure);
        /* transmit */

        TxMessage.StdId = 0x01;                        //设定标准标识符。它的取值范围为 0到 0x7FF
        //TxMessage.ExtId = 0xFF;                        //设定扩展标识符。它的取值范围为 0到 0x3FFFF
        TxMessage.RTR = CAN_RTR_DATA;        //数据帧
        TxMessage.IDE = CAN_ID_STD;                //标准标识符
        TxMessage.DLC = 2;                                //设定待传输消息的帧长度。它的取值范围是 0 到0x8。
        TxMessage.Data[0] = 0x00;                //传送的数据  先发高位再发低位
        TxMessage.Data[1] = 0x02;
        //TxMessage.Data[2] = 0x03;
        //TxMessage.Data[3] = 0x04;
        //TxMessage.Data[4] = 0x05;
        //TxMessage.Data[5] = 0x06;
        //TxMessage.Data[6] = 0x07;
        //TxMessage.Data[7] = 0x08;

        TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
        i = 0;
        while( ( CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK ) && ( i != 0xFF ))
                {
                i++;
                }
       
        i = 0;
        while( ( CAN_MessagePending(CAN1,CAN_FIFO0) < 1 )&&(i != 0xFF ) )//返回挂号的信息数量
                {
                i++;
                }
        /* receive */
        RxMessage.StdId = 0x00;
        RxMessage.IDE = CAN_ID_STD;                //标准标识符
        RxMessage.DLC = 0;
        RxMessage.Data[0] = 0x00;
        RxMessage.Data[1] = 0x03;
        //RxMessage.Data[2] = 0x00;
        //RxMessage.Data[3] = 0x00;
        //RxMessage.Data[4] = 0x00;
        //RxMessage.Data[5] = 0x00;
        //RxMessage.Data[6] = 0x00;
        //RxMessage.Data[7] = 0x00;
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

        CAN_Data = RxMessage.Data[0];
        /*if (RxMessage.StdId!=0x11)
          {
            return FAILED;  
          }
        if(RxMessage.IDE != CAN_ID_STD)
        {
                return FAILED;
        }
        if (RxMessage.DLC!=8)
          {
            return FAILED;  
          } */
        //if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
          {
            //return FAILED;
          }
  
          return PASSED; /* Test Passed */
               
}


我的配置有问题吗?请指教啊!!用中断接收的

使用特权

评论回复
板凳
贝多芬爵士|  楼主 | 2011-4-29 10:39 | 只看该作者

请教香主:STM32 CAN正常发送模式

我的自测模式通过了,Normal就是怎么有问题,我的源码:
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
                                                  |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF
                                                |RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                        //PB8 CAN1_RX
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;                        //上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  /*************CAN1_TX映射端口*****************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                        //PB9        CAN1_TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
       
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);                //GPIO_Remap2_CAN1,GPIO_Remap_CAN2






TestStatus CAN_Polling(void)
{
        u8 Error;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
        u32 i = 0;
        u8  TransmitMailbox = 0;
        /***CAN寄存器初始化**/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        /* CAN cell init */
        //CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_TTCM = DISABLE;                        //禁止时间触发模式
          CAN_InitStructure.CAN_ABOM = DISABLE;                        //失能自动离线管理
          CAN_InitStructure.CAN_AWUM = DISABLE;                        //失能自动唤醒模式
          CAN_InitStructure.CAN_NART = DISABLE;                        //失能非自动重传输模式
          CAN_InitStructure.CAN_RFLM = DISABLE;                        //失能接收FIFO锁定模式
          CAN_InitStructure.CAN_TXFP = DISABLE;                        //失能发送FIFO优先级
          //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;        //CAN工作在环回模式
          CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        //CAN工作在正常模式
          CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                //重新同步跳跃宽度1个时间单位
          CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;                //时间段1为8个时间单位
          CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;                //时间段2为7个时间单位
          CAN_InitStructure.CAN_Prescaler = 40;                        //时间单位的长度
                                                                                                        //BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)
                                                                                                        //CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 450k

        Error = CAN_Init(CAN1,&CAN_InitStructure);
        if(Error == 0)
        return FAILED;
        /****CAN滤波寄存器初始化****/
        CAN_FilterInitStructure.CAN_FilterNumber = 0;                                                //待初始化的过滤器,它的范围是 1到 13。
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;                //标识符屏蔽位模式
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;        //过滤器位宽32位
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                //过滤器高段位标识符,16位时第一个
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;                                //过滤器低段位标识符,16位时第二个
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                        //用来设定过滤器屏蔽标识符或者过滤器标识符
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;                        //过滤器 FIFO0 指向过滤器0
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                        //使能过滤器

        CAN_FilterInit(&CAN_FilterInitStructure);
        /* transmit */

        TxMessage.StdId = 0x01;                        //设定标准标识符。它的取值范围为 0到 0x7FF
        //TxMessage.ExtId = 0xFF;                        //设定扩展标识符。它的取值范围为 0到 0x3FFFF
        TxMessage.RTR = CAN_RTR_DATA;        //数据帧
        TxMessage.IDE = CAN_ID_STD;                //标准标识符
        TxMessage.DLC = 2;                                //设定待传输消息的帧长度。它的取值范围是 0 到0x8。
        TxMessage.Data[0] = 0x00;                //传送的数据  先发高位再发低位
        TxMessage.Data[1] = 0x02;
        //TxMessage.Data[2] = 0x03;
        //TxMessage.Data[3] = 0x04;
        //TxMessage.Data[4] = 0x05;
        //TxMessage.Data[5] = 0x06;
        //TxMessage.Data[6] = 0x07;
        //TxMessage.Data[7] = 0x08;

        TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
        i = 0;
        while( ( CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK ) && ( i != 0xFF ))
                {
                i++;
                }
       
        i = 0;
        while( ( CAN_MessagePending(CAN1,CAN_FIFO0) < 1 )&&(i != 0xFF ) )//返回挂号的信息数量
                {
                i++;
                }
        /* receive */
        RxMessage.StdId = 0x00;
        RxMessage.IDE = CAN_ID_STD;                //标准标识符
        RxMessage.DLC = 0;
        RxMessage.Data[0] = 0x00;
        RxMessage.Data[1] = 0x03;
        //RxMessage.Data[2] = 0x00;
        //RxMessage.Data[3] = 0x00;
        //RxMessage.Data[4] = 0x00;
        //RxMessage.Data[5] = 0x00;
        //RxMessage.Data[6] = 0x00;
        //RxMessage.Data[7] = 0x00;
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

        CAN_Data = RxMessage.Data[0];
        /*if (RxMessage.StdId!=0x11)
          {
            return FAILED;  
          }
        if(RxMessage.IDE != CAN_ID_STD)
        {
                return FAILED;
        }
        if (RxMessage.DLC!=8)
          {
            return FAILED;  
          } */
        //if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
          {
            //return FAILED;
          }
  
          return PASSED; /* Test Passed */
               
}


我的配置有问题吗?请指教啊!!用中断接收的

使用特权

评论回复
地板
贝多芬爵士|  楼主 | 2011-4-29 10:40 | 只看该作者

请教香主:STM32 CAN正常发送模式

我的自测模式通过了,Normal就是怎么有问题,我的源码:
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
                                                  |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF
                                                |RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                                        //PB8 CAN1_RX
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;                        //上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  /*************CAN1_TX映射端口*****************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                        //PB9        CAN1_TX
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  GPIO_Init(GPIOB,&GPIO_InitStructure);
       
  GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);                //GPIO_Remap2_CAN1,GPIO_Remap_CAN2






TestStatus CAN_Polling(void)
{
        u8 Error;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
        CanTxMsg TxMessage;
        CanRxMsg RxMessage;
        u32 i = 0;
        u8  TransmitMailbox = 0;
        /***CAN寄存器初始化**/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        /* CAN cell init */
        //CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_TTCM = DISABLE;                        //禁止时间触发模式
          CAN_InitStructure.CAN_ABOM = DISABLE;                        //失能自动离线管理
          CAN_InitStructure.CAN_AWUM = DISABLE;                        //失能自动唤醒模式
          CAN_InitStructure.CAN_NART = DISABLE;                        //失能非自动重传输模式
          CAN_InitStructure.CAN_RFLM = DISABLE;                        //失能接收FIFO锁定模式
          CAN_InitStructure.CAN_TXFP = DISABLE;                        //失能发送FIFO优先级
          //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;        //CAN工作在环回模式
          CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;        //CAN工作在正常模式
          CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                //重新同步跳跃宽度1个时间单位
          CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;                //时间段1为8个时间单位
          CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;                //时间段2为7个时间单位
          CAN_InitStructure.CAN_Prescaler = 40;                        //时间单位的长度
                                                                                                        //BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)
                                                                                                        //CAN_bps = PCLK1 / ((1 + 7 + 8) * 5) = 450k

        Error = CAN_Init(CAN1,&CAN_InitStructure);
        if(Error == 0)
        return FAILED;
        /****CAN滤波寄存器初始化****/
        CAN_FilterInitStructure.CAN_FilterNumber = 0;                                                //待初始化的过滤器,它的范围是 1到 13。
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;                //标识符屏蔽位模式
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;        //过滤器位宽32位
        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;                                //过滤器高段位标识符,16位时第一个
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;                                //过滤器低段位标识符,16位时第二个
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;                        //用来设定过滤器屏蔽标识符或者过滤器标识符
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;                        //过滤器 FIFO0 指向过滤器0
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;                        //使能过滤器

        CAN_FilterInit(&CAN_FilterInitStructure);
        /* transmit */

        TxMessage.StdId = 0x01;                        //设定标准标识符。它的取值范围为 0到 0x7FF
        //TxMessage.ExtId = 0xFF;                        //设定扩展标识符。它的取值范围为 0到 0x3FFFF
        TxMessage.RTR = CAN_RTR_DATA;        //数据帧
        TxMessage.IDE = CAN_ID_STD;                //标准标识符
        TxMessage.DLC = 2;                                //设定待传输消息的帧长度。它的取值范围是 0 到0x8。
        TxMessage.Data[0] = 0x00;                //传送的数据  先发高位再发低位
        TxMessage.Data[1] = 0x02;
        //TxMessage.Data[2] = 0x03;
        //TxMessage.Data[3] = 0x04;
        //TxMessage.Data[4] = 0x05;
        //TxMessage.Data[5] = 0x06;
        //TxMessage.Data[6] = 0x07;
        //TxMessage.Data[7] = 0x08;

        TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);
        i = 0;
        while( ( CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK ) && ( i != 0xFF ))
                {
                i++;
                }
       
        i = 0;
        while( ( CAN_MessagePending(CAN1,CAN_FIFO0) < 1 )&&(i != 0xFF ) )//返回挂号的信息数量
                {
                i++;
                }
        /* receive */
        RxMessage.StdId = 0x00;
        RxMessage.IDE = CAN_ID_STD;                //标准标识符
        RxMessage.DLC = 0;
        RxMessage.Data[0] = 0x00;
        RxMessage.Data[1] = 0x03;
        //RxMessage.Data[2] = 0x00;
        //RxMessage.Data[3] = 0x00;
        //RxMessage.Data[4] = 0x00;
        //RxMessage.Data[5] = 0x00;
        //RxMessage.Data[6] = 0x00;
        //RxMessage.Data[7] = 0x00;
        CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

        CAN_Data = RxMessage.Data[0];
        /*if (RxMessage.StdId!=0x11)
          {
            return FAILED;  
          }
        if(RxMessage.IDE != CAN_ID_STD)
        {
                return FAILED;
        }
        if (RxMessage.DLC!=8)
          {
            return FAILED;  
          } */
        //if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE)
          {
            //return FAILED;
          }
  
          return PASSED; /* Test Passed */
               
}


我的配置有问题吗?请指教啊!!用中断接收的

使用特权

评论回复
5
aaa2742| | 2011-4-29 16:47 | 只看该作者
给的例子啥也弄不了,楼主还是从新按照自己想法弄吧,没必要按照例子那中方式弄。我也正弄这块,有时间咱们可以联系。QQ:313419606

使用特权

评论回复
6
贝多芬爵士|  楼主 | 2011-5-4 14:50 | 只看该作者
高手能给个成功的示例程序吗?

使用特权

评论回复
7
IJK| | 2011-5-4 17:53 | 只看该作者
我的自测模式通过了,Normal就是怎么有问题,我的源码:
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC
                                   ...
贝多芬爵士 发表于 2011-4-29 10:36


自测模式是指什么? 指loop back模式?

使用特权

评论回复
8
IJK| | 2011-5-4 17:56 | 只看该作者
loop back模式OK,Normal模式有问题,可以用示波器看CAN_TX有没有信号发出,CAN_RX有没有信号进来

使用特权

评论回复
9
贝多芬爵士|  楼主 | 2011-5-5 18:20 | 只看该作者
Normal模式下CAN_TX,CAN_RX没有信号啊,都是3.3v,你能给我看看我的配置哪里错了吗?

使用特权

评论回复
10
贝多芬爵士|  楼主 | 2011-5-5 18:51 | 只看该作者
8# IJK 示波器我打了,CAN_TX与CAN_RX都是3.4v左右
我检测发送后的标志一直是为CANTXPENDING

使用特权

评论回复
11
贝多芬爵士|  楼主 | 2011-5-7 21:32 | 只看该作者
自己解决了哈!最后是板子上收发器芯片PCA82C250的原因,买到歪得了;

使用特权

评论回复
12
贝多芬爵士|  楼主 | 2011-5-7 21:33 | 只看该作者
谁能提供个正品的淘宝网店·····

使用特权

评论回复
13
wangzhiai8| | 2013-5-18 10:43 | 只看该作者
贝多芬爵士 发表于 2011-5-5 18:51
8# IJK  示波器我打了,CAN_TX与CAN_RX都是3.4v左右
我检测发送后的标志一直是为CANTXPENDING ...

你好,我遇到了和你一样的问题,请问您是怎么解决的呢?

使用特权

评论回复
14
zhurima| | 2014-7-9 16:19 | 只看该作者
学习一下

使用特权

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

本版积分规则

1

主题

35

帖子

1

粉丝