我用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() ; } } |