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