#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#define LEDCPU PTBD_PTBD1
#define LEDCPU_dir PTBDD_PTBDD1
#define LED_ON 0
#define LED_OFF 1
#define BUZZ PTED_PTED5
#define BUZZ_dir PTEDD_PTEDD5
#define BIT(A,B) ((A>>B)&0x01) // A ?a㊣?芍?
// B ㊣赤那?A?D米?米迆????
#define ID 0x30 // ID3??米?a0x30
#define EN PTED_PTED2 //LIN那1?邦
#define EN_dir PTEDD_PTEDD2
Bool a;
struct message {
unsigned char identifier;
unsigned char data[8];
};
struct message msg_send;
// ?“辰?LIN℅∩足?
enum lin_state { IDLE, _BREAK, SYNCH, PROTECTED_IDENTIFIER, DATA0, DATA1,
DATA2, DATA3, DATA4, DATA5, DATA6, DATA7, CHECKSUM };
// ?“辰????芍11足?
struct frame {
unsigned char protected_id;
unsigned char data[8];
unsigned char check;
enum lin_state state;
unsigned char error;
};
struct frame frame_send;
/*************************************************************/
/* 3?那??‘℅邦??那㊣?車 */
/* 赤a2??∫???米?那?a8MHz㏒?℅邦???米?那8MHz */
/*************************************************************/
void INIT_MCG(void)
{
MCGC2=0x76;
while(!MCGSC_OSCINIT);
MCGC1=0xb8;
while(MCGSC_IREFST);
while(MCGSC_CLKST!=0b10);
MCGC2_LP = 1;
MCGC1 = 0x98;
MCGC3 = 0x44;
MCGC2_LP = 0;
while(!MCGSC_PLLST);
while(!MCGSC_LOCK);
MCGC1 = 0x10;
while(MCGSC_CLKST!=0b11);
}
/*************************************************************/
/* 3?那??‘?∩??1﹞ */
/*************************************************************/
void init_cop(void) {
SOPT1 = 0x00; // 1??∩??1﹞
}
/*************************************************************/
/* 3?那??‘LIN */
/*************************************************************/
void INIT_LIN(void)
{
unsigned char i;
SCI1BDH = 0x00;
SCI1BDL = 0x34; //谷豕??SCI12“足??那?a9600
SCI1C1 = 0x00; //谷豕??SCI1?a?y3㏒?㏒那?㏒?∼???那y?Y??㏒??T????D㏒?谷
SCI1C2 = 0x2c; //?那D赤?車那?o赤﹞⊿?赤那y?Y㏒??那D赤?車那??D??1|?邦
SCI1S2_BRK13 = 1;
frame_send.protected_id=0;
frame_send.state=IDLE;
frame_send.error=0;
frame_send.check=0;
for (i=0;i<8;i++)
frame_send.data[i]=0;
}
/*************************************************************/
/* ?車那㊣o‘那y */
/*************************************************************/
void delay(void)
{
unsigned int i;
for(i=0;i<50000;i++);
}
/*************************************************************/
/* ????????D㏒?谷?? */
/*************************************************************/
unsigned char LINCalcParity(unsigned char id)
{
unsigned char parity, p0,p1;
parity=id;
p0=(BIT(parity,0)^BIT(parity,1)^BIT(parity,2)^BIT(parity,4))<<6; //??D㏒?谷??
p1=(!(BIT(parity,1)^BIT(parity,3)^BIT(parity,4)^BIT(parity,5)))<<7; //??D㏒?谷??
parity|=(p0|p1);
return parity;
}
/*************************************************************/
/* ????o赤D㏒?谷?? */
/*************************************************************/
unsigned char LINCalcChecksum(unsigned char *data)
{
unsigned int sum = 0;
unsigned char i;
for(i = 0; i < 8; i++)
{
sum += data[i];
if(sum&0xFF00)
sum = (sum&0x00FF) + 1;
}
sum ^= 0x00FF;
return (unsigned char)sum;
}
/*************************************************************/
/* ﹞⊿?赤?足2ao‘那y */
/*************************************************************/
Bool LINCheckSend(enum lin_state status, unsigned char val)
{
// 米豕∩y∩??迆那y?Y?車那?米??a?1
while(frame_send.state < status)
if(frame_send.error)
return(FALSE);
switch(status)
{
case _BREAK:
case SYNCH:
break;
case PROTECTED_IDENTIFIER:
if(frame_send.protected_id != val)
return(FALSE);
break;
case DATA0:
case DATA1:
case DATA2:
case DATA3:
case DATA4:
case DATA5:
case DATA6:
case DATA7:
if(frame_send.data[status-DATA0] != val)
return(FALSE);
break;
case CHECKSUM:
if(frame_send.check != val)
return(FALSE);
break;
}
return(TRUE);
}
/*************************************************************/
/* LIN﹞⊿?赤℅??迆o‘那y */
/*************************************************************/
Bool LINSendChar(unsigned char ch)
{
while(!SCI1S1_TDRE); //米豕∩y﹞⊿?赤那y?Y??∩??‾㏒“?o3??‾㏒??a??
SCI1D = ch;
return(TRUE);
}
/*************************************************************/
/* LIN﹞⊿?赤????3? */
/*************************************************************/
Bool LINSendbreak(void)
{
while(!SCI1S1_TDRE); //米豕∩y﹞⊿?赤那y?Y??∩??‾㏒“?o3??‾㏒??a??
SCI1C2_SBK = 1; //?車芍D∩y﹞⊿?赤米??D?1℅?﹞?
SCI1C2_SBK = 0; //﹞米???y3㏒﹞⊿?赤2迄℅‾
return(TRUE);
}
/*************************************************************/
/* LIN﹞⊿?赤D??⊿o‘那y */
/*************************************************************/
Bool LINSendMsg(void)
{
unsigned char check_sum, parity_id, i;
frame_send.error = 0;
// ﹞⊿?赤????3?
if(!LINSendbreak())
return(FALSE);
// ?足2谷????3?﹞⊿?赤
if(!LINCheckSend(_BREAK,0x00))
return(FALSE);
// ﹞⊿?赤赤?2?3?
if(!LINSendChar(0x55))
return(FALSE);
// ?足2谷赤?2?3?﹞⊿?赤
if(!LINCheckSend(SYNCH,0x55))
return(FALSE);
// ????????D㏒?谷
parity_id=LINCalcParity(msg_send.identifier);
// ﹞⊿?赤㊣那那?﹞?3?
if(!LINSendChar(parity_id))
return(FALSE);
// ?足2谷㊣那那?﹞?3?﹞⊿?赤
if(!LINCheckSend(PROTECTED_IDENTIFIER, parity_id))
return(FALSE);
for(i=0; i < 8; i++)
{
// ﹞⊿?赤那y?Y3?
if(!LINSendChar(msg_send.data[i]))
return(FALSE);
// ?足2谷那y?Y3?﹞⊿?赤
if(!LINCheckSend(DATA0+i, msg_send.data[i]))
return(FALSE);
}
check_sum = LINCalcChecksum(msg_send.data);
// ﹞⊿?赤D㏒?谷o赤3?
if(!LINSendChar(check_sum))
return(FALSE);
// ?足2谷D㏒?谷o赤3?﹞⊿?赤
if(!LINCheckSend(CHECKSUM, check_sum))
return(FALSE);
frame_send.state = IDLE;
return(TRUE);
}
/*************************************************************/
/* LIN?車那?℅??迆o‘那y */
/*************************************************************/
Bool LINGetChar(void)
{
unsigned volatile char ch;
// LIN?車那?赤“米角℅∩足?
switch(frame_send.state)
{
case IDLE:
if(!(SCI1S1&0x22))
return(FALSE);
if(SCI1D)
return(FALSE);
break;
case _BREAK:
if(!(SCI1S1&0x20))
return(FALSE);
if(SCI1D != 0x55)
return(FALSE);
break;
case SYNCH:
if(!(SCI1S1&0x20))
return(FALSE);
ch = SCI1D;
frame_send.protected_id = ch;
break;
case PROTECTED_IDENTIFIER:
case DATA0:
case DATA1:
case DATA2:
case DATA3:
case DATA4:
case DATA5:
case DATA6:
if(!(SCI1S1&0x20))
return(FALSE);
ch = SCI1D;
fra