我用GZ16做CAN总线通信,但是用汇编的程序调通,不知道为什么,改成C就不行了,以下是我的C程序,请各位大侠指教,小弟在此写过了!急啊!#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ16.h> /* include peripheral declarations */
extern typedef unsigned char byte;
byte TEMPCMCR0 ;
byte TEMP;
byte TXFLAG1 ;
byte TEMPCRFLG ;
byte TEMPPORTA ;
byte TEMPPORTB ;
byte TEMPPORTB1;
byte TEMPDSRRX0;
byte FLAG ; /* 读数成功标志位 */
byte TEMPCTFLG ;
int i;
void init_Ports ()
{
DDRA=0x03;
DDRB=DDRB&0xF3;
DDRE=0xFF;
DDRC=0x3D;
PTA=PTA&0x03;
PTB=PTB&0xF3;
PTE=0x00;
PTC=PTC&0x03;
TEMPPORTB1=0x00;
TEMPDSRRX0=0x00;
TEMPCRFLG= 0x00;
TEMPCTFLG=0x00;
FLAG= 0x00;
}
void init_can ()
{
CMCR0=0x01;
CMCR1=0x00;
CBTR0=0x01;
CBTR1=0x58 ;
/***************************INITIAL CAN INTERRUPT**********************/
CTCR=0x00;
CIDAC=0x20;
/****************************initial filter*******************************/
/*设置接受符ID过滤比较码寄存器。因为屏蔽码置为0xFF,所有的为豆浆被忽略,
所以这里的比较码可以置为任意值*/
CIDAR0=0x33;
CIDAR1=0x55;
CIDAR2=0x55;
CIDAR3=0x55;
/*设置接受符ID过滤屏蔽码寄存器,因为是测试程序,所有的屏蔽码为都为1,接受所有的数据*/
CIDMR0=0x00;
CIDMR1=0xFF;
CIDMR2=0xFF;
CIDMR3=0xFF;
/************************RECEIVE BUFFER ******************************/
REC_DLR=0x01;
/*************************TRANSMISS BUFFER 1*****************************/
TBPR0=0x11;
DLR0 =0x01;
IDR00=0x55;
IDR10=0x00;
/**************************CAN NOMAL WORK*********************************/
CMCR0=0x00;
CRIER=0x01;
CRFLG=0x00;
TEMPCMCR0=CMCR0;
while(TEMPCMCR0&0x10==0){
TEMPCMCR0=CMCR0;
}
}
void READDATA() {
TEMPPORTA=0x00;
TEMPPORTA=PTA;
TEMPPORTA=TEMPPORTA&0xFC;
TEMPPORTA=TEMPPORTA>>2;
TEMPPORTB=0x00;
TEMPPORTB=PTB;
TEMPPORTB=TEMPPORTB&0x0C;
TEMPPORTB=TEMPPORTB<<4;
TEMPPORTB=TEMPPORTB&0xC0;
TEMPPORTB=TEMPPORTB|TEMPPORTA;
}
interrupt void r_isr(){
DisableInterrupts;
TEMPDSRRX0= REC_DSR0 ;
FLAG =0x01;
EnableInterrupts;
}
void t_isr()
{
for(i=0;i<3;i++) {
}
DSR00 =TEMPPORTB;
TXFLAG1=0x00;
TXFLAG1= CTFLG&0x01;
while( TXFLAG1==0x00) {
TXFLAG1= CTFLG&0x01;
}
for(i=0;i<5;i++) {
}
EnableInterrupts;
}
void CHULI() {
FLAG=0x00;
PTE=0x00;
PTC=PTC&0x03;
TEMP=TEMPDSRRX0;
TEMP=TEMP&0xF0;
TEMP=TEMP>>2;
PTE=PTE|TEMP;
TEMPDSRRX0=TEMPDSRRX0&0x0F;
TEMPDSRRX0=TEMPDSRRX0<<2;
PTC=PTC|TEMPDSRRX0;
}
void RECEIVE() {
for(i=0;i<3;i++) {
}
if(FLAG&0x01)
CHULI() ;
}
void main(void) {
for(i=0;i<307;i++) {
}
DisableInterrupts; /* disable interrupts */
CONFIG2=0x0A;
CONFIG1=0x1B;
init_Ports () ;
init_can();
EnableInterrupts;
for(i=0;i<3;i++) {
}
while(1){
READDATA() ;
t_isr();
RECEIVE() ;
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |