LPC2119 CAN通信求助!
哪位大哥有例程传上来一个啊,憋了好几天搞不清啊!QQ:871715712,也可以联系我啊!谢过了 新手就是为了求例程的啊?官网上没有的吗? 代码写完了,没多少时间,断断续续的写了这么多天。网上资料不多,上传一下我写的代码,新手,写的不好,万望多多指教。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);
}
}
tcw_xny 发表于 2012-4-6 14:10 static/image/common/back.gif
代码写完了,没多少时间,断断续续的写了这么多天。网上资料不多,上传一下我写的代码,新手,写的不好,万 ...
这个可以用??..我这边有周立功的上位机软件! yelvAVR 发表于 2012-4-6 17:19 static/image/common/back.gif
这个可以用??..我这边有周立功的上位机软件!
我一个发,一个收,收的和发的是一样的,我感觉可以用了(我是新手,不要笑啊)。
怎么你测试了不好使? tcw_xny 发表于 2012-4-8 17:45 static/image/common/back.gif
我一个发,一个收,收的和发的是一样的,我感觉可以用了(我是新手,不要笑啊)。
怎么你测试了不好使? ...
你把所有包裹发一下 我测试一下我用的lpc2294帮你测试!收发器是SN65系列full我也正在。。。。努力中!
yelv1989@163.com yelvAVR 发表于 2012-4-8 21:13 static/image/common/back.gif
你把所有包裹发一下 我测试一下我用的lpc2294帮你测试!收发器是SN65系列full我也正在。。。。努力 ...
我用的是ADS!老大这里不能留Q_Q所以先邮件联系一下!你是不是keil?
{:lol:}来看看啊。。。 顶一下
页:
[1]