📄 myuart.c
字号:
#include <ADuC7026.h>
#include <sja1000.h>
#define uchar unsigned char
uchar iRecData[10];
uchar flagdata=0;
uchar dlc;
void Delay(int);
void Reset();
void rsvmessage();
void sendmessage(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar);
void Init()
{
GP1CON=0x11;
GP2CON=0x22222222;
GP3CON=0x22222222;
GP4CON=0x22222222;
XMCFG = 0x01;
XM0CON = 0x01;
XM0PAR = 0x70FF;
COMCON0=0x080;
COMDIV0=0x088;
COMDIV1=0x000;
COMCON0=0x007;
Reset();
Delay(2000);
while((reg_CR&0x01)==0x00) //进入复位模式
{
reg_CR=reg_CR|0x01;
}
reg_CDR=0x41; //时钟分频寄存器,控制CLKOUT的输出频率,BASIC模式,CLKOUT输出fosc/2
reg_AMR=0xF0; //验收屏蔽寄存器,全部屏蔽
reg_ACR=0x07; //验收代码寄存器,与报文标志码的高8位相等
reg_BTR0=0x80; //总线时序寄存器0,系统的时钟周期Tscl是2Tclk同步跳转宽度3Tscl
reg_BTR1=0xFA; //总线时序寄存器1,总线采样3次,时间段1=11Tscl,时间段2=8Tscl
reg_OCR=0x1A;
while((reg_CR&0x01)==0x01)
{
reg_CR=reg_CR&0x00;
reg_CR=reg_CR|0x1E;
}
}
void Delay(int dly)
{
int j;
for(;dly>0;dly--)
for(j=0;j<50;j++){};
}
/****************************************sja1000软件复位************************************/
void Reset()
{
GP0DAT=0x02000000;
Delay(2000);
GP0DAT=0x02020000;
}
void sendmessage(uchar a0,uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6,uchar a7,uchar a8,uchar a9)
{
uchar len=0;
while(reg_SR&0X10);
while((reg_SR&0X08)==0);
while((reg_SR&0X04)==0);
reg_Sendone=a0;
reg_Sendtwo=a1;
len=a1&0x0f;
switch(len)
{
case 0x00: break;
case 0x01: reg_Senddata1=a2;break;
case 0x02: reg_Senddata1=a2;reg_Senddata2=a3;break;
case 0x03: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;break;
case 0x04: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;break;
case 0x05: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;break;
case 0x06: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;break;
case 0x07: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;break;
case 0x08: reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;reg_Senddata8=a9;break;
default: reg_Sendtwo=reg_Sendtwo&0xe8;reg_Senddata1=a2;reg_Senddata2=a3;reg_Senddata3=a4;reg_Senddata4=a5;reg_Senddata5=a6;reg_Senddata6=a7;reg_Senddata7=a8;reg_Senddata8=a9;break;
}
reg_CMR=0X01;
}
void rsvmessage()
{
uchar i;
uchar flag_IR;
if(reg_SR&0x03)
{
flag_IR=reg_IR;
if(flag_IR&0x01)
{
do{}while(reg_SR&0x10);
iRecData[0]=reg_Rsvone;
iRecData[1]=reg_Rsvtwo;
dlc=iRecData[1]&0x0f;
for(i=0;i<dlc;i++)
{
iRecData[i+2]=*(®_Rsvdata1+i);
}
reg_CMR=0x04;
flagdata=1;
}
else
{
if(reg_SR&0x02) reg_CMR=0x0c;
}
}
}
uchar hex2ascii(uchar toconv)
{
if (toconv<0x0A)
{
toconv += 0x30;
}
else
{
toconv += 0x37;
}
return (toconv);
}
void senddata(uchar to_send) {
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = 0x0A; //Output LF
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = 0x0D; //Output CR
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = hex2ascii ((to_send >> 4) & 0x0F);
while(!(0x020==(COMSTA0 & 0x020))){}
COMTX = hex2ascii (to_send & 0x0F);
}
void main()
{
int k;
uchar temp1=1;
Init();
sendmessage(0x39,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x06,0x08);
Delay(1);
while(temp1)
{
rsvmessage();
if(flagdata==1)
{
sendmessage(0x38,0x08,0x01,0x02,0x03,0x04,0x05,0x06,0x06,0x06);
flagdata=0;
dlc+=2;
for(k=0;k<dlc;k++)
{
senddata(iRecData[k]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -