📄 tpublic.c
字号:
unsigned char CreateATask(unsigned char TaskNo,int MessageLimit,PVOID *Args,void *TaskFunc,unsigned char UpTaskNo,unsigned char DownTaskNo)
{
if(!Task[TaskNo].Use) // 该任务没有被占用
{
Task[TaskNo].Use=0xff;
Task[TaskNo].WaitStatus=0;
Task[TaskNo].MailQueueLimit=MessageLimit;
Task[TaskNo].MailQueueLength=0;
if(MessageLimit!=0) Task[TaskNo].WaitControl=0x20; //禁止任务运行;
else Task[TaskNo].WaitControl=0x00;
Task[TaskNo].Args=Args;
Task[TaskNo].TaskFunc=(void(*)(PVOID *))TaskFunc;
Task[TaskNo].UpTaskNo=UpTaskNo;
Task[TaskNo].DownTskNo=DownTaskNo;
return(0xff); //成功
};
return 0; //任务号被占用
}
void outbyt(unsigned char dat)
{
int i;
clrbit(&p6_dir,5); /* P6.5=SO=outport */
for(i=0;i<8;i++)
{
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
if((dat & 0x80)==0) clrbit(&p6_reg,5);
else setbit(&p6_reg,5);
dat=dat*2;
setbit(&p6_reg,4); /* P6.4=SCK setb SCK */
}
setbit(&p6_reg,5);
}
unsigned char inbyt(void)
{
unsigned char ch,p6value;
int i;
setbit(&p6_reg,5); /* P6.5作为输入口必须先置 1 */
setbit(&p6_dir,5); /* P6.5=SO=inport */
ch=0;
for(i=0;i<8;i++)
{
setbit(&p6_reg,4); /* P6.4=SCK setb SCK */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
p6value=p6_pin;
p6value=p6value & 0x20;
switch(i)
{
case 0x00:if(p6value!=0) ch=ch | 0x80;
break;
case 0x01:if(p6value!=0) ch=ch | 0x40;
break;
case 0x02:if(p6value!=0) ch=ch | 0x20;
break;
case 0x03:if(p6value!=0) ch=ch | 0x10;
break;
case 0x04:if(p6value!=0) ch=ch | 0x08;
break;
case 0x05:if(p6value!=0) ch=ch | 0x04;
break;
case 0x06:if(p6value!=0) ch=ch | 0x02;
break;
case 0x07:if(p6value!=0) ch=ch | 0x01;
break;
}
}
return ch;
}
void Wip_Poll(void)
{
int i;
unsigned char ch;
for(i=0;i<MAX_POLL;i++)
{
ch=Rdsr_Cmd();//读状态寄存器
ch=ch & 0x01;
if(ch==0) break;
}
clrbit(&p6_reg,7); /* P6.7=/WP clrb /WP */
}
void Wren_Cmd(void)//写允许命令 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
{
setbit(&p6_reg,7); /* P6.7=/WP setb /WP */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(WREN_INST); /* 设置写使能锁存器(允许写操作)*/
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
}
void Wrdi_Cmd(void)//禁止写操作 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
{
setbit(&p6_reg,7); /* P6.7=/WP setb /WP */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(WRDI_INST); /* 复位写使能锁存器(允许写禁止)*/
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
}
void Wrsr_Cmd(void)//写状态寄存器 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
{
setbit(&p6_reg,7); /* P6.7=/WP setb /WP */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(WRSR_INST); /* 写状态寄存器(块锁定位)*/
outbyt(STATUS_REG); /* 写状态寄存器(块锁定位)*/
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
Wip_Poll();
}
void Wrsr_Clr(void)//写状态寄存器 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
{
setbit(&p6_reg,7); /* P6.7=/WP setb /WP */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(WRSR_INST); /* 写状态寄存器(块锁定位)*/
outbyt(0x30); /* 写状态寄存器(块锁定位)*/
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
Wip_Poll();
}
unsigned char Rdsr_Cmd(void)//读状态寄存器 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
{
unsigned char ch;
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(RDSR_INST); /* 读状态寄存器 */
ch=inbyt();
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
return ch;
}
void Byte_Write(unsigned int adr,unsigned char dat)
{//写一个字节 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
unsigned char ch;
union WTEMP_ST t;
setbit(&p6_reg,7); /* P6.7=/WP setb /WP */
t.Word=adr;
ch=WRITE_INST;
if(t.B.High>0) ch=ch | 0x08; /* A8=1 */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(ch);
outbyt(t.B.Low);
outbyt(dat);
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
Wip_Poll();
}
unsigned char Byte_Read(unsigned int adr)
{//读一个字节 SCK=P6.4 SO=SI=P6.5 CS=P6.6 WP=P6.7
unsigned char ch;
union WTEMP_ST t;
t.Word=adr;
ch=READ_INST;
if(t.B.High>0) ch=ch | 0x08; /* A8=1 */
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
outbyt(ch);
outbyt(t.B.Low);
ch=inbyt();
clrbit(&p6_reg,4); /* P6.4=SCK clr SCK */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
return ch;
}
void rst_wdog(void)
{
clrbit(&p6_reg,6); /* P6.6=CS clr CS */
setbit(&p6_reg,6); /* P6.6=CS setb CS */
}
void wdog(void)
{
watchdog=0x1e;
watchdog=0xe1;
}
unsigned char init1821(void)
{
unsigned char ch,vb;
int i;
vb=0;
outportb(PSD_DIRECTION_A, 0x00); /* inport */
ch=inportb(PSD_DATAIN_A);
ch=ch | 0x02;
outportb(PSD_DIRECTION_A, 0xff); /*outport */
outportb(PSD_DATAOUT_A, ch);
ch=ch & 0xfd;
outportb(PSD_DATAOUT_A, ch);
for(i=0;i<300;i++)
{
ch=0;
}
ch=ch | 0x02;
outportb(PSD_DATAOUT_A, ch);
outportb(PSD_DIRECTION_A, 0x00); /* inport */
for(i=0;i<200;i++)
{
ch=inportb(PSD_DATAIN_A);
if((ch & 0x02)==0)
{
vb=0xff;
break;
}
}
return vb;
}
void Send00(unsigned char ch)
{
sbuf_tx=ch;
ComHandle[2]->Status=1; //txd;
}
void Send01(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM01].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send02(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM02].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send03(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM03].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send04(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM04].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send05(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM05].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send06(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM06].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send07(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM07].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void Send08(char ch)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNoCOM08].DevPtr;//设备驱动表指针
Com->Status=1; //txd;
}
void PauseSend(int TaskNo)
{
Task[TaskNo].WaitControl &=0xfe;
}
void StopTxd(int TaskNo) //暂停发送
{
disable();
Task[TaskNo].WaitControl &=0xfe;
Task[TaskNo].WaitStatus &=0xfe;
enable();
}
void ChangeProWarn(int TaskNo,char Txd,char ProWarnNum)
{
struct TComStruct FARDATA *Com;
Com=(struct TComStruct *)Task[TaskNo].DevPtr;//设备驱动表指针
disable();
if(Txd)
{
Com->TxdProWarn=ProWarnNum;
if(Com->TxdBufLength >= ProWarnNum) Task[TaskNo].WaitStatus &=0xfe;
else Task[TaskNo].WaitStatus =0x01;
}else
{
Com->RxdProWarn=ProWarnNum;
if(Com->RxdBufLength < ProWarnNum) Task[TaskNo].WaitStatus &=0xfd;
else Task[TaskNo].WaitStatus =0x02;
};
enable();
}
void WatchDogCom00(struct TComStruct FARDATA *ComHandle)
{
// struct TIEC101LinkStruct FARDATA *arg;
// ResetTimer(TaskNoCOM00);
// arg=(struct TIEC101LinkStruct FARDATA *)Task[Task[TaskNoCOM00].UpTaskNo].Args;
// if(TaskStatus(TaskNoCOM00) & 0x02) IEC101LinkRx(arg);// Rx Task
// if(TaskStatus(TaskNoCOM00) & 0x01) IEC101LinkTx(arg);// Tx Task
}
void DeviceCom00(struct TComStruct FARDATA *ComHandle)
{
sp_baud=0x8208; /* 2400BPS */
sp_con=0x09; /* 模式一 */
p2_reg |=0xff;
p2_dir &=0xfe; /* TXD输出 */
p2_mode |=0x03; /* P2.0 P2.1为特殊功能方式 */
ComHandle->TxdProWarn=1;
ComHandle->RxdProWarn=1;
ComHandle->ResetNum++;
// int_mask1=int_mask1 | SRXD_INT_BIT | STXD_INT_BIT;
// fft_reg[4]=0xaa;
}
void FARDATA *InitCom(unsigned char ComNo)
{
struct TComStruct FARDATA *arg;
int i,j;
arg=NULL;
switch(ComNo)
{
case 0x00:i=TaskNoCOM00;
// j=TaskNoCOM00;
arg=(struct TComStruct FARDATA *)malloc(sizeof(struct TComStruct));
// fft_reg[2]=0xaa;
if(arg!=NULL)
{
// fft_reg[3]=0xaa;
Task[i].DevPtr=(PVOID *)arg; //设备驱动表指针
Task[i].DeviceFunc=(void(*)(PVOID *))DeviceCom00;
arg->SendFunc=Send00;
arg->Status=0x02; //Wait
arg->TxdBufHead=0;
arg->TxdBufTail=0;
arg->TxdBufLength=0;
if(arg->TxdBuf) free(arg->TxdBuf);
arg->TxdBuf=(unsigned char FARDATA *)malloc(1200);
arg->TxdBufSize=256;
arg->TxdProWarn=1;
arg->RxdBufHead=0;
arg->RxdBufTail=0;
arg->RxdBufLength=0;
if(arg->RxdBuf)free(arg->RxdBuf);
arg->RxdBuf=(unsigned int FARDATA *)malloc(1200*(sizeof(int)));
arg->RxdBufSize=256;
arg->RxdProWarn=1;
arg->ResetNum=0;
Task[i].WaitControl |=0x03; //允许接收 //允许发送
CreateATask(i,10,(PVOID *)arg,WatchDogCom00,j,0xff);
SetTimer(i,0);
}
break;
default:arg=NULL;
break;
}
return (PVOID *)arg;
}
void FARDATA *CreateComProtocolTask(unsigned char TaskNo,unsigned char ProtocolType)
{
void FARDATA *arg;
arg=NULL;
switch(ProtocolType)
{
case 00://arg=(void FARDATA *)InitIEC101Link(TaskNo);
//if(arg!=NULL)//IEC101Link链路层
//{
// CreateATask(TaskNo+UPOffset,10,arg,IEC101Link,0xff,TaskNo);
// SetTimer(TaskNo+UPOffset,0);
// ChangeProWarn(TaskNo,1,1);
// ChangeProWarn(TaskNo,0,1);
/* arg=(void FARDATA *)InitIEC101User(TaskNo);
if(arg!=NULL)//IEC101User用户层
{
CreateATask(TaskNo+UPOffset+UPOffset,10,arg,IEC101User,0xff,TaskNo);
SetTimer(TaskNo+UPOffset+UPOffset,0);
} */
// }
arg=NULL;
break;
default:arg=NULL;
break;
}
return arg;
}
void CreateComTask(void)
{
void FARDATA *argx,*argy;
int i;
for(i=0;i<MAXCOMNUM;i++) /* 串行通信规约配置表 */
{
if(ComConfig[i].Use!=0)
{
argx=CreateComProtocolTask(i,ComConfig[i].Com);
if(argx!=NULL)
{
argy=InitCom(i);
if(argy==NULL)
{
// fft_reg[0]=0xaa;
free(argx);
// Task[i+UPOffset].Use=0;
}else
{
// fft_reg[1]=0xaa;
(*(Task[i].DeviceFunc))(Task[i].DevPtr);
}
}
}
}
}
unsigned char flash_boot_write_with_poll(unsigned int addr,unsigned int data)
{
register unsigned int portid;
register unsigned int value;
unsigned char done;
unsigned int error;
unsigned char err;
unsigned int poll;
done = FALSE;
err = FALSE;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0xAAAA;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // write 0xA0 command to program
value=0xA0A0;
asm st value, [portid];
portid=addr;
value=data;
asm st value, [portid]; // write word to flash
data = data & NVM_DATA_POLL; // get bit DQ7 of original data word
do // now use data polling method to verify successful write
{
asm ld value, [portid];
poll=value; // Read the location that was just programmed
error= poll & NVM_ERROR; // save timeout error bit
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (data == poll) done = TRUE; // compare data polling bit
else if (error == NVM_ERROR ) // check for timeout error
err = TRUE; // indicate timeout error occurred
rst_wdog();
}while((done == FALSE) && (err == FALSE));
if (err == TRUE) // make sure timeout error and data poll didn't
{
asm ld value, [portid]; // Read location in flash again
poll=value;
poll = poll & NVM_DATA_POLL; // get poll bit of word just read from flash
if (data==poll) done = TRUE; // compare poll bit
portid=FLASH_COMMON_BOOT_X554;
value=0xf0f0;
asm st value, [portid]; // reset the flash array (short reset instruction)
}
yktest[31]++;
return(done); // a successful flash write returns 1, timeout error returns 0
}
unsigned char flash_boot_erase_sector(unsigned int sector_erase_address)
{
unsigned char done;
unsigned int poll;
unsigned int error;
unsigned char err;
register unsigned int portid;
register unsigned int value;
done = FALSE;
err = FALSE;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0xAAAA;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // write 0x80 command to erase entire chip
value=0x8080;
asm st value, [portid];
value=0xAAAA;
asm st value, [portid]; // continue unlock sequence
portid=FLASH_COMMON_BOOT_X554; // continue unlock sequence
value=0x5555;
asm st value, [portid];
portid=sector_erase_address;
value=0x3030; // write 0x30 command to one sector erase command
asm st value, [portid];
do // now use data polling method to verify successful erase
{
asm ld value, [portid];
poll=value; // read flash status from any address
error = poll & NVM_ERROR; // save timeout error bit
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -