luzhoujune 发表于 2012-1-26 21:24:11

新人求助,mega128,I2C,24C02

http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_714488R8Y3JT.jpg
PROUES的I2C调试器调试结果 (原文件名:搜狗截图_2012-01-26_21-06-29.jpg)

新年里新人求助,请各位能看一下小弟的问题:
最近有mega128调试I2C 用硬件的I2C,通讯对象是24C02
写了一段测试代码,功能为:
1、向24C02的0x00地址写入0x99
2、从24C02的0x00地址读出数据
问题1:为什么读出的竟是0xFF
问题2:为什么没有应答A(ACK)只有N(NACK)   不是发送完START 及期间地址的时候都有ACK吗   

都调了2天了,原来用51软调都没问题的.。。。。   各位大哥帮帮忙啊

//------------------发送START--------------------------
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //发出 START 信号
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示START 信号已发出

//------------------发送器件地址------------------------

TWDR = 0xA0;                           //将 SLA_W 载入 TWDR 寄存器, TWINT位清零,启动发送地址
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线命令 SLA+W 已发出,及收到应答信号ACK/NACK
;
//------------------发送数据地址--------------6----------
TWDR = 0x00;                            //装入数据到 TWDR 寄存器, TWINT 清零,启动发送数据
TWCR = (1<<TWINT) | (1<<TWEN);      
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线数据 DATA 已发送,及收到应答信号ACK/NACK

//------------------发送数据------------------------
TWDR = 0x99;                            //装入数据到 TWDR 寄存器, TWINT 清零,启动发送数据
TWCR = (1<<TWINT) | (1<<TWEN);      
   while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线数据 DATA 已发送,及收到应答信号ACK/NACK

//------------------发送STOP------------------------
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //发送 STOP 信号
/***********************************8*/
以上是写数据
_delay_ms(500);
以下是读数据
/***********************************8*/
//------------------发送START------------------------
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //发出 START 信号
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示START 信号已发出
//------------------发送器件地址------------------------

TWDR = 0xA0;                           //将 SLA_W 载入 TWDR 寄存器, TWINT位清零,启动发送地址
TWCR = (1<<TWINT) | (1<<TWEN);         
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线命令 SLA+W 已发出,及收到应答信号ACK/NACK

//------------------发送数据地址------------------------
TWDR = 0x00;                            //装入数据到 TWDR 寄存器, TWINT 清零,启动发送数据
TWCR = (1<<TWINT) | (1<<TWEN);      
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线数据 DATA 已发送,及收到应答信号ACK/NACK


//------------------发送START(重新开始)------------------------
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //发出 START 信号
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示START 信号已发出
//------------------发送器件地址-------------------------------

TWDR = 0xA1;                           //将 SLA_W 载入 TWDR 寄存器, TWINT位清零,启动发送地址
TWCR = (1<<TWINT) | (1<<TWEN);         
while (!(TWCR & (1<<TWINT)));         //等待 TWINT 置位, TWINT 置位表示总线命令 SLA+W 已发出,及收到应答信号ACK/NACK

//------------------接收数据-----------------------------------
TWCR = (1<<TWINT) | (1<<TWEN);         //只接受一个数据
   
while (!(TWCR & (1<<TWINT)));

   data_in= TWDR;//【存储接收数据】

//------------------发送STOP-----------------------------------
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //发送 STOP 信号

while(1);

luzhoujune 发表于 2012-1-29 19:09:05

./emotion/em019.gif。。。。。。。。。。。。

79301110 发表于 2013-5-12 16:20:26

问题解决了么?我现在正需要学呢!!!!有类似程序吗?
页: [1]
查看完整版本: 新人求助,mega128,I2C,24C02