IIC调试at24c02地址指针写不进去是怎麽回事啊 主函数: uchar IIC_data; void main(void) { /* put your own code here */ EnableInterrupts; init(); SEND_byte( 0x07, 0x96); delay(40000); delay(40000); delay(40000); delay(40000);delay(40000); delay(40000);delay(40000); IIC_data=READ_byte(0x08);
for(;;) {} /* wait forever */ /* please make sure that you never leave this function */ }
子函数void SEND_byte(uchar ADR,uchar DATA) { IBCR_TX_RX=1; //传送数据 IBCR_RSTA=1;//产生启动信号 IBCR_MS_SL=0; IBCR_MS_SL=1; //主模式 IBSR_IBIF=1; IBDR=Slave_Address_White; //写 while(IBSR_IBIF==0); IBSR_IBIF=1; //等待数据传送完 while(IBSR_RXAK); //等待接收到应答 IBDR=ADR; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; //等待数据传送完 while(IBSR_RXAK); IBDR=DATA; // while(IBSR_IBIF==0); IBSR_IBIF=1; //等待数据传送完 while(IBSR_RXAK); //等待接收到应答
IBCR_MS_SL=0;//产生停止信号 } uchar READ_byte(uchar ADR) { uchar DATA; IBCR_MS_SL=0; IBCR_MS_SL=1; //主模式 IBCR_TX_RX=1; IBSR_IBIF=1; //传送数据 IBDR=Slave_Address_White; //写数据的地址 while(IBSR_IBIF==0); IBSR_IBIF=1; while(IBSR_RXAK);
IBCR_RSTA=1; IBDR=Slave_Address_Read; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; while(IBSR_RXAK); IBCR_RSTA=1; IBDR=ADR;while(IBSR_IBIF==0); IBSR_IBIF=1;while(IBSR_RXAK); //等待接收到应答 DATA=IBDR; IBCR_TX_RX=0; IBCR_TXAK=1; IBCR_MS_SL=0;//产生停止信号
return DATA; } /******************I2C初始化函数************************************/ void init(void) { IBFD=0X1b; IBSR_IBIF=1; IBCR=IBCR_IBEN_MASK+IBCR_TX_RX_MASK; //使能 传送数据 +IBCR_MS_SL_MASK }
/////////////////////////////////////////////////////////////////////////// void SEND_char(uchar ADR,uchar *W_pointer,uchar W_num){ IBCR_MS_SL=1; //主模式 IBCR_TX_RX=1; //传送数据
IBCR_RSTA=1;//产生启动信号 IBDR=Slave_Address_White; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; while(IBSR_RXAK); IBDR=ADR; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; for(;W_num>0;W_num--){ IBDR=*W_pointer; W_pointer++; while(IBSR_IBIF==0);IBSR_IBIF=1; while(IBSR_RXAK); // 判断是否接收到应答 } IBCR_TX_RX=0; IBCR_MS_SL=0;//产生停止信号 } void READ_char(uchar ADR,uchar *R_pointer,uchar R_num) { IBCR_MS_SL=1; //主模式 IBCR_TX_RX=1; //传送数据 IBCR_RSTA=1;//产生启动信号 IBDR=Slave_Address_White; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; IBDR=ADR; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1;
IBCR_RSTA=1;//产生启动信号 IBDR=Slave_Address_Read; //写数据的地址 while(IBSR_IBIF==0);IBSR_IBIF=1; for(;R_num>1;R_num--){ while(IBSR_TCF==0);//等待数据传送完 *R_pointer=IBDR; IBCR_TXAK=0; } while(IBSR_TCF==0);//等待数据传送完 *R_pointer=IBDR; IBCR_TXAK=1; //产生非应答信号 IBCR_MS_SL=0;//产生停止信号 } /*******************延时函数************************************/ void delay(int i) { int j; for(j=i;j>0;j--); }
[em09] |