AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
02.03.2014, 22:32
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Помогите найти функции чтения-записи для 24с64
Друзья,
Atmega8 соединен с 24 с16 по I2C .Между ними идет нормальный обмен сигналами
используя нижемледующие функции чтения -записи:
-------------------------------------------------------------------------------------------------------------------
unsigned int eep_read(unsigned int address)
{
unsigned char data;
i2c_start();
i2c_write((EEPROM_BUS_ADDRESS | ((address››7) & 0x0E)));
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}
//-------------------------------------------------------------------------------------------------------------------
void eep_write(unsigned int address, unsigned char data)
{
i2c_start();
i2c_write((EEPROM_BUS_ADDRESS | ((address››7) & 0x0E)));
i2c_write(address);
i2c_write(data);
i2c_stop();
}
Для 24C64 эти функции не работают.
Все попытки найти их самостояиельно не увенчались успехом.
Самому составить их по даташиту Я не в состоянии.
Буду очень благодарен за предоставление информации по указанным функциям.
|
|
|
|
02.03.2014, 23:03
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Код:
|
u8 I2C_24C_EEPROM_Write_Page_ByLen (u8 I2c_Address, u16 Mem_Address, char * pBuffer, u16 Len)
{
u8 err;
u8 PagesWritten = 0;
u8 BytesToWrite;
while (Len)
{
if (Len‹MaxPageSizeBytes)
{
BytesToWrite = Len;
Len = 0;
}
else
{
BytesToWrite = MaxPageSizeBytes;
PagesWritten++;
Len-= MaxPageSizeBytes;
}
err=I2c_Start(EEPROM_I2Cx);
if (err) return err;
err=I2c_WriteAddress(EEPROM_I2Cx, I2c_Address);
if (err) return err;
I2c_WriteByte(EEPROM_I2Cx, (0xFF00&Mem_Address)››8);
I2c_WriteByte(EEPROM_I2Cx, 0x00FF&Mem_Address);
while (BytesToWrite--) I2c_WriteByte(EEPROM_I2Cx, * pBuffer++);
I2c_Stop(EEPROM_I2Cx);
delay_ms(I2c_EEPROM_WriteTime_ms);
Mem_Address+= MaxPageSizeBytes;
}
return I2c_Success;
}
u8 I2C_24C_EEPROM_Read_Byte (u8 I2c_Address, u16 Mem_Address, char * pBuffer)
{
u8 err;
err=I2c_Start(EEPROM_I2Cx);
if (err) return err;
err=I2c_WriteAddress(EEPROM_I2Cx, I2c_Address);
if (err) return err;
I2c_WriteByte(EEPROM_I2Cx, (0xFF00&Mem_Address)››8);
I2c_WriteByte(EEPROM_I2Cx, 0xFF&Mem_Address);
I2c_ReStart(EEPROM_I2Cx);
I2c_NACK(EEPROM_I2Cx);
I2c_WriteAddress(EEPROM_I2Cx, I2c_Address|1);
* pBuffer = I2c_ReadByte(EEPROM_I2Cx);
I2c_Stop(EEPROM_I2Cx);
I2c_ACK(EEPROM_I2Cx);
return I2c_Success;
}
u8 I2C_24C_EEPROM_Read_Page (u8 I2c_Address, u16 Mem_Address, char * pBuffer, u8 pBufferSize)
{
u8 err=0;
I2c_ACK(EEPROM_I2Cx);
err=I2c_Start(EEPROM_I2Cx);
if (err) return err;
err=I2c_WriteAddress(EEPROM_I2Cx, I2c_Address);
if (err) return err;
I2c_WriteByte(EEPROM_I2Cx, (0xFF00&Mem_Address)››8);
I2c_WriteByte(EEPROM_I2Cx, 0xFF&Mem_Address);
I2c_ReStart(EEPROM_I2Cx);
I2c_WriteAddress(EEPROM_I2Cx, I2c_Address|1);
I2c_ACK(EEPROM_I2Cx);
while (pBufferSize)
{
* pBuffer++ = I2c_ReadByte(EEPROM_I2Cx);
pBufferSize--;
if (!pBufferSize) I2c_NACK(EEPROM_I2Cx);
}
I2c_Stop(EEPROM_I2Cx);
return I2c_Success;
} |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Easyrider83 за это сообщение:
|
|
|
02.03.2014, 23:36
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Благодарю за оперативный ответ.
Извиняюсь за вопрос, а в CVAVR эти функции будут работать?, или их надо конвертировать?
|
|
|
|
02.03.2014, 23:46
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Эти функции будут работать в любом С компиляторе.
|
|
|
|
02.03.2014, 23:56
|
|
Частый гость
Регистрация: 19.08.2004
Сообщений: 33
Сказал спасибо: 6
Сказали Спасибо 11 раз(а) в 9 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Цитата:
|
(0xFF00&Mem_Address)››8
|
мнэээ... гуманитарий писал?
|
|
|
|
03.03.2014, 08:37
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 870
Сказал спасибо: 231
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
уважаемый Easyrider83
если вас это не затруднит можно попросить подкинуть строчку примера как записать байт в 24с64 в cvavr на СИ, используя приведенные вами функции.
С чтентем бы я сам разобрался.
|
|
|
|
03.03.2014, 09:40
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2009
Сообщений: 609
Сказал спасибо: 37
Сказали Спасибо 140 раз(а) в 72 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
begun, http://serg22.sibgtu.ru/radio/24c64_atmega32.zip
найдено где-то на просторах. под аврстудию.
Ввиду того, что всеми силами стараюсь слезть с cvavr, вспоминать и переписывать не буду.
|
|
|
|
03.03.2014, 10:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Прошу прощения у автора, что лезу в его код.
Ну как бы вырезать кусочек,
PHP код:
|
u8 I2C_24C_EEPROM_Write_Byte (u8 I2c_Address, u16 Mem_Address, char Dat)
{
u8 err;
err=I2c_Start(EEPROM_I2Cx);
if (err) return err;
err=I2c_WriteAddress(EEPROM_I2Cx, I2c_Address);
if (err) return err;
I2c_WriteByte(EEPROM_I2Cx, (0xFF00&Mem_Address)››8);
I2c_WriteByte(EEPROM_I2Cx, 0x00FF&Mem_Address);
I2c_WriteByte(EEPROM_I2Cx, Dat);
I2c_Stop(EEPROM_I2Cx);
delay_ms(I2c_EEPROM_WriteTime_ms);
return I2c_Success;
}
|
|
|
|
|
03.03.2014, 10:58
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
С байтом там проблем никаких нет. А вот страничная запись - это тот еще финт ушами. Я написал на одной локальной переменной, которая листает страницы. Но работает корректно только в том случае, если писать с начала страницы. В противном случае там еще надо пару строчек добавить. Иначе цикличная запись угрохает данные в начале страницы. В общем, у автора ошибка лишь в том, что он адрес ячейки передает один раз - 8 бит. А у 64ой адреса двухбайтовые. Сначала старший, затем младший. Можно было ему просто одну строчку добавить, но тогда он бы никогда ничему не научился и я решил по вредничать.
|
|
|
|
03.03.2014, 12:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: помогите найти функции чтения-записи для 24с64
Дык она внутри при записи старницы с адресом играет токо на 5 младших битах. Как белка в колесе бегает по одной и той же странице.
При записи как бы вот так модифицирует адрес.
Adrress= (Adrress & (~0x1f) ) | ( (Adrres++) & 0x1f).
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:49.
|
|