?? can.c
字號:
#include "2407c.h"
volatile ioport unsigned int port8008;
#define IOWR port8008
int uWork;
void watchdog(void);
void delay_nus(long int n);
void delay_ns(long int n);
void Max_CS(int ab,int val);
void Max_CLK(int ab,int val);
void Max_DIN(int ab,int val);
void Max_SEND(unsigned int val);
void dly_nus(long int n) ;
void LED_init(void);
void CANMBX_ISR();
void interrupt GRIS5(void);
void CAN_INIT();
int CAN_FLAG;
void main(void)
{
*WDCR=0X6F;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 關閉看門狗 */
*SCSR1=0x83fe; /* DSP運行頻率30m */
uWork=(*MCRC);
uWork&=0x0ff03;
(*MCRC)=uWork;
asm(" setc INTM");
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
*IMR=0X0010;
*IFR=0XFFFF;
CAN_FLAG=0X00; /*清用戶標志,CAN_FLAG=0X01表示接收到數據*/
CAN_INIT();
asm(" clrc INTM");
LED_init() ;
for(;;)
{
*CANTCR=0X20; //MBX3請求發送
while(*CANTCR&0X2000==0) //等待發送應答
continue;
*CANTCR=0X2000;//清TA3和MIF3標志位
while(CAN_FLAG==0)
continue;
CAN_FLAG=0; //清接收標志
*CANMDER=0X0000; //郵箱不使能
*CANMCR=0X0140; //CDR=1,數據改變請求
Max_SEND(0x100+(*CANMBX2A&0X00FF));
delay_nus(50000);
*CANMBX3A=*CANMBX2A+1; //郵箱2中底數據加1用來更新郵箱3中底數據
*CANMBX3B=*CANMBX2B+1;
*CANMBX3C=*CANMBX2C+1;
*CANMBX3D=*CANMBX2D+1;
*CANMCR=0X04C0; //DBO=1,CDR=0,ABO=1,STM=1
*CANMDER=0X04C; //ME2=ME3=1,MBX2接收,MBX3發送
}
}
void CAN_INIT(void)
{
*MCRB=*MCRB|0X0C0; //設置IOPC6,IOPC7為CANRX,CANTX
*CANIFR=0XFFFF; //清所有CAN中斷標志
*CANLAM1H=0X7FFF; //設置郵箱2、3的屏蔽ID寄存器
*CANLAM1L=0XFFFF;
*CANMCR=0X1040; //CCR=1改變配置請求
while (*CANGSR&0X0010==0)
continue;
*CANBCR2=0X01; //波特率預分頻寄存器
*CANBCR1=0X033; //波特率設置為1M
*CANMCR=*CANMCR&0XEFFF; //CCR=0,改變配置結束請求
while(*CANGSR&0X0010!=0)
continue; //只有CEE=0時,BCR2和BCR1配置成功
*CANMDER=0X040; //CDR=1 數據區改變請求
*CANMCR=0X0143; //設置郵箱2的控制字及ID
*CANMSGID2H=0X2447;
*CANMSGID2L=0XFFFF;
*CANMSGCTRL2=0X08;
*CANMBX2A=0X0000;
*CANMBX2B=0X0000;
*CANMBX2C=0X0000;
*CANMBX2D=0X0000;
*CANMSGID3H=0X2447;
*CANMSGID3L=0XFFFF;
*CANMSGCTRL3=0X08;
*CANMBX3A=0X2211;
*CANMBX3B=0X2211;
*CANMBX3C=0X2211;
*CANMBX3D=0X2211;
*CANMCR=0X04C0;
*CANMDER=0X04C;
*CANIMR=0XF7FF;
*CANIFR=0XFFFF;
}
void interrupt GRIS5(void)
{
switch(*PIVR)
{
case 64:
CANMBX_ISR();
break;
}
}
void CANMBX_ISR(void)
{
*CANRCR=0X040;
CAN_FLAG=1;
}
void watchdog(void)
{
return;
}
void delay_nus(long int n)
{
long int j;
for (j=1;j<=n;j++)
{
{
watchdog();
}
}
}
void delay_ns(long int n)
{
long int j;
for (j=1;j<=n;j++)
{
{
watchdog();
}
}
}
void Max_CS(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X1010;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X1000;
uWork&=0XFFEF;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_CLK(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X0808;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X0800;
uWork&=0XFFF7;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_DIN(int ab,int val)
{
watchdog();
uWork=(*PEDATDIR);
if (val!=0)
{
uWork|=0X0404;
(*PEDATDIR)=uWork;
delay_ns(50);
}
if(val==0)
{
uWork|=0X0400;
uWork&=0XFFFB;
(*PEDATDIR)=uWork;
delay_ns(50);
}
}
void Max_SEND(unsigned int val)
{
int i;
unsigned int tmp;
Max_CS(0,1);
Max_CLK(0,0);
Max_CS(0,1);
Max_CS(0,0);
for (i=0;i<16;i++)
{
Max_CLK(0,0);
tmp= 0x8000>>i;
Max_DIN(0,val&tmp);
Max_CLK(0,0);
Max_CLK(0,1);
}
Max_CS(0,1);
}
void dly_nus(long int n)
{
int i;
long int j;
for (j=1;j<=n;j++)
{
for (i=0;i<3;i++)
{
watchdog();
}
}
}
void LED_init(void)
{
int j;
Max_SEND(0x0F00);
Max_SEND(0x0C01);
Max_SEND(0x0A04);
Max_SEND(0x0B07);
Max_SEND(0x09FF);
Max_SEND(0x0F01);
delay_nus(10000);
Max_SEND(0x0F00);
for (j=1;j<9;j++)
{
Max_SEND(j*0x100+0x000F);
}
}
void LED_test (void)
{
int i,j;
LED_init();
while (1)
{
for (i=0;i<10;i++)
{
for (j=1;j<9;j++)
{
Max_SEND(j*0x100+i+0x0080);
delay_nus(50000);
Max_SEND(j*0x100+0x000F);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -