реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> [AtMega48]Не удается работать с 24lc512 при помощи либы Procyon AVRlib
cvv
сообщение Jun 10 2008, 06:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700



после записи i2c eeprom 24lc512 на скорости 400 кбит я читаю не тоже самое что писал. вернее ф-я i2ceepromReadByte возвращает всегда старший байт адреса.
Пример читающего кода:

Код
int main(void)
{      
// Crystal Oscillator division factor: 1

#ifndef __GNUC__
#pragma optsize-
#endif
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
InitChip();
SPI_SlaveInit();
i2cInit();
i2ceepromInit();

asm __volatile__("wdr");

static unsigned short i;
  
for(i=0;; i++)
{
    unsigned char byte;
    byte = i2ceepromReadByte(0, i);

    OutData(_BV(0), digit_value_mask[i      &0x000f]&0x7f);
    OutData(_BV(1), digit_value_mask[(i>>4) &0x000f]&0x7f);
    OutData(_BV(4), digit_value_mask[(i>>8) &0x000f]&0x7f);
    OutData(_BV(5), digit_value_mask[(i>>12)&0x000f]&0x7f);

    OutData(_BV(2), digit_value_mask[byte      &0x0f]&0x7f);
    OutData(_BV(3), digit_value_mask[(byte>>4) &0x0f]&0x7f);

    delay_ms(500);
}


400 кБит выставляется в i2cInit()
все прерывания всегда запрещены так как я понял что для работы i2ceepromReadByte() они не нужны
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 10 2008, 07:13
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(cvv @ Jun 10 2008, 10:43) *
все прерывания всегда запрещены так как я понял что для работы i2ceepromReadByte() они не нужны


Как вы пришли к такому пониманию? Можно услышать логическую цепочку?

Еще в начале функции 'i2cInit' есть код:

Код
00055     // set pull-up resistors on I2C bus pins
00056     // TODO: should #ifdef these
00057     sbi(PORTC, 0);  // i2c SCL on ATmega163,323,16,32,etc
00058     sbi(PORTC, 1);  // i2c SDA on ATmega163,323,16,32,etc
00059     sbi(PORTD, 0);  // i2c SCL on ATmega128,64
00060     sbi(PORTD, 1);  // i2c SDA on ATmega128,64


Но в ATmega48 TWI расположен на портах PC4, PC5. у вас есть в схеме подтягивающие регистры?

Анатолий.
Go to the top of the page
 
+Quote Post
cvv
сообщение Jun 10 2008, 08:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700



Схема подключения

Цитата(aesok @ Jun 10 2008, 09:13) *
Еще в начале функции 'i2cInit' есть код:

Код
00055     // set pull-up resistors on I2C bus pins
00056     // TODO: should #ifdef these
00057     sbi(PORTC, 0);  // i2c SCL on ATmega163,323,16,32,etc
00058     sbi(PORTC, 1);  // i2c SDA on ATmega163,323,16,32,etc
00059     sbi(PORTD, 0);  // i2c SCL on ATmega128,64
00060     sbi(PORTD, 1);  // i2c SDA on ATmega128,64


Но в ATmega48 TWI расположен на портах PC4, PC5. у вас есть в схеме подтягивающие регистры?

Анатолий.


у меня в схеме внешние подтягивающие резисторы а упомянутые вами строчки закоментированы как не относящиеся к i2c.

Цитата(aesok @ Jun 10 2008, 09:13) *
Как вы пришли к такому пониманию? Можно услышать логическую цепочку?


например по тому что при входе в соответсвующие ф-и прерывания вырубаются - а при выходе возвращаются:

Код
  
   // disable TWI interrupt
   //cbi(TWCR, TWIE);

...
Код
    // enable TWI interrupt
    //sbi(TWCR, TWIE);
    
    return retval;


или по следующим комментариям например:
Код
//! send I2C data to a device on the bus (non-interrupt based)                                                  
u08 i2cMasterSendNI(u08 deviceAddr, u08 length, u08* data);                                                      
//! receive I2C data from a device on the bus (non-interrupt based)                                              
u08 i2cMasterReceiveNI(u08 deviceAddr, u08 length, u08 *data);


Сообщение отредактировал cvv - Jun 10 2008, 08:22
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 10 2008, 08:40
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Код
byte = i2ceepromReadByte(0, i);


Проверьте адрес EEPROM, по моему тут должен быть полный I2C адрес
byte = i2ceepromReadByte(0xA0,i);

Анатолий.

Сообщение отредактировал aesok - Jun 10 2008, 08:41
Go to the top of the page
 
+Quote Post
cvv
сообщение Jun 10 2008, 09:03
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 3-02-08
Пользователь №: 34 700



Цитата(aesok @ Jun 10 2008, 10:40) *
Код
byte = i2ceepromReadByte(0, i);


Проверьте адрес EEPROM, по моему тут должен быть полный I2C адрес
byte = i2ceepromReadByte(0xA0,i);

Анатолий.

ща проверю. на 99% вы правы.

Поехало. БОЛЬШОЕ СПАСИБО.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 10 2008, 10:53
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(cvv @ Jun 10 2008, 09:43) *
вернее ф-я i2ceepromReadByte возвращает всегда старший байт адреса.
Цитата(cvv @ Jun 10 2008, 13:19) *
Поехало. БОЛЬШОЕ СПАСИБО.
Удивительно. И что, эта библиотека никак не сообщала вам, что микросхема не выдавала ACK на запись адреса? Тогда вас ждут еще сюрпризы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 20:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016