реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> I2C память., Не могу работать с 24с256.
at90
сообщение Dec 12 2005, 08:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



Прилепил к меге 24с256. Адресные ноги подтянуты к земле.
Но попытки чтения и записи в память не увенчались успехом.
Пишу в КодеВижен. Доэтого работал с ds1307. Работает нормально.

Использую встроенный в компилятор I2C.
#define EEPROM_BUS_ADDRESS 0xA0

bit i2c_error;

unsigned char at24c08_read(unsigned int address)
{
unsigned char data;
unsigned char temp_i;
temp_i = SREG.7;
#asm("cli")

i2c_error=0;
data = ((unsigned char)(address>>7))&0x0e;
if (!(i2c_start()&&
i2c_write(EEPROM_BUS_ADDRESS | data)&&
i2c_write((unsigned char)(address))&&
i2c_start()&&
i2c_write(EEPROM_BUS_ADDRESS | data | 1)))
{ i2c_error=1; }
else data=i2c_read(0);
i2c_stop();

SREG.7 = temp_i;
return data;
}



void at24c08_write(unsigned int address, unsigned char data)
{
unsigned char temp_i;
temp_i = SREG.7;
#asm("cli")
i2c_error=0;

if (!(i2c_start()&&
i2c_write(EEPROM_BUS_ADDRESS | (((unsigned char)(address>>7))&0x0e))&&
i2c_write((unsigned char)(address))&&
i2c_write(data))) { i2c_error=1; }
i2c_stop();

delay_ms(10);
SREG.7 = temp_i;
}


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
m16
сообщение Dec 12 2005, 09:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



посмотри апноту
Прикрепленные файлы
Прикрепленный файл  Avr315.zip ( 7.04 килобайт ) Кол-во скачиваний: 75
Прикрепленный файл  Doc2564.pdf ( 158.23 килобайт ) Кол-во скачиваний: 95
 
Go to the top of the page
 
+Quote Post
at90
сообщение Dec 12 2005, 10:33
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



У меня I2C программный. Ножки Twi заняты. Плата уже готовая.


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
at90
сообщение Dec 12 2005, 10:54
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



Никто не поделится рабочим примерчиком работы с eeprom,
для СV или IAR!!!


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
Rash
сообщение Dec 12 2005, 11:21
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



Цитата(at90 @ Dec 12 2005, 14:33) *
У меня I2C программный. Ножки Twi заняты. Плата уже готовая.

Зачем над собой издеваться, если есть апаратный TWI. Если уж плата разведена, обреж дорожки да переподключи, намного быстрее будет, чем самому писать или искать.
Go to the top of the page
 
+Quote Post
proba
сообщение Dec 12 2005, 11:58
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



organizatsija pamjaati u 2408 i 24256 raznoe, 256 trebujet 2 baitnöi adres, smotrii datasheet.
primerno
{
U8 i;
i =i2c_start();
i&=i2c_write(EEPROM_BUS_ADDRESS );
i&=i2c_write(address>>8);
i&=i2c_write( aaddress &0xFF);
if ( i==0) ... net ACK
else .. chip otvetshal ACK
}
Go to the top of the page
 
+Quote Post
at90
сообщение Dec 12 2005, 12:27
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



Аппаратный TWI глюченный. Мне бысто и не нада. Хватит и медленно. Главное чтобы работало!


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
m16
сообщение Dec 12 2005, 12:37
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(at90 @ Dec 12 2005, 15:27) *
Аппаратный TWI глюченный. Мне бысто и не нада. Хватит и медленно. Главное чтобы работало!

это кто ж Вам такое сказал , киньте в него камнем
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 12 2005, 22:29
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Пардон ,что не в тему,не хотелось создавать отдельную.

У меня тут вопрос насчет аппаратной реализации TWI и глюков на меге16

Вот какая ерунда,вроде нормально все работает,и передаем и получаем
и переадресуем,все класс,но все хорошо до команды СТОП.
После этого шина затыкается.
Программка простенькая,проверяет только флаг TWINT.
Но я после СТОПа и вырубал и инициализировал заново TWI,ни в какую
работать не хочет.
Кто мне скажет, какого оно не пашет?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 13 2005, 00:17
Сообщение #10


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
Программка простенькая,проверяет только флаг TWINT.
Но я после СТОПа и вырубал и инициализировал заново TWI,ни в какую
работать не хочет.


А после уловия "СТОП" флаг TWINT случайно не проверяете? Если проверяете, то шина вполне может зависнуть. По крайней мере мне так кажется, потому, что в application note от atmel полсе "СТОП" ни "чего нет".
Если можно, то покажите, пожалуйста исходник. И еще... Вы сами писали функции работы с TWI?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
at90
сообщение Dec 13 2005, 07:20
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



Цитата(proba @ Dec 12 2005, 14:58) *
organizatsija pamjaati u 2408 i 24256 raznoe, 256 trebujet 2 baitnöi adres, smotrii datasheet.
primerno
{
U8 i;
i =i2c_start();
i&=i2c_write(EEPROM_BUS_ADDRESS );
i&=i2c_write(address>>8);
i&=i2c_write( aaddress &0xFF);
if ( i==0) ... net ACK
else .. chip otvetshal ACK
}

Пробовал ещё так
Код
void write_byte_eeprom (unsigned int address, unsigned char data)
{
unsigned char sSREG;

sSREG = SREG; // ?aaeno? Noaoona IE

#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(address>>8)<<1));
i2c_write((unsigned char)address);
i2c_write(data);
i2c_stop();

SREG = sSREG;
delay_ms(10);

}



