新人求助,mega128,I2C,24C02
http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_714488R8Y3JT.jpgPROUES的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); ./emotion/em019.gif。。。。。。。。。。。。 问题解决了么?我现在正需要学呢!!!!有类似程序吗?
页:
[1]