![](/UpLoadFiless/Article/gdpic/2008-08/20080819133732416.jpg)
图3 EPP接口外设硬件接口图 在本设计中,uPSD3254A采用主动连续接收PC机并口的数据,当需要数据时,连续接收PC的数据,否则PC一直等待nWait信号有效。而当外设准备好数据上传到PC机时,PC机采用的是中断方式接收外设的数据。
3.2 CPLD逻辑编程
在PSDsoft EXPRESS工具中,将PA端口(D0~D7)配置成带有时钟上升沿触发的寄存器类型(PT clocked register)的输入宏,PB4(nWrite)、PB6(nDstrb)、PB7(nAstrb)配置成CPLD逻辑输入(logic input)口。nDstrb信号和nAstrb信号各自取反再相与后的值作为输入宏单元的时钟。上述对PA、PB端口的配置用方程式表示如下:
EPP_D0.LD = !nDstrb & !nAstrb;
EEP_D1.LD = !nDstrb & !nAstrb;
EEP_D2.LD = !nDstrb & !nAstrb;
EEP_D3.LD = !nDstrb & !nAstrb;
EEP_D4.LD = !nDstrb & !nAstrb;
EEP_D5.LD = !nDstrb & !nAstrb;
EEP_D6.LD = !nDstrb & !nAstrb;
EEP_D7.LD = !nDstrb & !nAstrb;
nAstrb.LE = 1;
nDstrb.LE = 1;
数据正向传输过程:即计算机向外设单片机传输数据(即EPP数据写周期)为例,计算机首先把nWrite信号置为低,表明是写周期,同时将数据放到数据总线上,然后检测nWait信号,如果nWait为低则置低nDstrb信号。此时,!nDstrb & !nAstrb信号会出现一个上升沿,此上升沿会将PA端口的数据锁存到输入宏;当单片机检测到nDstrb为低时将nWait信号变高表示外设正忙接收数据并处理,同时读取数据总线上的数据。当计算机检测到nWait信号为高后就会将数据握手信号nDstrb变高,EPP数据写周期结束。上述EPP数据的锁存和nDstrb握手信号的产生都由硬件产生,因此数据传输速度快。整个数据传输过程可以在一个I/O周期内完成。
数据反向传输过程:单片机准备好数据需要上传到计算机时,uPSD3254A将数据放到PA端口,同时置低Intr信号线,向计算机申请一个中断,而计算机则由一个硬件驱动程序来处理并口的硬件中断。计算机首先把nWrite信号置高,表示当前为读周期,当计算机读取EPP数据口时同样会检测nWait信号。如果nWait为低,然后置低nDstrb并读取数据总线上的数据。单片机在检测到nDstrb为低时马上将nWait信号置高,PC机在nWait为高后自动将nDstrb信号置高,完成一个数据周期的读(相对PC机而言)过程。
3.3单片机数据接收程序
sbit nwait = P1^0;
sbit ERROR = P1^1;
sbit nDstrb = PB & 0x40;
void parallel_rcv(unsigned long rcv_count) //并口接收,rcv_count为接收字节数
{
unsigned long i;
rcv_data = (unsigned char * )&rcv_buffer;
reread_sign = 1; //非错误态
while(reread_sign ==1)
{
for(i=0;i<rcv_count;i++) //接收数据
{
nwait = 1; //PC端反向后为低,表示外设准备好接收
while(nDstrb) //等待nDstrb为低时完成数据传输并锁存
nwait = 0; //完成写周期,
rcv_data[i] = UPSD_xreg.IMC_A; //从锁存的输入宏中读取数据
} //接收完成
ERROR = error_check(rcv_data); //检测错误,1为正确,0为错误
if(ERROR)
{
reread_sign = 0; //无错则退出while循环
}
else
{
ERROR = 1; //校验有错则while循环继续
}
}
该程序为单片机数据接收(即PC写数据)子程序,其中rcv_buffer为接收缓存区,error_check为对接收的数据进行校验.如果出错,则将用户自定义引脚12置低,PC机读取状态寄存器时读取到该用户自定义状态为低时,将数据重发,保证了通信的可靠性。
参