unsigned char read_byte_eeprom (unsigned int address)
{
unsigned char data;
unsigned char sSREG;

sSREG = SREG;
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(address>>8)<<1));
i2c_write((unsigned char)address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | ((unsigned char)(address>>8)<<1) | 1);
data = i2c_read(0);
i2c_stop();
SREG = sSREG;
return data;
}


всё равно не пашет!


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 13 2005, 18:23
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



***А после уловия "СТОП" флаг TWINT случайно не проверяете? Если проверяете, то шина вполне может зависнуть. По крайней мере мне так кажется, потому, что в application note от atmel полсе "СТОП" ни "чего нет".***

Флаг TWINT и проверял и не проверял,поровну.

Программа экспрессом идет дальше,но реакции на ногах нет.
То есть в первый раз все ОК.По второму кругу ничего.
Прога не виснет, получаеться сторожевого таймера тоже не поставить.
Единственный вариант проверять TWSR на отсутствие АСК и врубать сторожевого таймера на сброс.
Но тогда вопрос ,сохраняються ли значения регистров и оперативки при таком сбросе?
Чтобы программа могла успешно продолжать передачу а не циклиться на одном и том же.
Да и такие маневры программы меня не очень радуют.
Кроме того не все устройства поддерживают АСК а остальные бывает при окончании связи
выставляют NACK.
Даже не знаю что здесь делать

Второй вариант держать постоянно шину занятой,но тогда два мастера на шину не поцепить.

***Если можно, то покажите, пожалуйста исходник. И еще... Вы сами писали функции работы с TWI?***


Пишу на графическом асме,его здесь не нарисовать,хотя код в пол мизинца,опишу.

Здесь без использования прерывания по TWI

#H02->TWBR // Устанавливаем SCL 100000Гц
#H02->TWSR //
#HA4->TWCR // Включение и старт TWI
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#H40->TWDR // Записываем адресс устройства (40 HEX) в TWDR
#H84->TWCR // Отправляем адресс устройства
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#HFF->TWDR // Записываем данные для передачи (FF HEX) в TWDR
#H84->TWCR // Отправляем данные
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#H94->TWCR // Стоп

Все,если прога по второму кругу идет ,в ответ тишина.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 14 2005, 00:45
Сообщение #13


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата
Единственный вариант проверять TWSR на отсутствие АСК и врубать сторожевого таймера на сброс.
Но тогда вопрос ,сохраняються ли значения регистров и оперативки при таком сбросе?
Чтобы программа могла успешно продолжать передачу а не циклиться на одном и том же.
Да и такие маневры программы меня не очень радуют.

Я тоже думаю, что это не нужно... полная кривизна программы получится wink.gif

Цитата
Пишу на графическом асме,его здесь не нарисовать,хотя код в пол мизинца,опишу.

Здесь без использования прерывания по TWI

#H02->TWBR // Устанавливаем SCL 100000Гц
#H02->TWSR //
#HA4->TWCR // Включение и старт TWI
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#H40->TWDR // Записываем адресс устройства (40 HEX) в TWDR
#H84->TWCR // Отправляем адресс устройства
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#HFF->TWDR // Записываем данные для передачи (FF HEX) в TWDR
#H84->TWCR // Отправляем данные
<TWINT=0> // Ждем пока TWINT=0 если TWINT= 1 идем дальше
#H94->TWCR // Стоп

Все,если прога по второму кругу идет ,в ответ тишина.

Тяжело мне это все понять (мой комп на работе в ремонте, а там все даташиты и исходники, так что не могу сверится с документацией sad.gif )
Единственное как вариант, могу посоветовать поискать ниже по форуму ветки по TWI... их было около 2-3... там я выкладывал рабочие, прокомментированные исходники на Си. Правда в текстах отсутствует проверка на ошибки шины. Если Вы не знаете Си, то все равно там все должно быть понятно, код очень простой.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Igor26
сообщение Dec 14 2005, 07:05
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Тяжело мне это все понять (мой комп на работе в ремонте, а там все даташиты и исходники, так что не могу сверится с документацией sad.gif )
Единственное как вариант, могу посоветовать поискать ниже по форуму ветки по TWI... их было около 2-3... там я выкладывал рабочие, прокомментированные исходники на Си. Правда в текстах отсутствует проверка на ошибки шины. Если Вы не знаете Си, то все равно там все должно быть понятно, код очень простой.
[/quote]
И, проверенно, полностью рабочий a14.gif
Go to the top of the page
 
+Quote Post
at90
сообщение Dec 14 2005, 11:03
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



Заработало так. Как в даташите?

Код
#define  EEPROM_BUS_ADDRESS 0xa0
void write_byte_eeprom (unsigned int address, unsigned char data)
{
unsigned char sSREG;

sSREG = SREG; // регистр Статуса МК

#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>7);
i2c_write((unsigned char)address);
i2c_write(data);
i2c_stop();

SREG = sSREG;
delay_ms(10);

}



unsigned char read_byte_eeprom (unsigned int address)
{
unsigned char data;
unsigned char sSREG;

sSREG = SREG;
#asm ("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>7);
i2c_write((unsigned char)address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data = i2c_read(0);
i2c_stop();
SREG = sSREG;
return data;
}


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01458 секунд с 7
ELECTRONIX ©2004-2016