Только сейчас вспомнил, это я этот проект перевел на С, и не закончил на асме....
Если что, вот работа с 24C64 на С, если есть понимание языка С, можно легко на асме переписать...
Тут работа с 24C64
Спойлер
Код: Выделить всё
//#######################################################################################################################
//#
//# ФУНКЦИИ РАБОТЫ С ПАМЯТЬЮ 24C64
//#
//#######################################################################################################################
//ФУНКЦИЯ АДРЕСАЦИИ ПАМЯТИ 24C64 (установка внутреннего указателя)
//АРГУМЕНТ - адрес в EEPROM
void IICMemAdr (int EEAdr)
{
do {
IICStart ();
}
while (IICByteWrite (0xA0)); //писать в EEPROM
IICByteWrite ((uint8_t) (EEAdr >> 8)); //старший байт адреса блока данных
IICByteWrite ((uint8_t) EEAdr); //младший байт адреса блока данных
}
//ФУНКЦИЯ ЧТЕНИЯ БАЙТА ДАННЫХ ИЗ МС 24C64
//АРГУМЕНТ - адрес байта данных в EEPROM
//ЗНАЧЕНИЕ - байт данных
char IICMemReadByte (int EEAdrRead)
{
IICMemAdr (EEAdrRead);
IICStart ();
IICByteWrite (0xA1); //читать из EEPROM
char temp = IICByteRead (1); //читаем данные (без подтверждения)
IICStop ();
return temp;
}
//ФУНКЦИЯ ЗАПИСИ БАЙТА ДАННЫХ В МС 24C64
//АРГУМЕНТ_1 - адрес байта данных в EEPROM
//АРГУМЕНТ_2 - байт данных
void IICMemWriteByte (int EEAdrWrite, char byte)
{
IICMemAdr (EEAdrWrite);
IICByteWrite (byte); //пишем данные
IICStop ();
}
//ФУНКЦИЯ ЧТЕНИЯ БЛОКА ДАННЫХ ИЗ МС 24C64
//АРГУМЕНТ_1 - указатель на адрес загрузки в SRAM
//АРГУМЕНТ_2 - адрес начала блока данных в EEPROM
//АРГУМЕНТ_3 - длина блока данных
void IICMemReadData (char* pAdrLoad, unsigned int EEAdrRead, unsigned int length)
{
IICMemAdr (EEAdrRead); //установка внутреннего указателя
IICStart ();
IICByteWrite (0xA1); //читать EEPROM
while (1){
char temp;
if (--length)
temp = IICByteRead (0); //читаем данные с подтверждением
else
temp = IICByteRead (1); //читаем данные без подтверждения (последний байт)
*pAdrLoad++ = temp;
if (! length){
IICStop ();
return;
}
}
}
//ФУНКЦИЯ ЗАПИСИ БЛОКА ДАННЫХ В МС 24C64
//АРГУМЕНТ_1 - указатель на адрес чтения из SRAM
//АРГУМЕНТ_2 - адрес начала блока данных в EEPROM
//АРГУМЕНТ_3 - длина блока данных
void IICMemWriteData (char* pAdrSave, unsigned int EEAdrWrite, unsigned int length)
{
while (1){
IICMemAdr (EEAdrWrite);
do{
IICByteWrite (*pAdrSave ++); //пишем данные в цикле
EEAdrWrite ++;
if (-- length == 0){ //если указанная длина блока исчерпана - выход
IICStop ();
return;
}
}
while ((char) EEAdrWrite & 0x1f); //проверка на выход из 32-х байтной страницы
IICStop ();
}
} Спойлер
Код: Выделить всё
//#######################################################################################################################
//#
//# ФУНКЦИИ ОБСЛУЖИВАНИЯ ИНТЕРФЕЙСА I2C (софтовый вариант)
//#
//#######################################################################################################################
//задержка 2 микросекунды для формированя временных задержек IIC
NOINLINE void Delay2Mks (void)
{
_delay_us (2);
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ START ПО ИНТЕРФЕЙСУ IIC
void IICStart (void)
{
IICDDR &= ~(IICData | IICClc);
Delay2Mks();
IICDDR |= IICData; //подтяжка data к нулю
Delay2Mks();
IICDDR |= IICClc; //подтяжка clc к нулю
Delay2Mks();
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ STOP ПО ИНТЕРФЕЙСУ IIC
void IICStop (void)
{
IICDDR |= (IICData | IICClc);
Delay2Mks();
IICDDR &= ~IICClc; //подтяжка data к нулю
Delay2Mks();
IICDDR &= ~IICData; //подтяжка clc к нулю
Delay2Mks();
}
//ФУНКЦИЯ ЗАПИСИ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - байт данных для вывода по IIC
//ЗНАЧЕНИЕ - флаг подтверждения 0 (есть подтверждение) или 1 (нет подтверждения)
char IICByteWrite (char byte)
{
for (char i = 0; i<8; i++)
byte = IICBit (byte);
byte = 0x80;
return IICBit (byte); //возвращаем бит подтверждения (0-есть бит подтверждения, 1-нет)
}
//ФУНКЦИЯ ЧТЕНИЯ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - значение бита подтверждения (0 - есть подтверждение, 1 - нет подтверждения)
//ЗНАЧЕНИЕ - принятый байт
char IICByteRead (char bit)
{
char byte = 0xFF;
for (char i = 0; i<8; i++)
byte = IICBit (byte);
bit <<= 7;
IICBit (bit); //передать значение бита подтверждения
return byte; //возвращаем принятый байт
}
//ФУНКЦИЯ ЗАПИСИ\ЧТЕНИЯ БИТА ПО ИНТЕРФЕЙСУ IIC
//выводится значение старшего бита аргумента
//принятый бит возвращается в младшем бите предварительно сдвинутого влево аргумента
char IICBit (char byte)
{
if (byte & 0x80) //выводимый бит
IICDDR &= ~IICData; //вывод 1 на линию данных
else
IICDDR |= IICData; //вывод 0 на линию данных
Delay2Mks();
IICDDR &= ~IICClc; //старт строб импульса
while (! (IICPIN & IICClc)){} //ожидание формирования строба
Delay2Mks();
char temp;
if (IICPIN & IICData) //принимаем бит
temp = 1;
else
temp = 0;
IICDDR |= IICClc; //завершить строб
byte <<= 1;
byte |= temp;
return byte;
}


