首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

dg128 IIC调试at24c02地址指针写不进去是怎麽回事啊

dg128 IIC调试at24c02地址指针写不进去是怎麽回事啊

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]

哪位大侠帮帮忙啊

你的问题是什么,现象是什么?引脚上是否有信号输出?
海纳百川  有容乃大
最好用示波器捕捉一次看看,这样猜是不好的,
个人BLOG:http://blog.eccn.com/u/107300/index.htm

现象就是可以接收到应答,也能读到数据,但就是读不正确写进多少就读回多少,而且多次读会发生错误,收不到应答

如何用示波器捕捉啊

返回列表