Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
omdriyt
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 54
1

Не пишет в EEPROMку

23.01.2013, 19:13. Просмотров 2458. Ответов 4
Метки нет (Все метки)

Суть проблемы описывал здесь.
Продублирую.
Пытаюсь записать кусок памяти в ЕЕПРОМку. После захода на первую запись последующие операции отваливаются — шина занята. При том, что стоит жесткий выход со сбрасыванием флага занятости. Вот код:
Код
Код
void EepromReadid(void)                     // Была попытка чтения
{
y2s_Do &= y2s_Frii;                        // Освобождаем шину

if(y2s_Do & (y2s_ERR_NA|y2s_ERR_BF))         // Ошибки при четнии были?
{
eeprom_somplete = EEPROM_ERROR;
}
else
{
eeprom_somplete = EEPROM_OK;
}
}

uint8_t y2s_eep_WriteBytes(uint8_t SAddr, uint16_t Addr, uint8_t Count, uint8_t *Bytes)
{
if (y2s_Do & y2s_Busy)
return 0;

y2s_index = 0;
y2s_ByteCount = 2 + Count;

y2s_SlaveAddress = SAddr;

y2s_Buffer[0] = HI(Addr);
y2s_Buffer[1] = LO(Addr);

//y2s_Buffer[2] = Byte;
memcpy(&y2s_Buffer[2], Bytes, Count);

y2s_Do = y2s_sawp;

MasterOutFunc = EepromReadid;
ErrorOutFunc = EepromReadid;

TWCR = 1<<TWSTA|0<<TWSTO|1<<TWINT|0<<TWEA|1<<TWEN|1<<TWIE;

y2s_Do |= y2s_Busy | y2s_Ymtirrupted;

while (!eeprom_somplete);
return eeprom_somplete;
}
Откуда пишем
Код
#include <string.h>
#include "eeprom_fs.h"
#include "eeprom_24cx.h"

uint8_t bit_map[BITMAP_SIZE];
fat_record_t fat_records[MAX_FILES_COUNT];

uint8_t fs_mount()
{
Init_y2s();
// read bit-map
if (y2s_eep_ReadByte(0xA0, 0, BITMAP_SIZE, bit_map) == EEPROM_ERROR)
return 0;
// read FAT records
for (uint8_t i=0 ; i<MAX_FILES_COUNT ; i++)
if (y2s_eep_ReadByte(0xA0, BITMAP_SIZE + (i * sizeof(fat_record_t)), sizeof(fat_record_t), (uint8_t*)&fat_records[i]) == EEPROM_ERROR)
return 0;
return 1;
}

