tcw_xny 发表于 2012-4-1 16:39:16

LPC2119 CAN通信求助!

哪位大哥有例程传上来一个啊,憋了好几天搞不清啊!QQ:871715712,也可以联系我啊!谢过了

ahuang227 发表于 2012-4-1 16:40:25

新手就是为了求例程的啊?官网上没有的吗?

tcw_xny 发表于 2012-4-6 14:10:52

代码写完了,没多少时间,断断续续的写了这么多天。网上资料不多,上传一下我写的代码,新手,写的不好,万望多多指教。
MCU:LPC2119,收发器ZLG:CTM1050T。FullCAN正在搞,还需要时间
#include <lpc21xx.h>
#include "delay.h"
#include "UART.h"
extern unsigned char U0RcvChar;                                                       //串口接收到的数据
#define CAN1         0                                                                       //CAN1表示为 0
#define CAN2         1                                                                       //CAN1表示为 0

#define BPS_250K    (0<<23)|(1<<20)|(3<<18)|(0<<14)|3   //波特率,具体计算参考PLL,VPB
#define BPS_500K    (0<<23)|(1<<20)|(3<<18)|(0<<14)|1   //波特率,具体计算参考PLL,VPB
#define BPS_1M      (0<<23)|(1<<20)|(3<<18)|(0<<14)|0   //波特率,具体计算参考PLL,VPB

#define EXTEND               1                                                                       //CAN扩展模式,29位标识符
#define BASIC               0                                                                       //CAN基本模式,11位标识符

#define DLC1         0x08                                                               //发送数据字节数8个
#define DLC2         0x08                                                               //发送数据字节数8个

#define MY_ID      0xaa                                                               //自己的地址
#define REC_ID       0xbb                                                               //预存的可能存在的发送方地址

#define PRIO_1       0x00                                                               //发送优先级
#define PRIO_2       0x01                                                               //发送优先级

/*************************************************************************************/
unsigned long rec_id;                                                                       //接收到的ID号
unsigned long rec_1;                                                                       //接收到的数据1
unsigned long rec_2;                                                                       //接收到的数据2

unsigned long tx_1;                                                                             //等待发送的字节1
unsigned long tx_2;                                                                             //等待发送的字节2
unsigned long tx_3;                                                                             //等待发送的字节3
unsigned long tx_4;                                                                             //等待发送的字节4
unsigned long tx_5;                                                                             //等待发送的字节5
unsigned long tx_6;                                                                             //等待发送的字节6
unsigned long tx_7;                                                                             //等待发送的字节7
unsigned long tx_8;                                                                             //等待发送的字节8
/**************设置CAN控制器引脚*****************/
void PinSet(unsigned long CanNum)
{
        PCONP|=~((unsigned long)0x01<<(13+CanNum));
        switch(CanNum)
        {
                case   CAN1:
                        PINSEL1&=~((unsigned long)0x03<<18);
                        PINSEL1|=((unsigned long)0x01<<18);
                        break;
                case   CAN2:
                        PINSEL1&=~((unsigned long)0x0F<<14);
                        PINSEL1|=((unsigned long)0x05<<14);
                        break;
                default:
                        break;
        }
}
/***********通信波特率设置*********************/
void SetBaud(unsigned long CanNum,unsigned long BPS)
{
        switch(CanNum)
        {
                case   CAN1:
                        C1BTR=BPS;
                        break;
                case   CAN2:
                        C2BTR=BPS;   
                        break;
                default:
                        break;
        }
}
/**********接收超时次数设置***********************/
void SetErrorNum(unsigned char CanNum)
{
        switch(CanNum)
        {
                case   CAN1:
                        C1EWL=0x60;
                        break;
                case   CAN2:
                        C2EWL=0x60;
                        break;
                default:
                        break;
        }
}
/**********中断服务程序_________1***************************/
void CAN_1_Int(void) __irq
{
        if(C1ICR&0x01)//接收中断标志,表示接收到一条有用信息
        {
                rec_id = C1RID;//接收到的帧ID
                rec_1= C1RDA;//接收到的前4字节数据
                rec_2= C1RDB;//接收到的后4字节数据
                if(rec_id==MY_ID)
                        UART0_PutCh(0xAA);
                C1CMR=0x04;//释放接收缓冲
        }
        VICVectAddr=0;//通知中断结束
}
/**********中断服务程序__________2***************************/
void CAN_2_Int(void) __irq
{
        if(C2ICR&0x01)//接收中断标志,表示接收到一条有用信息
        {
                rec_id = C2RID;//接收到的帧ID
                rec_1= C2RDA;//接收到的前4字节数据
                rec_2= C2RDB;//接收到的后4字节数据
                if(rec_id==MY_ID&&rec_1==0x01020304&&rec_2==0x05060708)
                        UART0_PutCh(0xBB);       
                C2CMR=0x04;//释放接收缓冲
        }
        VICVectAddr=0;//通知中断结束
}
/**********中断设置*****************************/
void SetInterrupt(unsigned charCanNum)
{
        switch(CanNum)
        {
                case   CAN1:
                        C1IER=0x3FF;                                                       //所有中断使能
                        VICIntSelect = 0x00000000;                        // 设置所有的通道为向量 IRQ中断
                        VICIRQStatus=VICIRQStatus|(1<<19)|(1<<20)|(1<<26);
                        VICVectCntl1 = 0x20 |19|20| 26;                                // CAN
                        VICDefVectAddr = (unsigned int)CAN_1_Int;                // 设置CAN1向量地址
                        //VICVectAddr1   = (unsigned int)CAN_1_Int;                // 设置CAN1向量地址
                        VICIntEnable=VICIntEnable|(1<<19)|(1<<20)|(1<<26);//使能CAN1中断通道
                        AFMR=0x03;               
                        break;
                case   CAN2:
                        C2IER=0x3FF;                                                       //所有中断使能
                        VICIntSelect = 0x00000000;                        // 设置所有的通道为向量 IRQ中断
                        VICIRQStatus=VICIRQStatus|(1<<19)|(1<<21)|(1<<27);
                        VICVectCntl2 = 0x20 |19|21| 27;                                // CAN
                        VICDefVectAddr = (unsigned int)CAN_2_Int;                // 设置CAN2向量地址
                        //VICVectAddr2   = (unsigned int)CAN_2_Int;                // 设置CAN2向量地址
                        VICIntEnable=VICIntEnable|(1<<19)|(1<<21)|(1<<27);//使能CAN1中断通道
                        AFMR=0x03;       
                        break;
                default:
                        break;
        }
}
/**********CAN总线初始化***************************/
void Init_CAN(unsigned long CanNum,unsigned long IFINT)
{
        PinSet(CanNum);
        switch(CanNum)
        {
                case   CAN1:
                        C1MOD=C1MOD|0x01;//软件使能CAN1控制器    0:使能,不能写入1:禁止,允许写入
                        C1MOD=C1MOD&0xBD;//接收应答模式
                        C1MOD=C1MOD&0xBB;//发送应答模式
                        C1MOD=C1MOD|0x08;//发送缓冲区优先级由Tx优先级决定                       
                        SetBaud(CAN1,BPS_500K);//设定通信波特率
                        SetErrorNum(CAN1);//设置错误警告
                        if(IFINT)
                                SetInterrupt(CAN2);//设置中断,开启所有CAN中断

                        C1RFS=(0<<31)|(DLC2<<16)|(1<<10);//帧信息:11位标准数据帧,8位数据,接收信息旁路,ID索引字段无意义
                        C1MOD=C1MOD&0xFE;//软件复位CAN1控制器                       
                        break;
                case   CAN2:
                        C2MOD=C2MOD|0x01;//软件使能CAN1控制器    0:使能,不能写入1:禁止,允许写入
                        C2MOD=C2MOD&0xBD;//接收应答模式
                        C2MOD=C2MOD&0xBB;//发送应答模式
                        C2MOD=C2MOD|0x08;//发送缓冲区优先级由Tx优先级决定                       
                        SetBaud(CAN2,BPS_500K);//设定通信波特率
                        SetErrorNum(CAN2);//设置错误警告
                        if(IFINT)
                                SetInterrupt(CAN2);//设置中断,开启所有CAN中断

                        C2RFS=(0<<31)|(DLC2<<16)|(1<<10);//帧信息:11位标准数据帧,8位数据,接收信息旁路,ID索引字段无意义
                        C2MOD=C2MOD&0xFE;//软件复位CAN1控制器
                        break;
                default:
                       break;
        }
               
}
/**********数据组合程序***********************/
unsigned long CAN_Data_Mux(unsigned long dat1,unsigned long dat2,unsigned long dat3,unsigned long dat4)
{
        unsigned long send_data;
        send_data=(dat1<<24)|(dat2<<16)|(dat3<<8)|(dat4);
        return send_data;
}

