搜索
bottom↓
楼主: becarson

STM32的can现场总线实验心得(对初学者应该比较有用,有不对的地方望大侠指出)

  [复制链接]

出0入0汤圆

发表于 2011-10-7 21:25:26 | 显示全部楼层
做个记号,这几天研究一下。

出0入0汤圆

发表于 2011-10-8 11:35:05 | 显示全部楼层
谢谢lz```正准备学习```````````````````````````````

出0入0汤圆

发表于 2011-10-12 22:46:36 | 显示全部楼层
只好Mark了,can总线实验

出10入12汤圆

发表于 2011-10-12 23:06:58 | 显示全部楼层
markcan

出0入0汤圆

发表于 2011-10-13 08:49:50 | 显示全部楼层
mark can

出0入0汤圆

发表于 2011-10-13 08:59:33 | 显示全部楼层
好贴,不过对can不了解,有朋友建议过用它,学习学习。

出0入16汤圆

发表于 2011-10-13 11:12:43 | 显示全部楼层
有用的,顶一个

出0入0汤圆

发表于 2011-10-14 11:55:15 | 显示全部楼层
感谢LZ分享经验,以后调试可用到。

出0入0汤圆

发表于 2011-10-15 16:28:24 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-10-15 23:34:21 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-16 10:32:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-16 11:20:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-20 19:34:00 | 显示全部楼层
留爪~

出0入24汤圆

发表于 2011-10-20 19:39:42 | 显示全部楼层
Mark!
学习之

出0入0汤圆

发表于 2011-10-22 00:51:34 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2011-10-25 00:15:54 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-10-25 10:22:39 | 显示全部楼层
我左can  右can

出0入0汤圆

发表于 2011-10-26 08:47:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-29 15:21:34 | 显示全部楼层
MARK ~~~

出0入0汤圆

发表于 2011-10-30 22:45:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-31 07:11:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-31 09:54:19 | 显示全部楼层
及时雨啊。。。。 mark

出0入0汤圆

发表于 2011-10-31 09:58:50 | 显示全部楼层
mark, CAN 总线

出0入0汤圆

发表于 2011-10-31 22:50:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-1 08:28:35 | 显示全部楼层
MARK!到时候细细品读!

出0入16汤圆

发表于 2011-11-1 14:47:44 | 显示全部楼层
谢了,有用的

出0入0汤圆

发表于 2011-11-1 15:02:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-1 17:11:22 | 显示全部楼层
你好,
   我按照你的程序写了个实例,但是我用的是PB8和PB9,引脚重新映射已经定义了,但是tx引脚上就是没有信号,能不能帮忙看看,谢谢:
    我使用的是STM32F103RB芯片,软件库函数是V3.4.0——2010-10-15,写了个CAN程序,但是怎么弄TX引脚上无信号。
求解:
    CAN_TX使用的是PB9,CAN_RX使用的是PB8,程序如下:
   void GPIO_Configuration( void )
{
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE );  
    //  AFIO重新映射时钟使能
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE );
    //  CAN1引脚复用重映射功能使能
    GPIO_PinRemapConfig( GPIO_Remap1_CAN1,ENABLE ); //AFIO_MAPR_CAN_REMAP_REMAP2

    //  Configure CAN pin: RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    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);
}

void CAN_Configuration( void )
{
    CAN_InitTypeDef CAN_InitStructure;
    CAN_FilterInitTypeDef CAN_FilterInitStructure;

    //  使能外围CAN1时钟
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE);
     
    CAN_DeInit( CAN1 );  
    CAN_StructInit( &CAN_InitStructure );
     
    //  禁止时间触发通行模式
    CAN_InitStructure.CAN_TTCM = DISABLE;  
    //  软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测
    //  到128次11位连续的隐性位,就退出离线状态   
    CAN_InitStructure.CAN_ABOM = ENABLE;
    //  睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
    CAN_InitStructure.CAN_AWUM = ENABLE;
    //  CAN报文自动重发直到成功为止
    CAN_InitStructure.CAN_NART = DISABLE;
    //  在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有的报文  
    CAN_InitStructure.CAN_RFLM = DISABLE;
    //  发送FIFO优先级由报文的标识符来决定
    CAN_InitStructure.CAN_TXFP = DISABLE;
    //  CAN硬件工作在正常模式
    CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  
    //  重新同步跳跃宽度1个时间单位
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    //  时间段1为8个时间单位
    CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;//CAN_BS1_12tq;
    //  时间段2为7个时间单位
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
    //  (pclk1/((1+8+7)*9)) = 36Mhz/[(CAN_SJW_1tq+CAN_BS1_8tq+CAN_BS2_7tq)*(CAN_Prescaler)] = 250Kbits设定了一个时间单位的长度           CAN_InitStructure.CAN_Prescaler = 9;
    CAN_Init( CAN1,&CAN_InitStructure );

    //  CAN filter init 过滤器初始化
    //  指定了待初始化的过滤器0
    CAN_FilterInitStructure.CAN_FilterNumber = 0;
    //  指定了过滤器将被初始化到的模式为标识符屏蔽位模式   
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    //  给出了过滤器位宽1个32位过滤器  
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    //  用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)  
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
    //  用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个  
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    //  用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个  
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    //  用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个  
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    //  设定了指向过滤器的FIFO0  
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
    //  使能过滤器  
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
    CAN_FilterInit( &CAN_FilterInitStructure );  
     
}  
void CAN_TxData(char data)
{
    CanTxMsg TxMessage;
     
    u32 i = 0;
    uint8_t TransmitMailbox = 5;
    /* transmit 1 message */
    TxMessage.StdId=0x00000001;
//    TxMessage.ExtId=0x00000000;
    TxMessage.IDE=CAN_ID_STD;
    TxMessage.RTR=CAN_RTR_DATA;
    TxMessage.DLC= 1;  
    TxMessage.Data[0] = data;
     
    TransmitMailbox = CAN_Transmit( CAN1,&TxMessage );
    while((CAN_TransmitStatus(CAN1,TransmitMailbox) != CANTXOK) && (i != 0xFF))
    {
        i++;
    }     
}

