找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3979|回复: 0
收起左侧

关于PIC24H单片机CAN通讯程序请教各位

[复制链接]
ID:179676 发表于 2017-3-22 10:29 | 显示全部楼层 |阅读模式
我用的是PIC24HJ256GP610A,下了官方的CAN通讯例程,改完之后就是通讯不了,光发送都是不成功的,想请教各位有没有成功的例程可以借我参考一下,谢谢了。

#include "p24Hxxxx.h"
#include  "Uart.h"

#include "ECAN1Config.h"

/* Dma Initialization for ECAN1 Transmission */

void Dma0_init(void)
{
         DMACS0=0;          // 为 ECAN 发送初始化 DMA 通道 0 并清零冲突标志
     DMA0CON=0x2020;    // 设置通道 0 工作在外设间接寻址模式、正常操作、字操作,并选择发送到外设
         DMA0PAD=0x0442;        // 设置外设 ECAN1 ( C1TXD)的地址.
         DMA0CNT=0x0007;    // 设置数据块传输大小为 8.
         DMA0REQ=0x0046;        // 按照 DMA 请求自动启动 DMA 发送.
         DMA0STA=  __builtin_dmaoffset(ecan1msgBuf);       
         DMA0CONbits.CHEN=1;// 使能通道
}

/* Dma Initialization for ECAN1 Reception */
/*
void Dma2_init(void)
{
         DMACS0=0;          //  为 ECAN 接收初始化 DMA 通道 2 并清零冲突标志
     DMA2CON=0x0020;    //  设置通道 2 工作在外设间接寻址模式、正常操作、字操作,并选择从外设接收
         DMA2PAD=0x0440;        //  设置外设 ECAN1 ( C1RXD)的地址
         DMA2CNT=0x0007;    //  设置数据块传输大小为 8
         DMA2REQ=0x0022;        //  按照 DMA 请求自动启动 DMA 发送
         DMA2STA= __builtin_dmaoffset(ecan1msgBuf);       
         DMA2CONbits.CHEN=1;// 使能通道         
}
*/

void Ecan1_Inter(void)
{
    IEC2bits.C1IE = 1;
        C1INTEbits.TBIE = 1;       
        C1INTEbits.RBIE = 1;
}


void Ecan1_init(void)
{
    long identifier_f,identifier_m,sid10_0=0, eid15_0=0, eid17_16=0;

    TRISF |= 1;
    TRISF &= ~0x2 ;

    Dma0_init();

    /* 请求配置模式 */
    C1CTRL1bits.REQOP=4;
        while (C1CTRL1bits.OPMODE!=4);

    /* 配置波特率 位时间=( 同步段 + 传播延时 + 相位缓冲段 1 + 相位缓冲段 2) =8*TQ */
    /* 相位缓冲段1=3TQ  相位缓冲段2=3TQ 传播延时=1TQ 同步段=1TQ 比特率为 500kbps */
       
    C1CTRL1bits.CANCKS = 1;    // FCAN 选择为 FCY FCAN = FCY = 8 MHz
    C1CFG1bits.BRP = 0;          // TQ = 2 x 1 x 1/FCAN
    C1CFG1bits.SJW = 0;       //同步跳转宽度设置为 1 TQ
    C1CFG2bits.SEG1PH = 2;    //相位缓冲段 1 的时间为 3 TQ
    C1CFG2bits.SEG2PHTS = 1;  //相位缓冲段 2 的时间设置为可编程
    C1CFG2bits.SEG2PH = 2;    //相位缓冲段 2 的时间为 3 TQ
    C1CFG2bits.PRSEG = 0;     //传播时间段的时间为 1 TQ
    C1CFG2bits.SAM = 0;       //在该采样点采样总线一次


    C1FCTRLbits.DMABS=0b000;        // DMA RAM 中的 4 个缓冲区

    /*过滤器与屏蔽器配置,过滤器 0 ,F_ID =  ,缓冲区 1 ,屏蔽器 0 , M_ID = */

    //Acceptance Filter "n"
    identifier_f = 0;
    eid15_0 = (identifier_f & 0xFFFF);
        eid17_16= (identifier_f>>16) & 0x3;
        sid10_0 = (identifier_f>>18) & 0x7FF;

    C1CTRL1bits.WIN=1;

    C1RXF0SID=(((sid10_0)<<5) + 0x8) + eid17_16;
        C1RXF0EID=eid15_0;   

    C1BUFPNT1bits.F0BP=0x1;      //满足条件将接收到缓冲区1
    C1FMSKSEL1bits.F0MSK=0x0;   //接收屏蔽寄存器 0 包含屏蔽值
    C1FEN1bits.FLTEN0=0x1;      // 使能过滤器0 来接收报文

    C1CTRL1bits.WIN=0;

    //Acceptance Filter Mask "m"

    identifier_m = 0;
    eid15_0 = (identifier_m & 0xFFFF);
        eid17_16= (identifier_m>>16) & 0x3;
        sid10_0 = (identifier_m>>18) & 0x7FF;

    C1CTRL1bits.WIN=1;

    C1RXM0SID=(((sid10_0)<<5) + 0x8) + eid17_16;
        C1RXM0EID=eid15_0;

    C1CTRL1bits.WIN=0;

    /* 请求正常工作模式 */
    C1CTRL1bits.REQOP=0;
        while(C1CTRL1bits.OPMODE!=0);  

    /* ECAN1 发送/接收信息配置 */
    C1RXFUL1=C1RXFUL2=C1RXOVF1=C1RXOVF2=0x0000;
        C1TR01CONbits.TXEN0=1;                        /* ECAN1, Buffer 0 is a Transmit Buffer */
        C1TR01CONbits.TXEN1=0;                        /* ECAN1, Buffer 1 is a Receive Buffer */
        C1TR01CONbits.TX0PRI=0b11;                 /* Message Buffer 0 Priority Level */
        C1TR01CONbits.TX1PRI=0b11;                 /* Message Buffer 1 Priority Level */

    Ecan1_Inter();

}

void ecan1WriteTxMsgBufId(long txIdentifier)
{
    unsigned long word0=0, word1=0, word2=0;

    unsigned long sid10_0=0, eid5_0=0, eid17_6=0;

    eid5_0  = (txIdentifier & 0x3F);
        eid17_6 = (txIdentifier>>6) & 0xFFF;
        sid10_0 = (txIdentifier>>18) & 0x7FF;
        word1 = eid17_6;

    word0 = ((sid10_0 << 2) | 3);
    word2 = (eid5_0 << 10);

    ecan1msgBuf[0][0] = word0;

        ecan1msgBuf[0][1] = word1;
        ecan1msgBuf[0][2] = word2;

}

void ecan1WriteTxMsgBufData(unsigned int dataLength, unsigned int data1, unsigned int data2, unsigned int data3, unsigned int data4)
{
    ecan1msgBuf[0][2] = (ecan1msgBuf[0][2] & 0xfff0 )+dataLength;
    ecan1msgBuf[0][3] = data1;
    ecan1msgBuf[0][4] = data2;
    ecan1msgBuf[0][5] = data3;
    ecan1msgBuf[0][6] = data4;
}


int main(void)
{

     clearIntrflags();


     Port_init();
     Uart1_init();
     Ecan1_init();
     while(1)
     {

           ecan1WriteMessage();
          //         C1TR01CONbits.TXREQ0=1;

         if(KEY==0)
         {
             delay(150);
             if(KEY==0)
             {
                 LED1=~LED1;C1TR01CONbits.TXREQ0=1;
                 while(!KEY);

             }
         }

}

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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