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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Внешняя I2C EEPROM 24AA1025
Сергей Борщ
сообщение Jul 22 2011, 10:39
Сообщение #16


Гуру
******

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



QUOTE (Pavel_Bor @ Jul 22 2011, 12:42) *
Выходит что на линии всегда висит единица, кроме тех моментов, когда микросхема или контроллер формируют ноль?
Чтобы выдавать единицу достаточно направление порта сделать входом с включенной подтяжкой? (Вот здесь OUT=1)?
Да! И включать подтяжку не надо - подтяжка должна быть внешняя. Поэтому и получается, что OUT=1 никогда не происходит.
QUOTE (Pavel_Bor @ Jul 22 2011, 12:42) *
Получается что смысла в инициализации тогда тоже нет.
Ну, при общей настройке портов нужно настроить эти линии на ввод и прописать в OUT 0, собственно и все.
QUOTE (Pavel_Bor @ Jul 22 2011, 12:42) *
А как насчет вот этих строк

Я думаю здесь ошибка.
Так глубоко еще ваш код не смотрел. Сейчас подумаю.


QUOTE (Pavel_Bor @ Jul 22 2011, 12:42) *
CODE
b = (PORTD.IN&(SERIAL_FLASH_DATA));                 // При записи
Ну вот тут явно ошибка, должно быть b = PORTD.IN & (1 << SERIAL_FLASH_DATA);


--------------------
На любой вопрос даю любой ответ
"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
Pavel_Bor
сообщение Jul 22 2011, 10:54
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



вот и причина плавающих данных с одного места..
После исправления этой ошибки получил все нули. и не одного АСК.
Щас еще доделаю с in и out и отпишусь.

Сообщение отредактировал Pavel_Bor - Jul 22 2011, 10:57
Go to the top of the page
 
+Quote Post
Pavel_Bor
сообщение Jul 22 2011, 11:58
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Изменил код, пока безрезультатно.

CODE
#define I2C_SDL_LO PORTD.DIRSET=(1<<SERIAL_FLASH_DATA);
#define I2C_SDL_HI PORTD.DIRCLR=(1<<SERIAL_FLASH_DATA);

#define I2C_SCL_LO PORTD.DIRSET=(1<<SERIAL_FLASH_SCL);
#define I2C_SCL_HI PORTD.DIRCLR=(1<<SERIAL_FLASH_SCL);

#define PULL_SDL_OFF PORTD.OUTCLR=(1<<SERIAL_FLASH_DATA);
#define PULL_SCL_OFF PORTD.OUTCLR=(1<<SERIAL_FLASH_DATA);

void i2cInit(void)
{
PULL_SDL_OFF;
PULL_SCL_OFF;
I2C_SDL_HI; // set I/O state and pull-ups
I2C_SCL_HI; // set I/O state and pull-ups
}

uint8_t i2cGetbyte(uint8_t last)
{
int i;
uint8_t b = 0;

I2C_SDL_HI; // make sure pullups are activated

for(i=7;i>=0;i--)
{
HDEL;
I2C_SCL_HI; // clock HI
if((PORTD.IN&(1<<SERIAL_FLASH_DATA))!=0){ b |= 1;}
b <<= 1;
HDEL;
I2C_SCL_LO; // clock LO
}

HDEL;
if (last)
I2C_SDL_HI; // set NAK
else
I2C_SDL_LO; // set ACK

I2C_SCL_TOGGLE; // clock pulse
// I2C_SDL_HI; // leave with SDL HI
return b; // return received byte
}

bool i2cPutbyte(uint8_t cool.gif
{
int8_t i;
uint8_t j;
j=0x80;
for (i=7;i>=0;i--)
{
if ( b & j )
I2C_SDL_HI;
else
I2C_SDL_LO; // address bit
I2C_SCL_TOGGLE; // clock HI, delay, then LO
j >>= 1;
}
I2C_SDL_HI; // leave SDL
HDEL;
I2C_SCL_HI; // clock back up
HDEL;
b = (PORTD.IN&(1<<SERIAL_FLASH_DATA)); // get the ACK bit
rtcTime.status=b;
I2C_SCL_LO; // not really ??

HDEL;
return (b == 0); // return ACK value
}


Научитесь оформлять длинные коды в тэги codebox и следите за шириной текста воизбежание горизонтального скроллинга!
Модератор


Сообщение отредактировал IgorKossak - Jul 22 2011, 20:45
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 22 2011, 13:35
Сообщение #19


Гуру
******

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



QUOTE (Pavel_Bor @ Jul 22 2011, 14:58) *
CODE
        if((PORTD.IN&(1<<SERIAL_FLASH_DATA))!=0){ b |= 1;}
        b <<= 1;
Вот эти две строчки надо бы поменять местами. И как сейчас выглядят старт/стоп?


--------------------
На любой вопрос даю любой ответ
"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
Pavel_Bor
сообщение Jul 25 2011, 05:48
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 15-04-10
Из: Украина
Пользователь №: 56 660



Цитата(Сергей Борщ @ Jul 22 2011, 16:35) *
Вот эти две строчки надо бы поменять местами. И как сейчас выглядят старт/стоп?

точно.

#define I2C_START I2C_SCL_HI;I2C_SDL_LO; QDEL; I2C_SCL_LO;
#define I2C_STOP HDEL; I2C_SCL_HI; QDEL; I2C_SDL_HI; HDEL;

Зашел отладчиком в код. Вроде адекватно выполняются действия, кроме

Код
unsigned char i2cPutbyte(unsigned char b)
{
    ....................
      b = (PORTD.IN&(PIN4_bm));                // Не могу поймать АСК, линия всегда равна 1.
        .........
}
]

Сообщение отредактировал Pavel_Bor - Jul 25 2011, 13:52
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st August 2025 - 22:17
Рейтинг@Mail.ru


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