24c08存储模块问题求助
做32X64点阵屏驱动的时候,存储字模需要大量空间,于是在网上淘了一个24c08存储模块,如图:到手参照芯片资料,该模块芯片地址脚全部悬空,那么地址应该为“0”,试了如下程序:#include <Wire.h>//声明I2C库文件
#define sda A4// 24c08 SDA
#define scl A5// 24c08 SCL
void setup()
{
//pinMode(sda,OUTPUT);
//pinMode(scl,OUTPUT);
Wire.begin();
Serial.begin(9600);
Serial.println("Ready");
}
void loop()
{
Wire.beginTransmission(0);
Wire.Write(15);
Wire.endTransmission();
Wire.requestFrom(0, 1); //从地址0上传1个字节
while(Wire.available()>0) // 当接收到数据时
{
byte c = Wire.read(); //接收一个字节赋值给c
Serial.println(c);
}
}
正常编译,上传,但是无数据反馈。求高手指点。
(找了网上资料,都是51单片机的,有Arduino的吗?) 没玩过那呢 先再三确定 地址 是 0 吗?
使用是I2C,一个芯片会有一个芯片地址的,在51程序中找找。楼上说的地址0也许片选
你的代码中,I2C寻址部份呢? 谢谢楼上,经对比,原程序不完整。现在改为以下程序,但是写入与读出的数据不一致。还在继续研究。
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
int rdata = data;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(rdata);
Wire.endTransmission();
}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.read();
return rdata;
} 使用如下代码扫描I2C地址:
//*****************************************
//
// I2C Scaner code
//
//*****************************************
// Scan the I2C bus between addresses from_addr and to_addr.
// On each address, call the callback function with the address and result.
// If result==0, address was found, otherwise, address wasn't found
// (can use result to potentially get other status on the I2C bus, see twi.c)
// Assumes Wire.begin() has already been called
void scanI2CBus(byte from_addr, byte to_addr,
void(*callback)(byte address, byte result) )
{
byte rc;
byte data = 0; // not used, just an address to feed to twi_writeTo()
for( byte addr = from_addr; addr <= to_addr; addr++ ) {
rc = twi_writeTo(addr, &data, 0, 1, 0);
if(rc==0) callback( addr, rc );
}
}
// Called when address is found in scanI2CBus()
// Feel free to change this as needed
// (like adding I2C comm code to figure out what kind of I2C device is there)
void scanFunc( byte addr, byte result ) {
Serial.print("addr: ");
Serial.print(addr,DEC);
Serial.print("\t HEX: 0x");
Serial.print(addr,HEX);
Serial.println( (result==0) ? "\t found!":" ");
if(addr==80) Serial.println("24cXX on connect!");
//Serial.print( (addr%4) ? "\t":"\n");
}
结果如下:
想请教为什么是4个地址呢 全悬空好像不为0,我是玩51的偶尔玩玩ARDUINO水平很菜~我51对单个24C都是全接地,而且读,写;写,写;操作中间是需要给个延时的~好像是480US 感谢大家。目前已基本解决。借助I2Cdev库来操作的,确实需要延时,不然会丢数据。
页:
[1]