/**********CAN总线发送程序*********************/
void CAN_SEND(unsigned long CanNum)
{
        unsigned long high_4;
        unsigned long low_4;
        if(CanNum==CAN1)
        {       
                C1TFI1=(BASIC<<31)|(DLC1<<16)|(PRIO_1);//帧信息:11位标准数据帧,8位数据
                C1TID1 = MY_ID;//帧ID
                high_4=CAN_Data_Mux(tx_1,tx_2,tx_3,tx_4);
                C1TDA1 = high_4;//高4字节数据
                low_4=CAN_Data_Mux(tx_5,tx_6,tx_7,tx_8);
                C1TDB1 = low_4;//低4字节数据
                C1CMR= 0x20;//选择第一缓冲
                C1CMR   = C1CMR| 0X04;//接收缓冲区释放并由下一帧消息代替
                C1CMR =C1CMR | 0x01;//启动发送
        }
        else
        {
                C2TFI1=(BASIC<<31)|(DLC1<<16)|(PRIO_1);//帧信息:11位标准数据帧,8位数据
                C2TID1 = MY_ID;//帧ID
                high_4=CAN_Data_Mux(tx_1,tx_2,tx_3,tx_4);
                C2TDA1 = high_4;//高4字节数据
                low_4=CAN_Data_Mux(tx_5,tx_6,tx_7,tx_8);
                C2TDB1 = low_4;//低4字节数据
                C2CMR= 0x20;//选择第一缓冲
                C2CMR= C2CMR| 0X04;//接收缓冲区释放并由下一帧消息代替
                C2CMR =C2CMR | 0x01;//启动发送       
        }
}
/**********主程序****************************/
int main(void)
{
        unsigned char test_str[]="chanpinbu";
        UART0_init();
        tx_1=1;
        tx_2=2;
        tx_3=3;
        tx_4=4;
        tx_5=5;
        tx_6=6;
        tx_7=7;
        tx_8=8;
        Init_CAN(CAN1,0);
        Init_CAN(CAN2,1);       
       
        U0RcvChar=0;
        UART0_PutStr(test_str);
        while(1)
        {                                  
                if(U0RcvChar==0xaa)
                {
                        UART0_PutCh(0xbd);
                        U0RcvChar=0;

                }
                CAN_SEND(CAN1);
//                if(C1GSR&0x08==0x08)
//                        UART0_PutCh(0xbd);
        //        CAN_SEND(CAN2);
                delay(1000000);       
        }       
}

yelvAVR 发表于 2012-4-6 17:19:17

tcw_xny 发表于 2012-4-6 14:10 static/image/common/back.gif
代码写完了,没多少时间,断断续续的写了这么多天。网上资料不多,上传一下我写的代码,新手,写的不好,万 ...

这个可以用??..我这边有周立功的上位机软件!

tcw_xny 发表于 2012-4-8 17:45:16

yelvAVR 发表于 2012-4-6 17:19 static/image/common/back.gif
这个可以用??..我这边有周立功的上位机软件!

我一个发,一个收,收的和发的是一样的,我感觉可以用了(我是新手,不要笑啊)。
怎么你测试了不好使?

yelvAVR 发表于 2012-4-8 21:13:30

tcw_xny 发表于 2012-4-8 17:45 static/image/common/back.gif
我一个发,一个收,收的和发的是一样的,我感觉可以用了(我是新手,不要笑啊)。
怎么你测试了不好使? ...

你把所有包裹发一下 我测试一下我用的lpc2294帮你测试!收发器是SN65系列full我也正在。。。。努力中!
yelv1989@163.com

yelvAVR 发表于 2012-4-8 21:15:30

yelvAVR 发表于 2012-4-8 21:13 static/image/common/back.gif
你把所有包裹发一下 我测试一下我用的lpc2294帮你测试!收发器是SN65系列full我也正在。。。。努力 ...

我用的是ADS!老大这里不能留Q_Q所以先邮件联系一下!你是不是keil?

zjk 发表于 2014-3-17 11:03:25

{:lol:}来看看啊。。。

huangxiaowei 发表于 2014-4-16 14:31:40

   顶一下
页: [1]
查看完整版本: LPC2119 CAN通信求助!