📄 uart_can.c
字号:
cmd[cnt]=pwk->pRXD[Pr];
if(cnt==4){
if(strncmp((char*)cmd,"$BAUD",5)==0){
state='B';
CN=7;
STAT=2;
}
else if(strncmp((char*)cmd,"$IDER",5)==0){
state='I';
CN=12;
STAT=2;
}
else if(strncmp((char*)cmd,"$DATA",5)==0){
state='D';
CN=13;
STAT=2;
}
else STAT=0;
}break;
case 2:
switch(state){
case 'B':
cmd[cnt]=pwk->pRXD[Pr];
if(cnt==(CN-1)) {
baud[0]=cmd[5];
baud[1]=cmd[6];
start_CAN ();
STAT=0;
}break;
case 'I':
cmd[cnt]=pwk->pRXD[Pr];
if(cnt==(CN-1)){
if((cmd[5]=='S')&&(cmd[6]=='T')&&(cmd[7]=='D'))XTD='S';
else if((cmd[5]=='E')&&(cmd[6]=='X')&&(cmd[7]=='T'))XTD='E';
else STAT=0;
switch(XTD){
case 'S':
STDID=cmd[8];
init_msg_object_TX_STD (0x02);
STAT=0;
break;
case 'E':
tcflong.bytek.hi1=cmd[8];
tcflong.bytek.hi0=cmd[9];
tcflong.bytek.low1=cmd[10];
tcflong.bytek.low0=cmd[11];
temp=tcflong.ID>>3;
temp|=0xE0000000;
tcflong.ID=temp;
init_msg_object_TX_EXT (0x01);
STAT=0;
break;
default :STAT=0;
}
}break;
case 'D':
cmd[cnt]=pwk->pRXD[Pr];
if(cnt==(CN-1)){
for(i=0;i<8;i++)
datas[i]=cmd[i+5];
transmit_ON(0x01);
STAT=0;
}break;
default: STAT=0;
}break;
}
cnt++;
Pr++;
Pr&=pwk->RXDS;
}
pwk->RXDR=Pr;
}
////////////////////////////////////////////////////////////////////////////////
//uart0中断服务程序
////////////////////////////////////////////////////////////////////////////////
void ISR_UART0 (void) interrupt 4
{
static struct TPWK *pwk;
char SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
if(RI0==0) goto END;
ES0=0;
pwk=&PWK;
Pr=pwk->RXDR;
Pw=pwk->RXDW;
pwk->pRXD[Pw]=SBUF0;
RI0=0;
Pw++;
Pw&=pwk->RXDS;
if(Pr!=Pw)pwk->RXDW=Pw;
/* //DPJ TO PC
for(i=0;i<12;i++)
{
SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
TI0=0;
SBUF0=SBUFFER[i];
while(TI0==0)
{
}
SFRPAGE = SFRPAGE_SAVE;
TI0=0;
i++;
}
*/
END: SFRPAGE = SFRPAGE_SAVE;
ES0=1;
// PS=1;
}
////////////////////////////////////////////////////////////////////////////////
//CAN Functions
//Clear Message Objects??????????????
////////////////////////////////////////////////////////////////////////////////
void clear_msg_objects (void)
{
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; // Point to Command Mask Register 1
CAN0DATL = 0xFF; // Set direction to WRITE all IF registers to Msg Obj
for (i=1;i<33;i++)
{
/*一旦CPU把一个message number写到IF1CMDRQST, 一次message transfer就开始了
因为IF1CMDMSK设置成了WRITE, 所以这里的message transfer是将Message
Buffer(IF1 DATA A1, A2)的数据传到Message Object*/
CAN0ADR = IF1CMDRQST; // Write blank (reset) IF registers to each msg obj
CAN0DATL = i;
}
}
////////////////////////////////////////////////////////////////////////////////
//Initialize Message Object for extended frame TX
////////////////////////////////////////////////////////////////////////////////
void init_msg_object_TX_EXT (char MsgNum)
{
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK; // Point to Command Mask 1
CAN0DAT = 0x00B2; // Set to WRITE, & alter all Msg Obj except ID MASK bits
//CAN0DAT = 0x00B7; // Set to WRITE, & alter all Msg Obj except ID MASK bits
CAN0ADR = IF1ARB1; // Point to arbitration1 register
CAN0DATH = tcflong.bytek.low1;
CAN0DATL = tcflong.bytek.low0;
CAN0ADR = IF1ARB2;
CAN0DATH = tcflong.bytek.hi1;
CAN0DATL = tcflong.bytek.hi0;
/***********************************
CAN0DAT = 0x7FE0; // Set arbitration1 ID to highest priority
CAN0DAT = 0xE040; // Autoincrement to Arb2 high byte:
// Set MsgVal bit, extended ID, Dir = WRITE
//发送ID号为:0203FF
*********************************************/
CAN0DAT = 0x0088; // Msg Cntrl: DLC = 8, remote frame function not enabled
CAN0ADR = IF1CMDRQST; // Point to Command Request reg.
CAN0DAT = MsgNum; // Select Msg Obj passed into function parameter list
// --initiates write to Msg Obj
// 3-6 CAN clock cycles to move IF reg contents to the Msg Obj in CAN RAM.
SFRPAGE = old_SFRPAGE;
}
////////////////////////////////////////////////////////////////////////////////
//Initialize Message Object for standard frame TX
////////////////////////////////////////////////////////////////////////////////
void init_msg_object_TX_STD (char MsgNum)
{
char old_SFRPAGE;
unsigned int temp = 0;
old_SFRPAGE = SFRPAGE;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DATL = 0xBB;
CAN0ADR = IF1ARB1;
CAN0DAT = 0x0010; //ARBITRATION1
CAN0ADR = IF1ARB2;
temp=STDID<<2;//标准id为ID28-ID18,所以要左移2位
temp &=0x1FFF;
temp|=0xA000;
CAN0DAT = temp; //地址自增,指向IF1 Arbitration Registers2
CAN0DAT = 0x0088; //发送8个字节Message control register
//LOST
CAN0ADR = IF1CMDRQST;
CAN0DAT = MsgNum;
/*IF1 Command Request Registers=MsgNum,将以上配置写入MsgNum号消息*/
SFRPAGE = old_SFRPAGE;
}
////////////////////////////////////////////////////////////////////////////////
//Start CAN
////////////////////////////////////////////////////////////////////////////////
void start_CAN (void)
{
char old_SFRPAGE;
old_SFRPAGE = SFRPAGE;
SFRPAGE = CAN0_PAGE;
CAN0CN |= 0x41;
CAN0ADR = BITREG;
// CAN0DAT = 0x5EC1; //bit rate,250K,5EC1
CAN0DATH=baud[0];
CAN0DATL=baud[1];
//其他的控制位,如MASK,ARB AND SO ON我已写入,这次只写TxRqst和Data
CAN0ADR = IF1CMDMSK; // Point to Command Mask 1
CAN0DAT = 0x0087; // Config for TX : WRITE to CAN RAM, write data bytes,
// set TXrqst/NewDat, clr IntPnd
// RX-IF2 operation may interrupt TX-IF1 operation
CAN0ADR = IF2CMDMSK; // Point to Command Mask 2
//CONTROL有啥用?
CAN0DATL = 0x1F; // Config for RX : READ CAN RAM, read data bytes,
//为什么要2个都置中断,一个不行
CAN0CN &= ~0x41;
CAN0CN = 0x02; // Global Int. Enable IE
SFRPAGE = old_SFRPAGE;
}
////////////////////////////////////////////////////////////////////////////////
//Transmit CAN frame to turn other node's LED ON
////////////////////////////////////////////////////////////////////////////////
void transmit_ON (char MsgNum)
{
int j;
SFRPAGE = CAN0_PAGE; // IF1 already set up for TX
CAN0ADR = IF1CMDMSK; // Point to Command Mask 1
CAN0DAT = 0x0087; // Config to WRITE to CAN RAM, write data bytes,
// set TXrqst/NewDat, Clr IntPnd
CAN0ADR = IF1DATA1; // Point to 1st byte of Data Field
for(j=1;j<8;j++)
{
CAN0DATH = datas[j]; //IF1DATA1
CAN0DATL = datas[j-1]; //IF1DATA2,顺序为00 01 02 03
j++;
};
CAN0ADR = IF1CMDRQST; // Point to Command Request Reg.
CAN0DATL = MsgNum; // Move new data for TX to Msg Obj "MsgNum"
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -