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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> вопрос по инициализации Cirrus EP9307
aaarrr
сообщение Mar 17 2009, 10:07
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(merk0 @ Mar 17 2009, 11:42) *
не нужны ли еще какие-то танцы с бубнами в данном случае?

Нужны, если используется external boot - тогда на EECLK должен быть pull-down, и открытый сток уже не катит.

Цитата(merk0 @ Mar 17 2009, 11:42) *
кстати правильно ли я понимаю, что в случае если порт стоит как "открытый сток", запись единицы - размыкает выходной ключ, и напряжение тянется вверх резистором. а если записать нуль - ключ замыкается - и напряжение падает в нуль?

По идее, да.

У меня почему-то используется EEDrive = 0. Ну, с SCL все понятно, т.к. external boot, а вот зачем SDA в режиме эмуляции открытого коллектора - не помню, хоть убей sad.gif
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 13:20
Сообщение #47


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



Цитата
У меня почему-то используется EEDrive = 0. Ну, с SCL все понятно, т.к. external boot, а вот зачем SDA в режиме эмуляции открытого коллектора - не помню, хоть убей

ну там по стандарту i2c обе линии - монтажное И.
sda видимо потому монтажное и, - чтобы читать например акноледж на посланный байт. тогда в 9 такте мастер делает высокий потенциал на SDA(закрывает свой ключ), а приемник открывает ключ и потенциал становится низким. мастер воспринимает это как подтверждение.

а у вас EEпины используются для I2C?
тогда почему EEDrive=0, в доке написано что для открытого коллектора должна быть единица.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 13:54
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Вы меня не поняли. SDA у меня является открытым коллектором, но сделано это не при помощи установки бита в EEDrive, а вручную. SCL вообще тянется пушпулом, но у меня нет периферии, которая умеет затягивать клок.
Почему я сделал так, а не иначе - не помню.
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 22:46
Сообщение #49


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



нашел какие-то мутные непонятки с этими пинами в связи с реализацией I2C
1. проц является мастером и потому дает клоки. также его эти две ноги стоят в положении открытый коллектор.
2. попытка изменить пины 0,1 в регистре G приводит к читке регистра, изменению бита и записи обратно в регистр. Но при чтении регистра порта читаются не значения туда прописанные, а значения стоящие на ногах проца(которые могут отличаться от прописанных в порт, в силу монтажного И). таким образом например запись в первый бит(DATA) регистра G, может привести к сбросу в нуль значения записанного в бит 0 (CLOCK)(потому что клок удерживался слейвом в это время на нуле).
то есть нужно иметь локальную переменную(якобы регистр порта), все битовые работы делать с ней, а потом, просто писать в порт эту перемнную(байт), физически не читая его.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 22:51
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А что у Вас на I2C висит? Может, не стоит и напрягаться?
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 23:13
Сообщение #51


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



там висит DS1339U - часы. но также i2с выходит на разьемы, куда будут вставленые всякие умные устройства...
так что напрягаться нужно по полной, протокол должен быть реализован по стандарту.
я вроде его реализовал, но эти часики читаться не хотят(адрес устройства брал из даташита-он верный).
пока я проверяю просто на послдеовательности вида

int ext_rtc_ping()
{
int lb;
i2c_start(); //Start Trasfer
lb=i2c_write (( DS1399_addr<<1) | 1); //Read Data
i2c_stop();
return (lb);
}

функция i2c_write, возвращает акноледж на байт, от слейва(то есть часов). должен быть нуль. возвращает единицу... то есть впечатление такое, что часов просто нет. поскольк они своим ключом должны занулить напрядение на data линии, на девятом клоке, генерируемом мастером.
может опять непропай какой-то...

Сообщение отредактировал merk0 - Mar 17 2009, 23:18
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 23:20
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(merk0 @ Mar 18 2009, 02:13) *
так что напрягаться нужно по полной, протокол должен быть реализован по стандарту.

Ну, совсем по стандарту вряд ли возможно сделать просто на GPIO. Мастер-то хоть один будет?

Можете проверить на этом. Не соответствует спецификации, зато точно работает.
CODE

//******************************************************************************

__inline void i2c_force_scl(void)
{
PGDR &= ~SCL;
}

__inline void i2c_release_scl(void)
{
PGDR |= SCL;
}

__inline void i2c_force_sda(void)
{
PGDR &= ~SDA;
PGDDR |= SDA;
}

__inline void i2c_release_sda(void)
{
PGDDR &= ~SDA;
}

__inline u_int i2c_read_sda(void)
{
return (PGDR & SDA);
}

//******************************************************************************

int i2c_ini(void)
{
// HW
EEDrive = 0x00;
PGDR &= ~SDA;
PGDR |= SCL;
PGDDR &= ~SDA;
PGDDR |= SCL;

return 0;
}

