还有各位高手,我初次使用LPC2292,也是初次接触CAN通讯,在使用过程中出现一些问题向各位请教。在初始化后调用CAN数据发送程序,使用示波器测量CAN2的TD2管脚信号,始终为高电平,没有信号输出,芯片程序如下,其中工作环境为芯片时钟输入16MHZ,经过PLL倍频到48MHZ,再经VPB4分频后变为12MHZ,CAN通讯波特率800K。之前在发送数据前读取CAN2SR时钟为0,在发送数据后,也就是CAN2CMR=0x21;指令之后读取CAN2SR也为0。请周工还有各位高手帮我找一下程序里存在的问题,为什么没有信号输出,谢谢了。
#include "config.h"
void yans(uint32 dly)
{
uint32 i;
i = dly;
while(--i){;}
}
void set_can_accf(void)
{//CAN2的扩展帧验收码
uint32 tmp;
CANAFMR = 0x02;
CANSFF_sa=0;
CANSFF_GRP_sa=0;
CANEFF_sa=0;
tmp=2<<29;//01版芯片
(*(volatile unsigned long *)(can_ram))=0x03032000+tmp;
(*(volatile unsigned long *)(can_ram+4))=0x07032000+tmp;
(*(volatile unsigned long *)(can_ram+8))=0x0a032000+tmp;
(*(volatile unsigned long *)(can_ram+12))=0x1a382000+tmp;
(*(volatile unsigned long *)(can_ram+16))=0x1a388410+tmp;
CANEFF_GRP_sa=20;
CANENDofTable=20;
CANAFMR=0;
}
void can_send(void)
{
CAN2TFI1=0x80080000;
CAN2TID1=0x03032000;
CAN2TDA1=0x55aa55aa;
CAN2TDB1=0x00ff00ff;
CAN2CMR=0x21;
}
void chushi(void)//初始化
{
/////////////////////PLL配置
//时钟输入为16MHZ,经过PLL倍频为48MHZ
PLLCON=1;//使能但不连接
PLLCFG=0x22;//设定M值为2 P值为1
PLLFEED=0xaa;//发送馈送序列
PLLFEED=0x55;
while((PLLSTAT & 0X0400)==0)//如果PLL没有被锁定
{}
PLLCON=3;//连接PLL
PLLFEED=0xaa;//发送馈送序列
PLLFEED=0x55;
/////////////////////GPIO管脚配置
PINSEL0=0x00000000;//管脚为GPIO // 打开CAN控制器电源
PINSEL2=(PINSEL2 & 0xff8c1f2f)| 0x0f800920;
IO0DIR=0x400000;
VPBDIV=0;//设备时钟为PLL的1/4,即12MHZ
////////////////////外部存储器控制
BCFG0=0x10002ce0;//读访问延时7个周期,写访问延时5个周期
///////////CAN初始化
PCONP |= (1 << 14);//开CAN2电源
PINSEL1 &= ~(0x3F << 14);
PINSEL1 |= (0x15 << 14);//设置TD2,RD2,RD1
CAN2MOD |= 0x01; //复位
CAN2BTR = 0x001C000E; //波特率为800k,所以将VPB时钟15分频
CAN2IER = 0x00;
CAN1EWL = 0x60;
set_can_accf();
CAN2MOD &= ~0x01;
}
int main (void)
{// add user source code
uint8 i=0;
chushi();
while(1)
{//1
can_send();
yans(10000000); //延时1秒
}//1
return 0;
} |