Доработка библиотеки EEPROM 24LC256 для 2-х байт переменных

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Ср дек 05, 2018 23:10:34

Сообщение CAT86 »

Привет всем. Кто может доработать стандартную библиотеку EEPROM 24LC256 что бы можно было сохранять int data=745; Очень нужно :shock:

Код: Выделить всё

/* now you can include the I2C Functions */
#include <i2c.h>

/* function declaration for delay_ms */
#include <delay.h>

#define EEPROM_BUS_ADDRESS 0xa0      // Tyt stavim adress for EEPROM 

/* read a byte from the EEPROM */
unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address_high);
i2c_write(address_low);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

/* write a byte to the EEPROM */
void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data) {
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address_high);
i2c_write(address_low);
i2c_write(data);
i2c_stop();
/* 10ms delay to complete the write operation */
delay_ms(7);
}

Код: Выделить всё

#ifndef _24lcxx_INCLUDED_
#define _24lcxx_INCLUDED_

#pragma used+

/* read a byte from the EEPROM */
unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low);

/* write a byte to the EEPROM */
void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data);

#pragma used-

#pragma library 24lcxx.lib

#endif
Вот я где то скопи-пастер код:

Код: Выделить всё

unsigned int EEPROM_read_int(unsigned int addr) {    
  unsigned char buf[2];
  unsigned char i;
  
  for( i = 0; i < 2; i++ ) buf[i] = EEPROM_read(addr+i);
  unsigned int &num = (unsigned int&)buf;
  return num;

Код: Выделить всё

void EEPROM_write_int(unsigned int addr, unsigned int num) {
  unsigned char buf[2];
  unsigned char i;
  
  (unsigned int&)buf = num;
  for( i = 0; i < 2; i++ ) EEPROM_write(addr+i, buf[i]);
}
Реклама
Самсусамыч

Сообщение Самсусамыч »

По шине I2C данные передаются по байтно… то есть data должна быть однобайтовой переменной (зависит от алгоритма библиотеки), а в неё последовательно перед отправкой очередного байта необходимо помещать отправляемый байт. Окончание передачи определяется командой СТОП. Пока ведущее устройство не отправит команду СТОП, ведомое устройство будет принимать байты сохраняя их последовательно в ячейки начиная с ранее указанного ведущим адреса.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18677
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Код: Выделить всё

// чтение блока данных
// addr - 16-бит адреса начала блока данных в микросхеме памяти
// dest - указатель на принимающий буффер
// count - количество читамых байтов
void i2c_read_block(uint16_t addr, uint8_t *dest, uint8_t count){
   i2c_start();
   i2c_write(EEPROM_BUS_ADDRESS);
   i2c_write(addr >> 8);
   i2c_write(addr);
   i2c_start();
   i2c_write(EEPROM_BUS_ADDRESS | 1);
   while (count--) *dest++ = i2c_read(0);
   i2c_stop();   
}

// чтение переменной типа int
int var;

i2c_read_block(125, &var, sizeof(int));
аналогично сделать и запись - это сами уже.

однако, помните, что запись во всех микросхемах i2c ведется постранично, поэтому надо следить, чтобы блок записываемых данных не пересекал границу страницы. если все-таки пересекает, то писать его надо частями.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Ср дек 05, 2018 23:10:34

Сообщение CAT86 »

Привет ARV. я ни когда не работал с внешней еепром, по этому прошу помощь зала :))
Нужно собрать библиотеку, что бы в будущем удобно было пользоваться.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

У Вас есть функции для работы с байтом. В чём сложность сделать "тупо в лоб" - разбить Ваши записываемые/читаемые данные на байты и работать с ними по-отдельности ?
Вы не знаете как сделать цикл ? Вы не знаете как разбить данные на байты ? Вы не сможете создать функцию, удовлетворяющую Ваши требования ?
Как Вы тогда вообще собрались писать программу ? :dont_know:
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Ср дек 05, 2018 23:10:34

Сообщение CAT86 »

Привет Alex. я могу написать функцию, сделать цикл. Просто сейчас вообще нет времени разбираться. Вы можете мне помочь с библиотекой?
Пишите в личку.
Реклама
Ответить

Вернуться в «AVR»