u_int i2c_write_byte(u_int data)
{
u_int a;

for(a = 0; a < 8; a++)
{
i2c_force_scl();
i2c_qp_dly();
data <<= 1;
if(data & (1 << 8)) i2c_release_sda();
else i2c_force_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_hp_dly();
}

i2c_force_scl();
i2c_qp_dly();
i2c_release_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_hp_dly();
if(i2c_read_sda()) return 1;
else return 0;
}

u_int i2c_read_byte(u_int ack)
{
u_int a, data;

data = 0;
for(a = 0; a < 8; a++)
{
i2c_force_scl();
i2c_qp_dly();
i2c_release_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_hp_dly();

data <<= 1;
if(i2c_read_sda()) data |= 1;
}
i2c_force_scl();
i2c_qp_dly();
if(!ack) i2c_force_sda();
else i2c_release_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_hp_dly();

return data;
}

void i2c_start(void)
{
i2c_force_scl();
i2c_qp_dly();
i2c_release_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_qp_dly();

i2c_force_sda();
i2c_hp_dly();
}

void i2c_stop(void)
{
i2c_force_scl();
i2c_qp_dly();
i2c_force_sda();
i2c_qp_dly();
i2c_release_scl();
i2c_qp_dly();
i2c_release_sda();
i2c_qp_dly();
}

void i2c_qp_dly(void)
{
u_int a = 0x80;
while(--a) __asm{nop};
}

void i2c_hp_dly(void)
{
u_int a = 0x100;
while(--a) __asm{nop};
}

//******************************************************************************
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 23:27
Сообщение #53


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



мастер сам проц. все остальные слейвы. если протокол я реализовал верно(но я его уже вылизал, как мог), то впечатление такое, что часы например имеют другой адрес и просто не откликаются. или не запитаны вообще...или их нужно как-то толкнуть...но в даташите таких слов нет. они вроде уж декодировать свой адрес и дать аск должны по любому...
конечно нужно под лупой смотреть двухлучевым осциллом, но такого под рукой нет. а больше никакого другого устройства i2c на плате нет. все остальные будут на разьемах.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 23:31
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Так пройдитесь по всем адресам, если не уверены. Их же всего 128.

А не отключают ли часы I2C интерфейс при разряженой батарейке? У кого-то из далласов такая фича была.
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 23:32
Сообщение #55


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



за код спасибо, щас посмотрю его глазами.. он для пинов - открытых коллекторов? если нет - то работать не должен.

Цитата
У кого-то из далласов такая фича была.

гм..а вот это надо проверить... smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 23:32
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет, открытый коллектор только на SDA. Работать должен в любом случае.
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 17 2009, 23:49
Сообщение #57


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



а у вас EEdrive = 0;
то есть по даташиту - это не open drain. Это драйвер от вашей схемы?

Цитата
__inline void i2c_force_sda(void)
{
PGDR &= ~SDA;
PGDDR |= SDA;
}

вопрос - а зачем играть с битом направления порта(можно конечно), если читка из порта стоящего на вывод, все равно читает напряжение на физических пинах?
я просто ставлю ногу в высокий потенциал(размыкаю ключ), и читаю. может конечно тут собака у меня и порылась...?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2009, 23:51
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да, у меня сделана программная эмуляция open drain на SDA (ну да, через бит направления порта), и использован обычный выход SCL.

А про отключение интерфейса я малость напутал - это в DS1307 он отключается, когда VCC становится меньше 1.25 * Vbat sad.gif
Go to the top of the page
 
+Quote Post
merk0
сообщение Mar 18 2009, 00:01
Сообщение #59


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-05-05
Пользователь №: 4 763



Цитата
Да, у меня сделана программная эмуляция open drain на SDA (ну да, через бит направления порта), и использован обычный выход SCL.

А не опасно так эмулировать opendrain??? если SDA - обычный драйвер - то что будет если проц его выставил в в единицу(то есть замкнул ключ на питание - если там выходные драйверы такие), а слейв коротнул свои ключом эту линию на нуль? и будет типа КЗ. чот исключено если таки выходы стоят в честном opendrain.
аналогично и на scl.

scl по теории, при затяжке низкого уровня слейвом, точно привдет к кз, если выход scl проца - обычный.
или я не так вижу железо вообще?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 18 2009, 00:12
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(merk0 @ Mar 18 2009, 03:01) *
А не опасно так эмулировать opendrain??? если SDA - обычный драйвер - то что будет если проц его выставил в в единицу(то есть замкнул ключ на питание - если там выходные драйверы такие), а слейв коротнул свои ключом эту линию на нуль? и будет типа КЗ.

На SDA никогда не выставляется единица - драйвер или выдает 0, или отключен.

Цитата(merk0 @ Mar 18 2009, 03:01) *
scl по теории, при затяжке низкого уровня слейвом, точно привдет к кз, если выход scl проца - обычный.
или я не так вижу железо вообще?

Ну, далеко не все слейвы умеют затягивать SCL. В моей системе таких попросту нет.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:54
Рейтинг@Mail.ru


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