void fs_format()
{
memset(bit_map, 0, BITMAP_SIZE);
memset(&fat_records[0], 0, sizeof(fat_record_t));
// clear bit-map
y2s_eep_WriteBytes(0xA0, 0, BITMAP_SIZE, bit_map);
for (uint8_t i=0 ; i<MAX_FILES_COUNT ; i++)
y2s_eep_WriteBytes(0xA0, BITMAP_SIZE + (i * sizeof(fat_record_t)), sizeof(fat_record_t), (uint8_t*)&fat_records[0]);
// clear FAT records
for (uint8_t i=0 ; i<MAX_FILES_COUNT ; i++)
y2s_eep_WriteBytes(0xA0, BIT_MAPS_OFFSIT + (i * BITMAP_SIZE), BITMAP_SIZE, bit_map);
// mount FLASH
fs_mount();
}
То есть у меня идет "тупая" запись, с ожиданием. Ест., переменную y2s_Do объявил как volatile — чтение таким же образом осуществляется вполне себе нормально. А вот запись выкаблучивается :(
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 19:13
Ответы с готовыми решениями:

симулятор не пишет биты в регистр GIFR
Доброго дня уважаемые! отлаживая в симуляторе AVR Studyo 4.19 свою первую программу. Cталкнулся...

ds18b20 не пишет в EEPOM бит конфигурации
Использую библиотеку с сайта chipenable.ru ссылка на библиотеку...

Wi-Fi модем подключается, пишет что подключено, но стоит значок и пишет "без доступа в
Здравствуйте.У меня такая проблема! Wi-Fi модем подключается, пишет что подключено, но всё равно...

ОС пишет пишет 100 Мб логов в час
Понял. Видовс 7 отстой. К тому же она отсылает в майкрософт данные о пользователях. Тема...

Wi-Fi модем подключается, пишет что подключено, но всё равно стоит значок в виде жёлтого треугольника с восклицательным знаком и пишет "без доступа в
Здравствуйте. Извините, что влезаю в чужую тему, но у меня такая же проблема! Wi-Fi модем...

4
hixFF
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 641
23.01.2013, 22:57 2
прошу извинить, Си читаю плохо. Сколько байт пишется? Какая еепромка?
0
omdriyt
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 54
23.01.2013, 23:19 3
Первый раз пишет sizeof(fat_record_t)=BITMAP_SIZE=16 байт.
Но даже их не пишет - после перезагрузки сперва читаются заголовки. А там как были данные, так и остались :( . При этом перед записью массив 100% обнуляется - смотрел в отладке JTAGом.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
24.01.2013, 19:28 4
1а. СТАРТ: в TWCR единичим биты TWSTA , TWINT и TWEN.
1б. Дожидаемся объединичивания флага TWINT.
факультативно: проверяем TWSR, убеждаемся в состоянии "старт" машины, которая атмельный модуль TWI.

2. Посылаем divaddr (wr).
факультативно: проверяем TWSR, убеждаемся в состоянии "получен аск на адрес слейва" машины, которая атмельный модуль TWI.
3. Посылаем addr MSB.
факультативно: проверяем TWSR, убеждаемся в состоянии "получен аск на данные" машины, которая атмельный модуль TWI.
4. Посылаем addr LSB.
факультативно: проверяем TWSR, убеждаемся в состоянии "получен аск на данные" машины, которая атмельный модуль TWI.
5. Посылаем данные для записи, первый по счёту байт.
факультативно: проверяем TWSR, убеждаемся в состоянии "получен аск на данные" машины, которая атмельный модуль TWI.
...
6. Посылаем данные для записи, последний по счёту байт.
факультативно: проверяем TWSR, убеждаемся в состоянии "получен аск на данные" машины, которая атмельный модуль TWI.

7а. Делаем СТОП: в TWCR единичим биты TWSTO, TWINT и TWEN.
7б. Дожидаемся объединичивания флага TWINT обнуления флага TWSTO.

8. Дожидаемся окончания процедуры записи (по таймауту или через вызов девайса по адресу и проверку аска).

Посылание:

- грузим данные в TWDR;
- в TWCR единичим биты TWINT и TWEN;
- дожидаемся объединичивания TWINT.

Не забываем про разделение на страницы.

Не забываем понять:

а). Внутре модуля TWI работает "стэйтмашина" или иностранно "машина состояний", которая полюбому ресетится вместе со всем мэкэ.
б). Внутре еепром работает тоже стэйтмашина - но другая. Которой насрать на мэкэ вообще и его ресеты в частности, она даже не в курсе, что рядом кого-то ресетят.
в). Если стэйтмашина внутре еепром уже поставлена в плохую позу через не предусмотренные ей движения - вывести её из этого состояния, прежде чем продолжать попытки что-то ещё с ней сделать...

... а код выглядит понтово и хайлевельно невопрос, но то ли у меня сугубо личная половая проблема с лыжами на тему "что там происходит им предполагалось сделать", то ли железо вместо наворачивания уровней абстрактности. Или хотя бы прежде, чем наворачивать.
0
omdriyt
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 54
24.01.2013, 22:16 5
Цитата Сообщение от _moysi
а). Внутре модуля TWI работает "стэйтмашина" или иностранно "машина состояний", которая полюбому ресетится вместе со всем мэкэ.
б). Внутре еепром работает тоже стэйтмашина - но другая. Которой насрать на мэкэ вообще и его ресеты в частности, она даже не в курсе, что рядом кого-то ресетят.
в). Если стэйтмашина внутре еепром уже поставлена в плохую позу через не предусмотренные ей движения - вывести её из этого состояния, прежде чем продолжать попытки что-то ещё с ней сделать...
а) Я в курсе :) А ресет я делал банальным передергиванием питания - оригинальный JTAG иногда просит этого, иначе отваливается от студии.

А вообще я работаю с ЕЕПРОМкой через либу от DiHaltа, которая как раз и реализует конечный автомат работы с TWI.
По поводу ожидания окончания записи - ждал на бряке после записи пару секунд. Разве этого недостаточно, что бы самая медленная флеш-память сохранила жалких 16 байт???
0
24.01.2013, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2013, 22:16

Почему пишет при передачи информации через сокеты пишет "индекс находится вне границ массива"
Во время выполнения кода сервера, при получении данных они оказываются пустыми. Кто сможет...

ноут не пишет DVD-R RW CD-R пишет
ноут не пишет DVD-R RW CD-R пишет. в чем проблема подскажите....

DVD дисковод не пишет R-ки а RW-ки пишет
Помогите, я в полном недоразумении. Купил дисковод вот этот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru