Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

PolArt
2022-07-08 09:45:37

Благодарю за информацию. Я еще на пути познания, не все сразу могу осознать.

Изя
2022-07-08 08:36:18

А что стОит посмотреть даташит! Например 24с08 = 8К бит = 1К байт. Значит нужно 10 бит для адресации. Но адресный байт (word address) у всех (от 24с01 до 24с16)  8-ми битный, а тогда старшие 2 бита находятся в device address. Что открытым текстом расписано и разрисовано в даташите. Ужас.(

PolArt
2022-07-07 14:36:35

Если не напутал, то вот так:

1 Кбит - 2 Кбит

Wire.beginTransmission(deviceAddress);
Wire.write(addressCell);
Wire.write(data);
Wire.endTransmission();

4 Кбит - 16 Кбит

Wire.beginTransmission((byte)(deviceAddress | ((addressCell >> 8) & 0x07)));
Wire.write(addressCell & 0xFF);
Wire.write(data);
Wire.endTransmission();

32 Кбит - 256 Кбит

Wire.beginTransmission(deviceAddress);
Wire.write(addressCell >> 8);
Wire.write(addressCell & 0xFF);
Wire.write(data);
Wire.endTransmission();
PolArt
2022-07-07 10:47:29

Благодарю всем за помощь. Технически проблема решилась, осталось только осознать более глубоко передачу адреса ячейки памяти. Как оказалось этот скетч таки пишет, но не то и не туда)) Я так понял он заточен под памяти с бОльшим объемом. Надеюсь поскорее доразбираться, чтобы внятно описать суть.

г0сть
2022-07-06 23:35:53
PolArt пише:

Хотелось "напрямую" достучатся по I2C. И теперь не ясно где именно ошибка или хотя бы как ее выявить.

В таком случае я бы начал с простого

#include <Wire.h>    
 
#define disk1 0x50    //Address of 24С08 eeprom chip
 
void setup(void)
{
  Serial.begin(9600);
  Wire.begin();  
 
  unsigned int address = 0;
 
  writeEEPROM(disk1, address, 123);
  delay(10);
  Serial.print(readEEPROM(disk1, address), DEC);
}
 
void loop(){}
 
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) 
{
  Wire.beginTransmission((byte)deviceaddress);
  Wire.write((byte)(eeaddress));
  Wire.write(data);
  Wire.endTransmission();
 
  delay(5);
}
 
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) 
{
  byte rdata = 0xFF;
 
  Wire.beginTransmission((byte)deviceaddress);
  Wire.write((byte)(eeaddress));
  Wire.endTransmission();
 
  Wire.requestFrom((byte)deviceaddress,1);
 
  if (Wire.available()) rdata = Wire.read();
 
  return rdata;
}

А потом бы уже разбирался с этими строками

Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB

что и где не работает

PolArt
2022-07-06 23:33:51
akapulko пише:

Попробуйте найти строку в которой зависает программа, например последовательно перемещая:

Serial.println("checkpoint");

Спасибо, буду пробовать.

akapulko
2022-07-06 23:32:14

Попробуйте найти строку в которой зависает программа, например последовательно перемещая:

Serial.println("checkpoint");
PolArt
2022-07-06 21:49:52
Васятко пише:

Ну и чем библиотека не устроила? Или захотелось секаса?

В какой-то степени да))) Познаю сию науку. Хотелось "напрямую" достучатся по I2C. И теперь не ясно где именно ошибка или хотя бы как ее выявить. Других девайсов с I2C в наличии нет, что бы попробовать к чему-то другому подключиться.

Васятко
2022-07-06 21:14:58

Ну и чем библиотека не устроила? Или захотелось секаса?

PolArt
2022-07-06 16:17:55

Ситуация такая. Имеются чипы 24С08 (благополучно выпаяные с плат старых компьютерных мониторов). Подключил к Uno по I2C. Если использовать библиотеку Eeprom24C04_08_16-master.zip, то вообще никаких проблем с ними нет. Все пишется и без проблем читается.
Проблема следующая. При попытке обращаться к внешней памяти средствами стандартной библиотеки Wire.h, то никакого взаимодействия не выходит. Прописывал разные адреса и значения. Не записывает и не читает. Код приводу:

#include <Wire.h>    
 
#define disk1 0x50    //Address of 24С08 eeprom chip
 
void setup(void)
{
  Serial.begin(9600);
  Wire.begin();  
 
  unsigned int address = 0;
 
  writeEEPROM(disk1, address, 123);
  Serial.print(readEEPROM(disk1, address), DEC);
}
 
void loop(){}
 
void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) 
{
  Wire.beginTransmission(deviceaddress);
  Wire.write((int)(eeaddress >> 8));   // MSB
  Wire.write((int)(eeaddress & 0xFF)); // LSB
  Wire.write(data);
  Wire.endTransmission();
 
  delay(5);
}
 
byte readEEPROM(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;
}

Вскрывал библиотеку. Там код такого же плана)) Куда копать?

Підвал форуму