Работа с внешней па...
 
Уведомления
Очистить все

Работа с внешней памятью

11 Посты
2 Пользователи
0 Likes
8,501 Просмотры
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

Господа, окажите помощь новичку. нужно обратиться из микроконтроллера к внешней EEPROM памяти...типа 24С16...осуществить в ней поиск и редактирование. На С исходник если бы увидел был бы благодарен.


Цитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Вот код исходника для работы с внешней памятью at24c16 (по ссылке: http://nav2.livejournal.com/130205.html ):
// Модуль работы с EEPROM AT24c16 (2Kb)
// -----------------------------------------------
#include <89c51rd2.h>

#define SDA P5_4
#define SCL P5_3

static void set_sda(void)
{
SDA = 1;
}

static void clr_sda(void)
{
SDA = 0;
}

static void set_scl(void)
{
SCL = 1;
}

static void clr_scl(void)
{
SCL = 0;
}

static void ee_del(void)
{
int i;
for(i=0;i<20;i++) {};
}

static void ee_start(void)
{
set_sda();
ee_del();
set_scl();
ee_del();

clr_sda();
ee_del();
clr_scl();
ee_del();
}

static void ee_stop(void)
{
clr_sda();
ee_del();

set_scl();
ee_del();

set_sda();
ee_del();
}

static void ee_ack(void)
{
ee_del();

set_sda();
ee_del();

set_scl();

ee_del();
ee_del();
ee_del();
ee_del();

clr_scl();
ee_del();
ee_del();

}

static void ee_ack_w(void)
{
ee_del();

set_sda();
ee_del();

set_scl();

ee_del();
ee_del();
ee_del();
ee_del();

while(SDA != 0 ) {}; // SDA

clr_scl();
ee_del();
ee_del();
}

static void ee_wb(unsigned char wb)
{
unsigned char i;
unsigned char wwb;

wwb = wb;

for(i=0;i<8;i++)
{
if((wwb & (0x80>>i)) == 0 )
{
clr_sda();
}
else
{
set_sda();
}

ee_del();
set_scl();
ee_del();
clr_scl();
ee_del();

}
}

static unsigned char ee_rb(void)
{
unsigned char i;
unsigned char ee_data;

ee_data = 0;
set_sda();

for(i=0;i<8;i++)
{
set_scl();
ee_del();

ee_data = (ee_data << 1) | SDA; //| tmp_p8; /* 254 */

clr_scl();
ee_del();
set_sda();
ee_del();
};

return(ee_data);
}
/*-----------------------------------------------------------*/

void ee_write(unsigned int adr, unsigned char wb)
{
unsigned char adrL;
unsigned char adrH;
unsigned int i;

ee_start();

adrL = adr & 0xff;
adrH = (((adr >> 8) << 1) & 0x0E) | 0xA0;

ee_wb(adrH);
ee_ack();

ee_wb(adrL);
ee_ack();

ee_wb(wb);
ee_ack();

ee_stop();

for(i=0;i<5000;i++){}
}

/* ------------------------------------------------ */

unsigned char ee_read(unsigned int adr)
{
unsigned char adrL;
unsigned char adrH;
unsigned char rb;

ee_start();

adrL = adr & 0xff;
adrH = (((adr >> 8) << 1) & 0x0E) | 0xA0;

ee_wb(adrH);
ee_ack();

ee_wb(adrL);
ee_ack();

ee_del();

ee_stop();

ee_del();

ee_start();

adrH = (((adr >> 8) << 1) & 0x0E) | 0xA1;

ee_wb(adrH);
ee_ack();

ee_del();
rb = ee_rb();
ee_ack();
ee_stop();

return(rb);
}


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

Спасибо!!!! Оперативно ответили :D Буду разбираться.


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Сейчас глянул книжку, на полке стояла "Конструирование устройств на микроконтроллерах", автор Белов А.В.
В ней описана работа с внешней EEPROM памятью с интерфейсом I2C. Есть исходники, но правда на ассемблере. Я думаю, данная книга (особенно стр. 113-160) может очень помочь в освоении EEPROM памяти типа 24С***. ;)


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

нашел книгу белова...спасибо за подсказку...асма так асма :) расскажу если что получится


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

Здравствуйте, коллеги!! с кодом вроде разобрался с вашей помощью...помогли книги Белова в том числе. Дошла очередь до сборки. в общем надо соединить attiny2313 (остановился на нем, потому что программатор готовый есть) и eeprom 24C16. понимаю что надо соединить соответсвующие выводы SDA и SCL друг с другом и подать питание.... может посоветуете как сделать правильно


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Ножки микросхемы памяти 24C16 надо подключать к микроконтроллеру ATtiny2313 следующим образом:
SDA к 17 ножке микроконтроллера (PB5),
SCL к 19 ноге (PB7).
Вот и все, начинайте писать исходник. Если будут вопросы - задавайте.


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

Понятно....к 4 и 8 ножке eeprom подаю питание, а ножки 1,2,3 и 7 остаются неподключенными. к микроконтроллеру подаю питание к 20 и 10 ножке,а остальные не подключенные. так? кварц наверно можно использовать встроенный?


ОтветитьЦитата
Radioded
(@sergey)
Estimable Member Admin
Присоединился: 5 лет назад
Сообщения: 184
 

Да, кварц проще использовать встроенный (точнее RC-цепочку).
Судя по даташиту на память от фирмы ATMEL - AT24C16.
Ножки A0, A1, A2 (1-3 ноги микросхемы) лучше подтянуть к напряжению питания или к земле (насколько я помню они позволяют адресовать несколько микросхем памяти на одной шине I2C).
Ножка WP (седьмая нога) должна быть подключена к земле, для разрешения записи в память.
Всё это по даташиту: http://www.datasheetcatalog.org/datasheets/208/160469_DS.pdf
(смотрел на сайте http://www.datasheetcatalog.com/datasheets_pdf/2/4/C/1/24C16.shtml )


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

при программировании возникла одна проблемка. в PonyProge изменил значение фьюза CKSEL...он используется для настройки источника тактового сигнала. после этого программатор совсем перестал видеть микроконтроллер. пришлось заливать hex с установленными по умолчанию значениями. У Белова написано что при работе с eeprom частоту надо использовать небольшую. Как мне все таки установить фьюзы (и какие) и не допустить чтобы микроконтроллер перестал "пропадать" для программатора? Заранее спасибо за консультации


ОтветитьЦитата
Rent
 Rent
(@rent)
Active Member
Присоединился: 14 лет назад
Сообщения: 10
Topic starter  

Заработало!!!!!!!!!!!!!!!!!!! :D :D :D


ОтветитьЦитата