我的程序如下 想读取ZLG7290键盘值 通过IIC但不用中断 不知道为什么读出来值 就是我设定的值OX71<br />不明白 请问下大家 如何通过 操作寄存器 产生ACK信号?? 发送 地址加读写位的时候 是把七位地址加读<br />写位一起 写到寄存器 rIICDS 后 它就自动发送吗? 谢谢各位指教!<br />void Iicinit7290(void)<br />{<br /> unsigned int i;<br /> static uint8 conreg;<br /> uchar iicstat;<br /> //0x1010 1111 0xaf<br /> rPCONF|=0xa;//PF0 IICSCL PF1 IISDA<br /> rPUPF|=0x3;//禁止内部上拉<br /> rIICCON=(1<<7)|(0<<6)|(0<<5)|(0<<4)|(0xf); //Enable interrupt, IICCLK=MCLK/16, Enable ACK<br /> Delay(1000); //66Mhz/16/(15+1) = 257Khz<br /> Uart_Printf("read 7290 start
");<br /> rIICADD=0x10; // S3C44B0X slave address<br /> rIICSTAT=0x10; //使能RX TX<br /> //开始设立地址<br /> rIICDS=0x70; //ZLG7290 七位地址0x38+1位读0 0x70<br /> rIICSTAT=0xf0;//产生Start信号 主发送模式 主机发送地址完成后 置位IPF位<br /> loop1:<br /> iicstat= rIICSTAT;<br /> if(iicstat&0x01)<br /> goto loop1;//此循环 等待收到ACK信号<br /> rI_ISPC=BIT_IIC;<br /><br /> // 发送数据<br /> rIICDS=ZLG7290_Key; 发送第要读ZLG7290的寄存器地址<br /> loop2:<br /> iicstat= rIICSTAT;<br /> if(iicstat&0x01)<br /> goto loop2;// rI_ISPC=BIT_IIC;<br /><br /> Delay(5);<br /> //延时后 产生RESTART信号<br /> //开始读7290 重新发送start信号 七位地址0x38+1位读1 0x71<br /> rIICDS=0x71;//0x38<<1+1<br /> rIICSTAT=0xb0;//再次产生Start信号,主机设为主接收模式,发送地址加读<br /> // rIICDS上数据在 START信号后自动传输<br /><br /> loop3://等待收到ACK<br /> iicstat= rIICSTAT;<br /> if(iicstat&0x01)<br /> goto loop3; //发送完写地址后 等待接收键值<br /> rI_ISPC=BIT_IIC;<br /> Delay(1000);//等待收到数据<br /> rIICSTAT=0x9f;//停止信号发出<br /> i=rIICDS;<br /><br /> Uart_Printf("key value is 0x%x
",i);<br /> Uart_Printf("Read test data from 7290 is over
"); |
|