📄 main.c
字号:
#define SET_K1LOGIC(l) {PORTE_BIT6 = l&0x01;} // PE6配置KBUS1的逻辑
// K1功能选择(指K1~K16)(0=KBUS; 1=CAN1L; 2=SWCAN; 3=CLOSE)
#define SET_K1CFG(c) {PORTB_BIT7 = c&0x01; PORTE_BIT7 = (c>>1)&0x01;} // PB7,PE7配置K1的功能
/*******************************************************************************
* MSCAN12操作
*/
#define EXTENDED_FRAME_ID 0x7FF //11bit
/*******************************************************************************
* FUCNAME : CAN1_Open
* DESC : CAN1 打开, OBD6和OBD14接通CAN1H/L
* INPUT : void
* RETURN : void
*******************************************************************************/
void CAN1_Open(void) {
PTT_PTT7=0; // close CAN3 (SIGCAN)
MODRR = 0x01; // CAN->PM2,PM3
PTT_PTT2 = 0; // (PT2=0) >> PhotoMOS ON : CAN1H->OBD6;
SET_K1CFG(1); // K1~16功能设置为CAN1L
SET_K1PORT(9); // Select K1 Port 9 OBD14
}
/*******************************************************************************
* FUCNAME : CAN2_Open
* DESC : CAN2 打开, OBD3和OBD11接通CAN2H/L
* INPUT : void
* RETURN : void
*******************************************************************************/
void CAN2_Open() {
PTT_PTT7=0; // close CAN3 (SIGCAN)
MODRR = 0x02; // CAN->PM4,PM5
PTT_PTT1 = 0; //
PTT_PTT3 = 0; // (PT1=0;PT3=0) >> PhotoMOS ON : CAN2H->OBD3; CAN2L->OBD11
}
/*******************************************************************************
* FUCNAME : CAN3_Open
* DESC : CAN3 打开, 单线CAN
* INPUT : void
* RETURN : void
*******************************************************************************/
void CAN3_Open() {
PTT_PTT7=1; // open CAN3 (SIGCAN)
MODRR = 0x03; // CAN->PJ6,PJ7
SET_K1CFG(2); // K1~16功能设置为SIGCAN
//SET_K1PORT(7); // Select K1 Port
}
/*******************************************************************************
* FUCNAME : CAN_Close
* DESC : CAN 关闭所有, 切断所有CAN端口
* INPUT : void
* RETURN : void
*******************************************************************************/
void CAN_Close() {
PTT_PTT2 = 1; // (PT2=1) >> PhotoMOS OFF : CAN1H->OBD6;
PTT_PTT1 = 1;
PTT_PTT3 = 1; // (PT1=1;PT3=1) >> PhotoMOS OFF : CAN2H->OBD3; CAN2L->OBD11
PTT_PTT7 = 0; // close CAN3 (SIGCAN)
SET_K1CFG(3); // K1~16功能设置为NC
SET_K1PORT(3); // Select K1 Port 3 OBD7
}
/*******************************************************************************
* FUCNAME : Can_FormatId
* DESC : CAN ID 格式化为CAN0TXIDR0~3所定义的格式,支持标准ID和扩展ID
* INPUT : msg, 4字节ID
* RETURN : 格式化后的4字节ID,可以直接写入ID寄存器.
*******************************************************************************/
dword Can_FormatId(dword msg)
{
dword ID;
//
if (msg <= EXTENDED_FRAME_ID) // Is it the standard frame?
ID = msg << 21; //st_frame
else
ID = ((msg << 1) & 0x0007FFFF) | ((msg << 3) & 0xFFE00000) | 0x00080000;//ex_frame
return ID;
}
//CAN波特率
int CanBaudList[33]= {
0x0014, 0x001c, 0x031c, 0x311c, \
0x8023, 0x80d8, 0x81fa, 0x83fa \
};
int CurCanBaud=0x001c; // 500K/CIA
/*******************************************************************************
* FUCNAME : CAN_Init
* DESC : CAN控制器初始化
* INPUT : baud, 波特率
* RETURN : void
*******************************************************************************/
void CAN_Init(int baud)
{
int i;
//SCI1CR2 &= ~(SCI1CR2_RIE_MASK | SCI1CR2_RE_MASK);
SCI0_Puts("\n CAN TEST");
// CAN2_Open();
//init CAN
SCI0_Puts("\n CAN0 Initialization");
CAN0CTL1_CANE =1; // MSCAN ENABLE
CAN0CTL0_INITRQ =1; // MSCAN 软复位开始
while(!CAN0CTL1_INITAK); // 等待INITAK=1
CAN0CTL1_CLKSRC = 0; // Select the clock source from crystal:8mhz
*(word *)&CAN0BTR0 = baud;// 波特率 1M: CIA=0x0014 ; !CIA=0x8023
printf(" Baud = %04x", baud);
CAN0CTL1_LISTEN=0; // 非侦听
CAN0IDAC_IDAM=0; // 验收过滤器工作方式:2个32位过滤器 // wmj
*(dword *)&CAN0IDAR0 = 0x01f000000; // 验收寄存器
*(dword *)&CAN0IDMR0 = 0x0f0ffffff; // 验收屏蔽寄存器,
SCI0_Puts("\n Start device");
CAN0CTL0_INITRQ = 0; // MSCAN 软复位结束
while(CAN0CTL1_INITAK); // 等待INITAK=0
while(!CAN0CTL0_SYNCH); // Wait for synchronization
CAN0RFLG |= 0xFE; // 清零CAN0RFLG的bit7~bit1
CAN0RIER = 0x00; // disable all CAN interrupts
//INT_HIGHT(0xB2); // CAN0接收中断置优先级最高
Delay_1ms(1);
}
/*******************************************************************************
* FUCNAME : CAN_Send
* DESC : CAN发送一帧数据
* INPUT : id, 发送ID
p, 发送数据
* RETURN : void
*******************************************************************************/
void CAN_Send(word id, byte *p) {
int i;
// 发送
SCI0_Puts("\n Send data...");
printf(" id = %04x", id);
while(!(CAN0TFLG & 1)); // Is the transmit buffer empty? 1=empty!
CAN0TBSEL = CAN0TFLG; // CAN0发送缓冲区选择
*(dword *)&CAN0TXIDR0=Can_FormatId(id); // 发送ID
for (i=0;i<8;i++)
{
*((byte *)&CAN0TXDSR0 + i) = *(p+i);
}
CAN0TXIDR1_IDE = 0; // Standard Frame;
CAN0TXIDR3_RTR = 0; // 0, 数据帧; 1, 远程帧;
CAN0TXIDR1_SRR = 0; // 此位只在扩展帧时需要设置
//
CAN0TXDLR = 0x08; // 数据长度寄存器 max frame lenth
CAN0TXTBPR = 0; // Set the priority (high)
CAN0TFLG = CAN0TBSEL; // 清除TXEn标志, Start transmission
SCI0_Puts("\n Send end...");
Delay_1ms(1);
}
/*******************************************************************************
* CAN控制器软复位
*/
void CAN_Rst(void)
{
CAN0CTL0_INITRQ = 1; // Disable device
while(!CAN0CTL1_INITAK); // Wait for device initialization acknowledge
CAN0CTL0_INITRQ = 0; // Start device
while(CAN0CTL1_INITAK); // Wait for device initialization acknowledge
// while(!CAN0CTL0_SYNCH); // Wait for synchronization
CAN0RFLG |= 0xFE; // Reset error flags
// CAN0RIER = 0xFF; // Enable interrupts
// CAN0RIER = 0x3D; // Enable interrupts
CAN0RIER = 0x29; // Enable interrupts
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 37 void CANerr_ISR(void) //需要完善 2006-10-5 10:21
{
if((CAN0RFLG &0x28)==0x28){
CAN0TARQ=0;
CAN_Rst();
}
CAN0RFLG |= 0xFE; // Reset error flags
}
byte CanRxBuf[16];
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 38 void CANrx_ISR(void)
{
dword Back_ID,Frame_len, *pt;
byte i,temp;
Back_ID = *(dword *)&CAN0RXIDR0;
if (CAN0RXIDR1_IDE){ // extended frame
if(0x00!=CAN0RXIDR3_RTR){CAN0RFLG_RXF = 1;return;} //no Is frame "data frame"
}
else { // standard frame
if(0x00!=CAN0RXIDR1_SRR){CAN0RFLG_RXF = 1;return;} //no Is frame "data frame"
}
Frame_len=CAN0RXDLR;
i=0;
CanRxBuf[i++]=CAN0RXDSR0;
CanRxBuf[i++]=CAN0RXDSR1;
CanRxBuf[i++]=CAN0RXDSR2;
CanRxBuf[i++]=CAN0RXDSR3;
CanRxBuf[i++]=CAN0RXDSR4;
CanRxBuf[i++]=CAN0RXDSR5;
CanRxBuf[i++]=CAN0RXDSR6;
CanRxBuf[i++]=CAN0RXDSR7;
CAN0RFLG_RXF = 1; // Reset the reception complete flag
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 39 void CANtx_ISR(void)
{
// CAN0TIER =0;
}
/*******************************************************************************
* 测试main
*/
void main(void) {
int i;
word val;
char key;
byte *m, vol;
long long t;
int v1=0, v2=0, c1=0, p=0, l=0, b=0, j1, k1, m1;
i=sizeof(t);
DisableInterrupts;
PORT_Init();
PLL_Init();
RTI_Init();
TimeInit();
PWM_Init(0);
for(i=0;i<3;i++) {
PORTAB=0x0000;
DELAY_1MS(200);
PORTAB=0xffff;
DELAY_1MS(200);
}
SCI0_Init();
m = (byte *)malloc(10);
printf("\n %04x", m);
for(i=0;i<10;i++) {
*m++=(byte)i;
}
free(m);
printf("\n %04x", m);
printf("\n printf 0x%08x", (dword)0xf0f0f0f0);
CL:
SCI0_Puts("\n******************************");
SCI0_Puts("\n9S12TEST @ AUTOSCAN");
SCI0_Puts("\n******************************");
SCI0_Puts("\nTEST list:");
SCI0_Puts("\n [1]:K1 Voltage;");
SCI0_Puts("\n [2]:K2 Voltage;");
SCI0_Puts("\n [3]:K1 Port;");
SCI0_Puts("\n [4]:K1 Config;");
SCI0_Puts("\n [l]:K1 Logic;");
SCI0_Puts("\n [s]:KBUS Send;");
SCI0_Puts("\n [5]:CAN Baudrate;");
SCI0_Puts("\n [a]:CAN1 Open;");
SCI0_Puts("\n [b]:CAN2 Open;");
SCI0_Puts("\n [c]:CAN Send;");
SCI0_Puts("\n [d]:CAN Reset;");
SCI0_Puts("\n [e]:ECLK_PWM Start;");
SCI0_Puts("\n [f]:ECLK_PWM Stop;");
SCI0_Puts("\n [g]:CAN All Close;");
SCI0_Puts("\n [p]:J1850 PWM Test;");
SCI0_Puts("\n [j]:PWM Open/Close;");
SCI0_Puts("\n [v]:J1850 VPW Test;");
SCI0_Puts("\n [k]:VPW Open/Close;");
SCI0_Puts("\n [x]:X931X Test;");
while(1) {
key = SCI0_Getc();
switch(key)
{
case '1':
if(v1>3) {
v1 = 0;
}
if(v1==0) {
SCI0_Puts("\nVDDK1 = NO PUP");
} else if(v1==1) {
SCI0_Puts("\nVDDK1 = 5V");
} else if(v1==2) {
SCI0_Puts("\nVDDK1 = 12V");
} else if(v1==3) {
SCI0_Puts("\nVDDK1 = NO PUP");
}
SET_VDDK1(v1);
v1++;
break;
case '2':
if(v2>3) {
v2 = 0;
}
if(v2==0) {
SCI0_Puts("\nVDDK2 = NO PUP");
} else if(v2==1) {
SCI0_Puts("\nVDDK2 = 5V");
} else if(v2==2) {
SCI0_Puts("\nVDDK2 = 12V");
} else if(v2==3) {
SCI0_Puts("\nVDDK2 = NO PUP");
}
SET_VDDK2(v2);
v2++;
break;
case '3':
if(p>15) {
p=0;
}
printf("\nK1PORT = %02x", p);
SET_K1PORT(p);
p++;
break;
case '4':
if(c1>3) {
c1 = 0;
}
if(c1==0) {
SCI0_Puts("\n K1_CFG = K1_EN");
} else if(c1==1) {
SCI0_Puts("\n K1_CFG = CAN1L_EN");
} else if(c1==2) {
SCI0_Puts("\n K1_CFG = SWCAN_EN");
} else if(c1==3) {
SCI0_Puts("\n K1_CFG = N.C.");
}
SET_K1CFG(c1);
c1++;
break;
case 'l':
if(l&0x01) {
SCI0_Puts("\nK1 Logic +");
}
else {
SCI0_Puts("\nK1 Logic -");
}
SET_K1LOGIC(l);
l++;
break;
case 's':
SCI0_Puts("\nKBUS SEND");
SCI1_Init();
for(i=0; i<8; i++) {
SCI1_Putc(sendbytebuf[i]);
}
break;
case '5':
if(b>8) {
b=0;
}
CurCanBaud=CanBaudList[b];
printf("\nCan baud = 0x%04x", CurCanBaud);
CAN_Init(CurCanBaud);
b++;
break;
case 'a':
SCI0_Puts("\n CAN1 OPEN");
CAN1_Open();
break;
case 'b':
SCI0_Puts("\n CAN2 OPEN");
CAN2_Open();
break;
case 'c':
CAN_Init(CurCanBaud);
SCI0_Puts("\n CAN SEND");
CAN_Send(0x200, sendbytebuf);
break;
case 'd':
CAN_Rst();
break;
case 'g':
CAN_Close();
break;
case 'e':
SCI0_Puts("\n PWM ECLK START!");
PWM3_153K(155,(155-1)/2); // 155 = 153.6k
break;
case 'f':
SCI0_Puts("\n PWM ECLK STOP!");
PWM3_153K(0,0); // stop
break;
case 'p':
J1850_PwmTest();
break;
case 'v':
J1850_VpwTest();
break;
case 'j':
if(j1&0x01) {
SCI0_Puts("\n PWM Open");
PWM_OPEN();
}
else {
SCI0_Puts("\n PWM Close");
PWM_CLOSE();
}
j1++;
break;
case 'k':
if(k1&0x01) {
SCI0_Puts("\n VPW Open");
VPW_OPEN();
}
else {
SCI0_Puts("\n VPW Close");
VPW_CLOSE();
}
k1++;
break;
case 'm':
if(m1&0x01) {
SCI0_Puts("\n PWM TX = 1");
PTP_PTP0 = 1;
}
else {
SCI0_Puts("\n PWM TX = 0");
PTP_PTP0 = 0;
}
m1++;
break;
case 'x':
SCI0_Puts("\n X931X Test");
while(1) {
SCI0_Puts("\n[0]:set; [u]:up; [d]:down; [s]:store; [esc]:exit");
key = SCI0_Getc();
if(key==0x1b)
break;
switch(key)
{
case '0':
X931X_Set(99);
break;
case 'u':
X931X_Up();
break;
case 'd':
X931X_Down();
break;
case 's':
X931X_Store();
break;
case 'r':
val = ATD_Read(6);
SCI0_Puts("\nREF_K A/D read:");
printf("\n %04x", val);
break;
default:
break;
}
}
break;
case 'h':
goto CL;
break;
default:
SCI0_Puts("\n Error command! Press [h] for help");
break;
}
}
/* put your own code here */
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -