打印

stm32f105 can1 can2 同时初始化can2无法发送只能接收

[复制链接]
12746|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
03024003|  楼主 | 2010-7-20 08:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32f105 can1 can2 同时初始化can2无法发送只能接收,can1收发正常。
can 1  can2的初始化配置 只有设置过滤器的位置不同
CAN_FilterInitStructure.CAN_FilterNumber   = 0;//can1
CAN_FilterInitStructure.CAN_FilterNumber   = 14;//can2


不知道还有什么can2要独立设置的
沙发
03024003|  楼主 | 2010-7-20 14:16 | 只看该作者
没人用过?

使用特权

评论回复
板凳
秋天落叶| | 2010-7-20 20:41 | 只看该作者
过滤器只会影响收,不会影响发,把初始化部分完整程序拿出来看看

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
03024003 + 1
地板
03024003|  楼主 | 2010-7-21 21:35 | 只看该作者
本帖最后由 03024003 于 2010-7-23 09:14 编辑

我的CAN1 CAN2初始化除了过滤器设置不同 其它都一样。还发现如果CAN1不初始化CAN2接收无法产生中断

void CAN2_Init(u16 Baud)
{
        CAN2_TimeRecordH1 = 0;
        CAN2_TimeRecordH1 = 0;
        CAN2_TimeRecordL1 = 0;
        CAN2_TimeRecordL1 = 0;
        CAN2_RecordSequence = 0;
        CAN2_FirstFrame = 1;
        memset(CAN2_rxData, 0, 20);
        
        GPIO_InitTypeDef GPIO_InitStructure;                //端口结构体实例
        NVIC_InitTypeDef NVIC_InitStructure;                //中断结构体实例
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
               
        
        //配置NVIC和向量表基地址
        NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;        //中断服务函数名
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        CAN2_Config(Baud);
}
void CAN2_Config(u16 Baud)
{
        u16 i = 5;
        
        CAN_InitTypeDef CAN_InitStructure;                //结构体实例
        CAN_FilterInitTypeDef CAN_FilterInitStructure;        //结构体实例
        CAN_DeInit(CAN2);                                   //复位CAN寄存器
        CAN_StructInit(&CAN_InitStructure);                //写入默认值
        
        //CAN1 参数初始化
        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;
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
            
        switch(Baud)
        {
                case   10: i = 0; break;        //10K
                case   20: i = 1; break;        //20k
                case   50: i = 2; break;        //50k
                case  100: i = 3; break;        //100k
                case  125: i = 4; break;        //125k
                case  250: i = 5; break;        //250k
                case  500: i = 6; break;        //500k
                case  750: i = 7; break;        //750k
                case 1000: i = 8; break;        //1M
                default  : i = 5; break;        //默认为500Kbps
        }
        CAN_InitStructure.CAN_SJW          = CanTiming[0];
        CAN_InitStructure.CAN_BS1          = CanTiming[1];
        CAN_InitStructure.CAN_BS2         = CanTiming[2];
        CAN_InitStructure.CAN_Prescaler = CanTiming[3];
        CAN_Init(CAN2, &CAN_InitStructure);
          //过滤第一组ID
        CAN_FilterInitStructure.CAN_FilterNumber          = 0;
        CAN_FilterInitStructure.CAN_FilterMode            = CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale           = CAN_FilterScale_32bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh          = 0;//(((u32)CPU_CAN_0<<21)&0xFFFF0000)>>16;
        CAN_FilterInitStructure.CAN_FilterIdLow          = 0;//(((u32)CPU_CAN_0<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh          = 0;//0xFFFF;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow           = 0;//0xFFFF;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
        CAN_FilterInitStructure.CAN_FilterActivation          = ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);
        //过滤第二组ID
        //CAN_FilterInitStructure.CAN_FilterNumber          = 14;
        //CAN_FilterInitStructure.CAN_FilterIdHigh          = (((u32)CPU_CAN_1<<21)&0xFFFF0000)>>16;
        //CAN_FilterInitStructure.CAN_FilterIdLow          = (((u32)CPU_CAN_1<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xFFFF;
        //CAN_FilterInit(&CAN_FilterInitStructure);
        
        CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
}

使用特权

评论回复
5
03024003|  楼主 | 2010-7-22 09:56 | 只看该作者
我现在其他的都屏蔽,只留CAN2初始化 和发送,还是发不出来
救命~~~:Q

使用特权

