|
I2C память., Не могу работать с 24с256. |
|
|
|
Dec 12 2005, 12:37
|
Местный
  
Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225

|
Цитата(at90 @ Dec 12 2005, 15:27)  Аппаратный TWI глюченный. Мне бысто и не нада. Хватит и медленно. Главное чтобы работало! это кто ж Вам такое сказал , киньте в него камнем
|
|
|
|
|
Dec 12 2005, 22:29
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Пардон ,что не в тему,не хотелось создавать отдельную.
У меня тут вопрос насчет аппаратной реализации TWI и глюков на меге16
Вот какая ерунда,вроде нормально все работает,и передаем и получаем и переадресуем,все класс,но все хорошо до команды СТОП. После этого шина затыкается. Программка простенькая,проверяет только флаг TWINT. Но я после СТОПа и вырубал и инициализировал заново TWI,ни в какую работать не хочет. Кто мне скажет, какого оно не пашет?
|
|
|
|
|
Dec 13 2005, 07:20
|

Знающий
   
Группа: Свой
Сообщений: 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; } всё равно не пашет!
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
|
Dec 13 2005, 18:23
|
Знающий
   
Группа: Свой
Сообщений: 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 // Стоп
Все,если прога по второму кругу идет ,в ответ тишина.
|
|
|
|
|
Dec 14 2005, 00:45
|

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

|
Цитата Единственный вариант проверять TWSR на отсутствие АСК и врубать сторожевого таймера на сброс. Но тогда вопрос ,сохраняються ли значения регистров и оперативки при таком сбросе? Чтобы программа могла успешно продолжать передачу а не циклиться на одном и том же. Да и такие маневры программы меня не очень радуют. Я тоже думаю, что это не нужно... полная кривизна программы получится Цитата Пишу на графическом асме,его здесь не нарисовать,хотя код в пол мизинца,опишу.
Здесь без использования прерывания по 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 // Стоп
Все,если прога по второму кругу идет ,в ответ тишина. Тяжело мне это все понять (мой комп на работе в ремонте, а там все даташиты и исходники, так что не могу сверится с документацией  ) Единственное как вариант, могу посоветовать поискать ниже по форуму ветки по TWI... их было около 2-3... там я выкладывал рабочие, прокомментированные исходники на Си. Правда в текстах отсутствует проверка на ошибки шины. Если Вы не знаете Си, то все равно там все должно быть понятно, код очень простой.
--------------------
Выбор.
|
|
|
|
|
Dec 14 2005, 11:03
|

Знающий
   
Группа: Свой
Сообщений: 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; }
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|