uint8 SetIO_Func(uint16 IoPort ,uint8 Fuct,uint8 InOut)
{
uint8 PortNum,err;
uint32 Pull,Sift;
// OS_ENTER_CRITICAL();
err=NO_ERR;
PortNum=IoPort>>12; //取出IO口选项
Pull=(IoPort&0x0F00)>>8; //取出连续IO口上下拉状态
if(Pull==1) Pull=0x02; //禁止设置保留状态
IoPort=IoPort&0x001F; //取出IO的位置
switch(PortNum)
{
case 0: //P0口
{
// SCS |= FAST_PORT; //设定为高速口
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE0=(PINMODE0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL0=(PINSEL0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE1=(PINMODE1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL1=(PINSEL1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO0DIR =FIO0DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO0DIR =FIO0DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 1: //P1口
{
// SCS |= FAST_PORT; //设定为高速口
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE2=(PINMODE2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL2=(PINSEL2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE3=(PINMODE3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL3=(PINSEL3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO1DIR =FIO1DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO1DIR =FIO1DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 2: //P2口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE4=(PINMODE4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL4=(PINSEL4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE5=(PINMODE5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL5=(PINSEL5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO2DIR =FIO2DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO2DIR =FIO2DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 3: //P3口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE6=(PINMODE6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL6=(PINSEL6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE7=(PINMODE7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL7=(PINSEL7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO3DIR =FIO3DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO3DIR =FIO3DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 4: //P4口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE8=(PINMODE8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL8=(PINSEL8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE9=(PINMODE9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL9=(PINSEL9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO4DIR =FIO4DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO4DIR =FIO4DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
default: //错误设置
{
err=ERR_OP;
}break;
}
// OS_EXIT_CRITICAL();
return err;
}
有这样一个函数,可以通过设置他来改变IO的状态但是不管我怎么设置,就是不能设置IO可以接收,也可以发送。很纠结的说、。。
|