搜索
bottom↓
回复: 2

dspic30f5011 can通信问题

[复制链接]

出0入0汤圆

发表于 2012-12-24 09:52:29 | 显示全部楼层 |阅读模式
各位前辈,我用的dspic30f5011做can通信用,在发送数据的时候报错,发送总线有故障,也接受不到任何数据,但是在换回模式的时候可以发送和接收数据,下面是我的程序,请各位前辈,帮忙指点一下;
/***************************************************************CAN通讯模块的控制程序**************************************************************/
#include "p30f5011.h"
#define FCY  20000000 // 5MPLL16 20 MHz
#define FCAN 20000000 // 20 MHz
#define BITRATE 125000 // 通讯波特率
#define NTQ  16 // Number of Tq cycles which will make the
                                                //CAN Bit Timing .
#define BRP_VAL ((FCAN/(2*NTQ*BITRATE))-1) //Formulae used for C1CFG1bits.BRP
unsigned int b;
//---------------------------------------------------------------------
//数据缓冲的定义//发送缓冲区
unsigned int OutData0[4] = {0x5251, 0x5453, 0x5655, 0x5857};
unsigned int OutData1[2] = {0x5A59, 0x5C5B};
unsigned int OutData2[4] = {0x6261, 0x6463, 0x6665, 0x6867};
unsigned int OutData3[2] = {0x6A69, 0x6C6B};//接受缓冲区
unsigned int InData0[4] = {0, 0, 0, 0};
unsigned int InData1[2] = {0, 0};
unsigned int InData2[4] = {0, 0, 0, 0};
unsigned int InData3[2] = {0, 0};
/***************************************************************CAN通讯模块的初始化**************************************************************/
void CAN_init(void)
{
//        TRISFbits.TRISF0=1;
//        TRISFbits.TRISF1=0;
       
        C1CTRLbits.REQOP = 0x4; //请求进入配置模式???
        while (C1CTRLbits.OPMODE!=0x4){} //确认进入配置模式??
        C1CTRLbits.CANCKS = 1; //Select the CAN Master Clock . It is equal to Fcy here.
                                                  // equal to Fcy.(Fcy=4Mhz)
        C1CFG1bits.SJW=00;   //Synchronized jump width time is 1 x TQ when SJW is equal to 00
        C1CFG1bits.BRP = BRP_VAL; //((FCY/(2*NTQ*BITRATE))-1)
        C1CFG2 = 0x02ed; // SEG1PH=6Tq, SEG2PH=3Tq, PRSEG=6Tq,Sample 3 times, Each bit time is 16Tq
        ///Interrupt Section of CAN Peripheral
        C1INTF = 0; //Reset all The CAN Interrupts
        IFS1bits.C1IF = 0;  //Reset the Interrupt Flag status register
        C1INTE = 0x00ff; //Enable all CAN interrupt sources tx0 rx0
        IEC1bits.C1IE = 1;//Enable the CAN1 Interrupt
//-----------------------------------------------------------------------------------------------------------------------
                                                        // Configure Receive registers, Filters and Masks
//-----------------------------------------------------------------------------------------------------------------------
        C1RX0CON =0x0002;
        C1RX1CON = 0x0000; // Receive Buffer1 and 0 Status use fliter 2
                                           // Acceptance Mask Register0SID and Register1SID associated with Recieve Buffer0
                                           // and Receive Buffer1 for CAN1 and CAN2
        C1RXM0SID = C1RXM1SID = 0x0001; //接收的为标准数据桢
// Acceptance Mask Register0EIDH and Register1EIDH associated with Recieve Buffer0
        C1RXM0EIDH = C1RXM1EIDH = 0x0FFF;
// Acceptance Mask Register0EIDL and Register1EIDL associated with Recieve Buffer0
        C1RXM0EIDL = C1RXM1EIDL = 0xFC00;
//Initializing of Acceptance Filter n Standard Identifier for CAN1
        C1RXF0SID = 0x0AA8; //CAN1 Receive Acceptance Filter2 SID ??
        C1RXF2SID = 0x15c0; //CAN1 Receive Acceptance Filter2 SID
        C1RXF2EIDH = 0x0004; //CAN1 Receive Acceptace Filter2 Extended Identifier high byte
        C1RXF2EIDL = 0x8C00; //CAN1 Receive Acceptance Filter2 Extended identifier low byte
//Initializing of Acceptance Filter n Standard Identifier for CAN2
//-----------------------------------------------------------------------------------------------------------------------
// Configure Transmit Registers Buffer 0 and Transmit Buffer 1
//-----------------------------------------------------------------------------------------------------------------------
        C1TX0CON = 0x0003;// High priority
        C1TX0SID = 0x50A8;// SID
        C1TX0EID = 0x0000;// EID
        C1TX0DLC = 0x01C0; //Select the Data word Length for CAN1 Transmit Buffer0 which is 8 byte
                                        // Data Field 1,Data Field 2, Data Field 3, Data Field 4
                                        // 8 bytes selected by DLC
        C1TX0B1 = OutData0[0];
        C1TX0B2 = OutData0[1];
        C1TX0B3 = OutData0[2];
        C1TX0B4 = OutData0[3];
        C1TX1CON = 0x0002; // High Intermediate priority
        C1TX1SID = 0xA860; // SID
        C1TX1EID = 0x0000;// EID
        C1TX1DLC = 0x8DA0; //Select the Data word Length for CAN1 Transmit Buffer1 which
                                                        // is 4 byte
                                                        //Data Field 1, Data Field 2
                                                        // 4 bytes selected by DLC
        C1TX1B1 = OutData1[0];
        C1TX1B2 = OutData1[1];
        C1TX2CON = 0x0001; // High Intermediate priority
        C1TX2SID = 0xA860; // SID
        C1TX2EID = 0x0000;// EID
        C1TX2DLC = 0x8DA0; //Select the Data word Length for CAN1 Transmit Buffer1 which
                                                        // is 4 byte
                                                        //Data Field 1, Data Field 2
                                                        // 4 bytes selected by DLC
        C1TX2B1 = OutData1[0];
        C1TX2B2 = OutData1[1];
//Change to Loopback Operation Mode from Configuration Mode
//        C1CTRLbits.CANCAP = 1;
        C1CTRLbits.REQOP = 0;
        while(C1CTRLbits.OPMODE != 0);//Wait for CAN1 mode change from Configuration Mode to Loopback mode
} //end main loop
//--------------------------------------------------------------------------------------------------------------------------
        //Interrupt Section for CAN1
//--------------------------------------------------------------------------------------------------------------------------
unsigned int buf=0;
unsigned int buf1[8],buf2[8];
int main()
{
        int ff;
        //        TRISFbits.TRISF0=1;
//        TRISFbits.TRISF1=0;
        CAN_init();
        while(1)
        {
        //        _LATF1 = 1;
                C1TX1B1 = OutData1[0];
                C1TX1B2 = OutData1[1];
                C1TX0B1 = OutData0[0];
                C1TX0B2 = OutData0[1];
                C1TX0B3 = OutData0[2];
                C1TX0B4 = OutData0[3];
                C1TX0CONbits.TXREQ = 1;
                C1TX1CONbits.TXREQ = 1;
                C1TX2CONbits.TXREQ = 1;
                while(C1TX0CONbits.TXREQ != 0);
//                b = b + 2;
        for(ff = 10000;ff <= 0 ; ff --)
        {}
       
        }       
        return 0;
}
void __attribute__((interrupt,auto_psv)) _C1Interrupt(void)
{
                IFS1bits.C1IF = 0; //Clear interrupt flag
                if(C1INTFbits.TX0IF)
                {
                        C1INTFbits.TX0IF = 0; //If the Interrupt is due to Transmit0 of CAN1 Clear the Interrupt
                }
                if(C1INTFbits.TX1IF)
                {
                        C1INTFbits.TX1IF = 0; //If the Interrupt is due to Transmit1 of CAN1 Clear the Interrupt
                }
                if(C1INTFbits.TX2IF)
                {
                        C1INTFbits.TX2IF = 0; //If the Interrupt is due to Transmit1 of CAN1 Clear the Interrupt
                }
   if(C1INTFbits.RX0IF)
            {
                    C1INTFbits.RX0IF = 0; //If the Interrupt is due to Receive0 of CAN1 Clear the Interrupt
                        InData0[0] = buf1[0]= C1RX0B1;
                        InData0[1] = buf1[1]=C1RX0B2; //Move the recieve data from Buffers to InData
                        InData0[2] = buf1[2]=C1RX0B3;  
                        InData0[3] = buf1[3]=C1RX0B4;
                        C1RX0CONbits.RXFUL=0;
                        if ((InData0[0]==OutData0[0]) && (InData0[1]==OutData0[1]) && (InData0[2]==OutData0[2]) && (InData0[3]==OutData0[3]))
                        b = b +10;
                }
        if(C1INTFbits.RX1IF)
                {
                        C1INTFbits.RX1IF = 0; //If the Interrupt is due to Receive1 of CAN1 Clear the Interrupt
                        InData1[0] =buf2[0]= C1RX1B1; //Move the data received to Indata Registers
                        InData1[1] = buf2[1]=C1RX1B2;
                        C1RX1CONbits.RXFUL=0;
                        if ((InData1[0]==OutData1[0]) && (InData1[1]==OutData1[1]))
                                b = b +2;
                }
                if(C1INTFbits.TXWAR)
                {
                        b = b +4;
                }
                if(C1INTFbits.TXEP)
                {
                        b = b +6;
                }
                if(C1INTFbits.TXBO)
                {
                         b = b +8;
                }
}
                       

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2012-12-24 13:50:55 | 显示全部楼层
怎么没有人来过

出0入0汤圆

发表于 2013-9-30 08:18:36 | 显示全部楼层
检查一下,是否退出总线了!如果是的话肯定接收不到数据,主动错误累计到一定值会脱离总线!你必须做到再加入
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-25 12:12

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

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