int main( void )
{     
    Device_Init();
     
    LED1_ON;
    Delay(72000);   //  7ms
    while( 1 )
    {
        LED1_OFF;
        Delay(720000);
        CAN_TxData(0x55);
        Delay(720000);  
    }
}



大侠们赐教啊,

我看了好多的程序也都差不多,我的就是用的引脚是用PB8和PB9,但是我已经重新映射过了,    不过不知道多不对,TX引脚上一直无信号。

出0入0汤圆

发表于 2011-11-1 17:24:52 | 显示全部楼层
学习!!谢谢楼主

出0入0汤圆

发表于 2011-11-4 16:40:03 | 显示全部楼层
有些疑问
2个3级FIFO,是不是就是说应该能缓存6个CAN帧?是不是第一个FIFO存满3个未处理的can报文后,第4个未处理的报文会存如第2个fifo中,如过不是,那是怎样处理的啊,

出0入0汤圆

 楼主| 发表于 2011-11-5 10:05:43 | 显示全部楼层
回复【329楼】sxf_zero
-----------------------------------------------------------------------

两个fifo为fifo0和fifo1,可以通过下面设定:

CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;//设定了指向过滤器的FIFO0

  /* CAN FIFO0 message pending interrupt enable */  
  CAN_ITConfig(CAN_IT_FMP0, ENABLE);//使能指定的CAN中断

出0入0汤圆

 楼主| 发表于 2011-11-5 10:21:40 | 显示全部楼层
回复【327楼】IRyan
-----------------------------------------------------------------------

我看你的CAN配置跟我的有点不一样,建议先用我的试试,再找原因,可能这样效率比较高

出0入0汤圆

发表于 2011-11-7 10:21:50 | 显示全部楼层

出0入0汤圆

发表于 2011-11-9 18:00:44 | 显示全部楼层
回复【LZ】becarson 烽
-----------------------------------------------------------------------

我找原因了,配置是对的,是我太粗心,把  //  使能外围CAN1时钟的函数RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE)写为RCC_APB1PeriphResetCmd(RCC_APB1Periph_CAN1, ENABLE),搞反了。

谢谢!

不过现在接收函数又有问题了, 程序是收到一帧发送一帧,可结果是前两帧可能只有一帧或者两帧回复,收到第三帧后就一直向外发送数据。

还在找问题。

出0入0汤圆

发表于 2011-11-9 18:44:18 | 显示全部楼层
cortex 3单片机中,在设置一个外设之后都必须要使能对应外设时钟!
RCC_APB1PeriphClockCmd(RCC_APB1Periph_xxx, ENABLE)

楼主太粗心了,居然写成了 RCC_APB1PeriphClockReset !

关于数据收发问题,可能是 FIFO 设置的有问题吧!

你的问题好像是,FIFO收到了3个数据帧之后,然后满了,就不再接收数据了,接着就向外发送数据了!


根据  CAN_ITConfig(CAN_IT_FMP0, ENABLE);
楼主应该用的的是FIFO中断!

根据上面的无限循环好像看不出来程序是收到一帧发送一帧!

出0入0汤圆

发表于 2011-11-10 08:59:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-10 18:10:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-11 09:19:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-11 10:01:37 | 显示全部楼层
can总线我觉的最难的就是那个时钟设置

出0入0汤圆

发表于 2011-11-11 13:48:28 | 显示全部楼层
谢谢。。。

出0入0汤圆

发表于 2011-11-11 14:36:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-11 15:39:48 | 显示全部楼层
先标记吧,看的我头都晕了

出0入0汤圆

发表于 2011-11-16 10:28:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-16 10:50:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-16 18:57:55 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-17 15:45:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-20 20:39:10 | 显示全部楼层
过滤的那个地方怎么那么难懂呀,还有位时间特性

出0入98汤圆

发表于 2011-12-20 20:42:25 | 显示全部楼层
好东西 谢谢楼主分享

出0入0汤圆

发表于 2011-12-21 09:52:20 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2011-12-21 10:49:06 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-21 15:59:33 | 显示全部楼层
很详细的,谢谢了

出50入0汤圆

发表于 2011-12-22 00:16:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-22 08:44:23 | 显示全部楼层
好资料

出0入0汤圆

发表于 2011-12-22 08:48:57 | 显示全部楼层
资料看了下, 挺好

出0入0汤圆

发表于 2011-12-22 11:48:20 | 显示全部楼层
这次一定要入手了。

出0入0汤圆

发表于 2011-12-22 11:53:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-25 23:03:44 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-12-26 13:31:03 | 显示全部楼层
好东西,正好要用到,学习

出0入0汤圆

发表于 2012-1-6 13:33:22 | 显示全部楼层
这个对我很有用。。谢谢楼主。

出0入0汤圆

发表于 2012-1-6 15:27:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-6 16:06:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-6 16:08:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-6 16:48:17 | 显示全部楼层
明天给大家传一个STM32F107的双CAN-->uart的程序!
写的一般,但是STM32的手册写的CAN非常的不详细.......看得人一头雾水.

出0入0汤圆

发表于 2012-1-6 17:57:32 | 显示全部楼层
mark mark

出0入0汤圆

发表于 2012-1-6 18:26:04 | 显示全部楼层
Mark,过几天就准备学这个

出0入0汤圆

发表于 2012-1-6 19:43:55 | 显示全部楼层
赞!!!!!!!!!!!!!

出0入24汤圆

发表于 2012-1-6 22:16:25 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2012-1-6 22:21:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-7 23:50:59 | 显示全部楼层
这个得留着,以后可能会用到

出0入0汤圆

发表于 2012-1-10 10:04:18 | 显示全部楼层
hao tiezxi

出0入0汤圆

发表于 2012-1-10 12:25:23 | 显示全部楼层
不错,参考

出0入0汤圆

发表于 2012-1-10 14:28:24 | 显示全部楼层
回复【楼主位】becarson 烽
-----------------------------------------------------------------------

学习中谢谢

出0入0汤圆

发表于 2012-1-10 15:07:30 | 显示全部楼层
值得研究!

出0入0汤圆

发表于 2012-1-10 15:23:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 16:09:22 | 显示全部楼层
回复【楼主位】becarson 烽
-----------------------------------------------------------------------

谢谢,正在看这方面的资料

出0入0汤圆

发表于 2012-1-10 16:58:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 21:17:00 | 显示全部楼层
标记一下吧,以后再学

出0入0汤圆

发表于 2012-1-11 11:49:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 20:04:09 | 显示全部楼层
回复【楼主位】becarson  烽
-----------------------------------------------------------------------

慢慢看

出0入0汤圆

发表于 2012-2-1 21:46:01 | 显示全部楼层
http://www.andybrown.me.uk/

出0入0汤圆

发表于 2012-2-1 21:57:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-1 23:35:30 | 显示全部楼层
好资料 MARK

出0入0汤圆

发表于 2012-2-4 11:33:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-4 11:34:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-4 13:41:09 | 显示全部楼层
这个一定要mark一下

出0入0汤圆

发表于 2012-2-4 14:21:39 | 显示全部楼层
写的不错。CAN总线还没接触过。呵呵。学习了。

出0入0汤圆

发表于 2012-2-4 14:28:52 | 显示全部楼层
好贴,关注

出50入0汤圆

发表于 2012-2-4 23:09:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-21 23:43:25 | 显示全部楼层
stm32 CAN mark !!好贴,对于我们这些初学者来说,真的很有用!!感谢楼主的分享!!

出0入0汤圆

发表于 2012-2-25 18:46:08 | 显示全部楼层
真的很有用!!感谢楼主的分享!

出0入0汤圆

发表于 2012-2-25 20:54:34 | 显示全部楼层
标记一下,早日争取审核通过

出0入0汤圆

发表于 2012-2-26 17:55:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-26 18:24:29 | 显示全部楼层
mark,以后好好看看

出0入0汤圆

发表于 2012-2-28 08:49:29 | 显示全部楼层
谢谢分享,仔细研究一下。

出0入0汤圆

发表于 2012-3-5 13:44:00 | 显示全部楼层
mark,不解释

出0入0汤圆

发表于 2012-5-14 10:06:34 | 显示全部楼层
好东西,看一下下~~~~

出0入0汤圆

发表于 2012-5-14 22:50:32 | 显示全部楼层
好资料 只用过SJA1000的

出0入0汤圆

发表于 2012-5-16 16:51:52 | 显示全部楼层
本帖最后由 yuhongshuai 于 2012-5-16 16:53 编辑

从一个入门者的角度讲解,讲解比较通俗易懂,但还不是太全面哈

出0入0汤圆

发表于 2012-5-21 14:34:30 | 显示全部楼层
不错的文章

出0入0汤圆

发表于 2012-5-21 15:27:54 | 显示全部楼层
谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 03:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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