搜索
bottom↓
回复: 14

PIC18F45K80的CAN通信例程问题

[复制链接]

出0入0汤圆

发表于 2012-11-27 18:56:36 | 显示全部楼层 |阅读模式
本帖最后由 whxemail 于 2012-11-27 18:57 编辑

本人从微芯官网下载了CAN18CXX8的CAN通信例程,有如下问题
1、CAN初始化函数

void CANInitialize(BYTE SJW,
                    BYTE BRP,
                    BYTE PHSEG1,
                    BYTE PHSEG2,
                    BYTE PROPSEG,
                    enum CAN_CONFIG_FLAGS config)
{
}

问题1:关于几个值的设置,
      主时钟源设置为 32M,本人想得到 250Kbps 的波特率,即位时间为 4us 本人设置如下

      CANInitialize(2, 3, 5, 5, 4, CAN_CONFIG_VALID_STD_MSG);//250k波特率
      
      T Q(μs)= (2 * (BRP + 1))/F OSC(MHz)  即 (2 * (3 + 1))/32(MHz) = 0.25 us
      标称位时间 = T Q * (Sync_Seg + Prop_Seg +Phase_Seg1 + Phase_Seg2)   
         即 T Q * (Sync_Seg + Prop_Seg +Phase_Seg1 + Phase_Seg2) =0.25us*(2+5+5+4)= 4us
         
        但是通过示波器测出来的波形位时间不是4us,是不是我的波特率设置有问题呢,希望知道的解答下   


2、CAN发送函数

BOOL CANSendMessage(unsigned long id,
                     BYTE* Data,
                     BYTE DataLen,
                     enum CAN_TX_MSG_FLAGS MsgFlags)
{
    BYTE i;
    BYTE *ptr;

    // Find the first empty transmitter.
    if ( TXB0CON_TXREQ == 0 )
    {
        // TxBuffer0 is empty.  Set WIN bits to point to TXB0
        CANCON &= 0b11110001;
        CANCON |= 0b00001000;
    }
    else if ( TXB1CON_TXREQ == 0 )
    {
        // TxBuffer1 is empty. Set WIN bits to point to TXB1
        CANCON &= 0b11110001;
        CANCON |= 0b00000110;
    }
    else if ( TXB2CON_TXREQ == 0 )
    {
        // TxBuffer2 is empty. Set WIN bits to point to TXB2
        CANCON &= 0b11110001;
        CANCON |= 0b00000100;
    }
    else
        // None of the transmit buffers were empty.
        return FALSE;

    /*
     * Now that WIN has remapped RXB0 to empty buffer, simply
     * populate RXB0 buffer
     */

    // Set transmit priority.
    RXB0CON = MsgFlags & CAN_TX_PRIORITY_BITS;

    // Populate Extended identifier information only if it is
    // desired.
    if ( !(MsgFlags & CAN_TX_FRAME_BIT) )
        CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_XTD_MSG);
    else
        CANIDToRegs((BYTE*)&RXB0SIDH, id, CAN_CONFIG_STD_MSG);

    RXB0DLC = DataLen;

    if ( !(MsgFlags & CAN_TX_RTR_BIT) )
        RXB0DLC |= 0b01000000;

    // Populate data values.
    ptr = (BYTE*)&RXB0D0;
    for ( i = 0; i < DataLen; i++ )
        ptr = Data;

    /*
     * Mark this buffer as ready to start transmit.
     * We are not using C bit field structure because RXB0 registers
     * are remapped to one of the empty transmit buffers and their
     * bit3 is not same as RXB0CON bit3.  To avoid confusion, in-line
     * assembly is used to directly set bit 3 of corresponding TXBnCON
     * register.
     */
#if defined(MCHP_C18)
     _asm
     bsf RXB0CON, 3, 0
    _endasm
#endif
#if defined(HITECH_C18)
       asm("bsf _RXB0CON,3");
#endif

    /*
     * Restore CAN buffer mapping so that subsequent access to RXB0
     * buffers are to the real RXB0 buffer.
     */
    CANCON &= 0b11110001;

    return TRUE;
}

问题2:
上面的发送函数,为什么把一些要发送的内容赋给接收寄存器,

RXB0CON = MsgFlags & CAN_TX_PRIORITY_BITS;

RXB0DLC = DataLen;

bsf RXB0CON, 3, 0

而不是发送寄存器

本来以为例程错了,把接收寄存器都改为了发送寄存器,但是连波形都没了,原来不改还有的

等待指点。。。。。。。。。。。。。


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-11-27 19:37:51 | 显示全部楼层
提点建议啊

出0入0汤圆

发表于 2012-12-4 11:03:12 | 显示全部楼层
支持下!

出0入0汤圆

发表于 2012-12-4 11:33:09 | 显示全部楼层
看看 谢谢

出0入0汤圆

 楼主| 发表于 2012-12-11 15:08:35 | 显示全部楼层
没人用过?

出0入0汤圆

发表于 2012-12-12 17:19:01 | 显示全部楼层
楼主。。。这么久了 还没有解决问题吗?

出0入0汤圆

 楼主| 发表于 2012-12-28 15:37:45 | 显示全部楼层
leyuanshi 发表于 2012-12-12 17:19
楼主。。。这么久了 还没有解决问题吗?

解决了 现在可以了

出0入0汤圆

 楼主| 发表于 2012-12-28 15:38:49 | 显示全部楼层
leyuanshi 发表于 2012-12-12 17:19
楼主。。。这么久了 还没有解决问题吗?

怎么了  你准备用了

出0入0汤圆

发表于 2013-4-5 09:46:30 | 显示全部楼层
能帮忙讲下,你改了什么吗?我现在在调PIC18F65K80的程序,发现没有波形出来。谢谢啊。

出0入0汤圆

发表于 2013-4-8 23:54:19 | 显示全部楼层
准备用……

出0入0汤圆

发表于 2013-4-28 10:46:40 | 显示全部楼层
whxemail 发表于 2012-12-28 15:37
解决了 现在可以了

解决了说说原来什么问题呀,这个也是有用的经验

出0入0汤圆

发表于 2013-4-28 13:52:52 | 显示全部楼层
学习一下,谢谢!

出0入0汤圆

发表于 2013-5-3 00:58:43 | 显示全部楼层
楼主怎么解决的呢

出0入0汤圆

发表于 2013-6-4 16:51:05 | 显示全部楼层
LZ把代碼分享下出來呀!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-6-3 18:54

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

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