评论回复
6
yybj| | 2010-7-22 10:32 | 只看该作者
发送使能没

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
03024003 + 1
7
03024003|  楼主 | 2010-7-22 14:41 | 只看该作者
这是我的发送函数
void CAN2_TxMessage(u8 *txBuf)
{
        u8 TransmitMailbox = 0;
       
        CAN2_TxMsg.StdId = 0x117;
        CAN2_TxMsg.RTR = CAN_RTR_DATA;
        CAN2_TxMsg.IDE = CAN_ID_STD;
        CAN2_TxMsg.DLC = 8;
        memcpy(CAN2_TxMsg.Data, txBuf, 8);
       
        CAN_Transmit(CAN2, &CAN2_TxMsg);
}

使用特权

评论回复
8
198392| | 2010-7-22 14:41 | 只看该作者
:'( 看不懂~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
03024003 + 1
9
03024003|  楼主 | 2010-7-22 14:51 | 只看该作者
CAN1的发送函数也是这样写的,发送没问题。

使用特权

评论回复
10
IJK| | 2010-7-22 15:11 | 只看该作者
本帖最后由 IJK 于 2010-7-22 15:12 编辑

查一下CAN2跟其它外设是否共享了引脚,比如SPI、USART,如果共享了引脚就不要初始化其它外设。

使用特权

评论回复
11
IJK| | 2010-7-22 15:16 | 只看该作者
我的CAN1 CAN2初始化除了过滤器设置不同 其它都一样。还发现如果CAN1不初始化CAN2接收无法产生中断

03024003 发表于 2010-7-21 21:35


CAN2的过滤器其实是借用CAN1的,所以CAN1需要进行某种程度的初始化,才能正确初始化CAN2的过滤器。

使用特权

评论回复
12
03024003|  楼主 | 2010-7-22 15:22 | 只看该作者
本帖最后由 03024003 于 2010-7-22 15:25 编辑

首先感谢IJK。

1.can2 的引脚上没别的只是用作CAN。

2.过滤器的设置我觉得现在没问题,毕竟can1 can2都可以正确接收,这个和发送也没关系的。

使用特权

评论回复
13
PXJ_520| | 2010-7-23 09:06 | 只看该作者
从你上面的程序来看,你没有初始化CAN2呀!!

      CAN_InitStructure.CAN_SJW          = CanTiming[0];
        CAN_InitStructure.CAN_BS1          = CanTiming[1];
        CAN_InitStructure.CAN_BS2         = CanTiming[2];
        CAN_InitStructure.CAN_Prescaler = CanTiming[3];

        CAN_Init(CAN1, &CAN_InitStructure);
          //过滤第一组ID

使用特权

评论回复
14
03024003|  楼主 | 2010-7-23 09:17 | 只看该作者
13# PXJ_520

谢谢 PXJ_520
很不好意思 ,我发帖时贴错了 应该是can2 这个已经初始化了

使用特权

评论回复
15
03024003|  楼主 | 2010-7-23 10:05 | 只看该作者
本帖最后由 03024003 于 2010-7-23 10:06 编辑

昨天只是把V3.3.0里的双CAN例程初始化移到我的板子上。 现在把库更新到V3.3.0。CAN2还是不能发送.

这是我双CAN发送的工程.
IDE : IAR5.4
CPU : stm32f105rct6 外部晶振12MHz
CAN1 remap :rx pin pb8 tx pin pb9
CAN2 :rx pin pb12 tx pin pb13

CANPro.rar (647.25 KB)

使用特权

评论回复
16
03024003|  楼主 | 2010-7-24 10:42 | 只看该作者
感谢回帖的朋友,我的问题解决了。

使用特权

评论回复
17
auzxj| | 2010-8-11 13:43 | 只看该作者
为题解决了也不总结一下,楼主我膜拜你

使用特权

评论回复
18
aisenwang| | 2010-9-30 13:27 | 只看该作者
楼主你好!你已经把问题解决了!你可以把你解决的办法告诉我一下吗!我现在遇到和你一样的问题!如今方便的话把你的工程发到我的邮箱:aisenwang@163.com 我将万分的感谢你!

使用特权

评论回复
19
liqixiao| | 2013-3-5 11:40 | 只看该作者
楼主共享一下问题

使用特权

评论回复
20
gang544043963| | 2013-11-27 21:33 | 只看该作者
这个楼主,问题解决了也不共享一下

使用特权

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

本版积分规则

个人签名:--->

21

主题

125

帖子

0

粉丝