我作了系统,需要在两片单片机种利用并口(16位IO口传送数据),其中在2214中发送数据<br /> i=1;<br /> PINSEL0 = 0x00000000; <br /> PINSEL1 = 0x00000000;<br /> IO0DIR = 0xFFFFFFFF; //P0口为输出口 <br /> while((IO3PIN &0x01000000) ==0) //等待回应IO口变低(IO3PIN &0x01000000) ==0 &&(i<30)<br /> { <br /> IO0PIN = (IO0SET&0xFFF00003)|(cp&0xF0)<<4|(cp&0x0F)<<2|cp[i+1]<<12 ; //写数据<br /> IO3SET |=0xE << 16; //中断信号<br /> // for(j=0;j<13;j++);<br /> IO3CLR |= 0xF << 16; //中断信号<br /> // for(j=0;j<5;j++);<br /> i+=2;<br /> } <br />另外用2214作为接受数据:(利用外部中断0)<br /> int main(void)<br />{ <br /> PINSEL0 = 0x00000000; // 初始化P0.6~13,P0.18~25为IO口,P0.16为EINT0<br /> PINSEL1 = 0x00000001;<br /> IO0DIR = 0x00008038; // 设置IO口方向<br /> <br /> IO0CLR |= 1 <<15; //拉低p0.15 <br /> i=0; <br /> EXTMODE = 0x01; // 设置EINT0中断为边沿触发模式<br /> EXTPOLAR = 0x01; // 设置EINT0中断为下降沿触发 <br /> /* 打开EINT1中断(设置向量控制器,即使用向量IRQ) */<br /> VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断<br /> VICVectCntl0 = (0x20 |14); // 分配EINT0中断到向量中断1<br /> VICVectAddr0 = (int)IRQ_Eint0; // 设置中断服务程序地址<br /> EXTINT = 0x01; // 清除EINT0中断标志 <br /> VICIntEnable = 0x00004000; <br />}<br /><br />中断服务程序为<br />volatile uint16 Control_data[13] ={0,0,0,0,0,0,0,0,0,0,0,0,0} ; //dingyi quanju bianliang<br />volatile uint16 fre,fudu; //,a_1,a_2,a_3,a_4,a_5,a_6,a_7,a_8,a_9,a_10,a_11<br />volatile uint8 mutex,i;<br />/****************************************************************************<br />THe service programme of interrupt<br />****************************************************************************/<br /> void __irq IRQ_Eint0(void)<br />{ <br /> uint16 rec_data;<br /> <br /> struct packed_data //dingyi weiduan jiegouti<br /> {unsigned a:8;<br /> unsigned b:8;<br /> }data;<br /> <br /> IO0SET |= 1<<15 ;<br /> <br /> data.a = IO0PIN >> 6 ;<br /> data.b = IO0PIN >> 18 ;<br /> <br /> rec_data = (rec_data & 0x0000) |data.a;<br /> rec_data |=(data.b <<8);<br /> Control_data[i++] = rec_data;<br />// rec_data =0;<br /> <br /> while(i==13)<br /> { <br /> fre = Control_data[0]; //频率<br /> fudu = Control_data[1];<br />// a_1 = Control_data[2];<br />// a_2 = Control_data[3]; <br />// a_3 = Control_data[4];<br />// a_4 = Control_data[5]; <br />// a_5 = Control_data[6];<br />// a_6 = Control_data[7]; <br />// a_7 = Control_data[8];<br />// a_8 = Control_data[9]; <br />// a_9 = Control_data[10]; <br />// a_10 = Control_data[11];<br />// a_11 = Control_data[12]; <br /> <br /> i=0;<br /> mutex = 1; <br /> }<br /> <br /> EXTINT = 0x01; // 清除EINT0中断标志<br /> VICVectAddr = 0; // 向量中断结束<br /> VICIntEnable |= 0x00004000; //使能中断 <br /> IO0CLR |= 1 <<15; //拉低p0.15<br />} <br /><br />现在问题时:单步跟踪时发现好像只有一次中断,且中断接受的数据都是相同的,是第一个数据。<br />请高手们看下到底是啥问题!希望得到大家的回答,急... |
|