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--);
}
哪位大侠帮帮忙啊
现象就是可以接收到应答,也能读到数据,但就是读不正确写进多少就读回多少,而且多次读会发生错误,收不到应答
如何用示波器捕捉啊
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |