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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> STM32F050 I2C, не работает
Сергей Борщ
сообщение Jun 19 2014, 13:13
Сообщение #31


Гуру
******

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



Цитата(glags @ Jun 19 2014, 14:49) *
Вы имеете "логическое ИЛИ" ?. Так я это делаю чтоб SWD порт не потерять.
А если в битах для конфигурируемых ног уже были единицы в ненужных местах? Некоторые ноги при включении питания содержат отнюдь не нули в этих регистрах. Вы их пытаетесь перевести в режим альтернативной функции, но если он был перед этим настроен на вывод - вы переведете его в аналоговый режим. То есть даже если сейчас все и заработает, то потом дописав настройку этой ноги на вывод где-то в начале (не знаю зачем - например для организации сброса зависшего автомата ведомого выдачей 9 тактов ручным маханием ногами) вы получите эффект отваливания I2C в совершенно другом, никак не связанном с этим дописанным кодом месте. Мы ведь не знаем, что у вас там в начале программы творится, просто видим лежащую на ровном месте граблю, которую подложил себе человек, съевший собаку.
Я, честно говоря, не понимаю - что мешает прописать весь регистр один раз целиком, задав одной записью необходимое состояние сразу всех ног? Аналогично и с остальными регистрами при инициализации - вы же знаете, что было записано в этот регистр (или вам не нужно предыдущее состояние в начале инициализации). Так запишите еще раз этот регистр полностью, но с измененными нужными битами. А вот если потребовалось изменить группу битов в регистре, состояние которого не может быть известно точно - тогда надо позаботиться о правильном состоянии всех битов. И не двумя операциями - сбросом и установкой, ведь в этом случае вы между этими операциями переводите регистр в совершенно ненужное состояние, а считыванием во временную переменную, изменением группы бит в этой переменной и записью назад в регистр за один раз уже конечного результата.


--------------------
На любой вопрос даю любой ответ
"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
glags
сообщение Jun 19 2014, 13:38
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



Цитата(Сергей Борщ @ Jun 19 2014, 16:13) *
А если в битах для конфигурируемых ног уже были единицы в ненужных местах? Некоторые ноги при включении питания содержат отнюдь не нули в этих регистрах. Вы их пытаетесь перевести в режим альтернативной функции, но если он был перед этим настроен на вывод - вы переведете его в аналоговый режим. То есть даже если сейчас все и заработает, то потом дописав настройку этой ноги на вывод где-то в начале (не знаю зачем - например для организации сброса зависшего автомата ведомого выдачей 9 тактов ручным маханием ногами) вы получите эффект отваливания I2C в совершенно другом, никак не связанном с этим дописанным кодом месте. Мы ведь не знаем, что у вас там в начале программы творится, просто видим лежащую на ровном месте граблю, которую подложил себе человек, съевший собаку.
Я, честно говоря, не понимаю - что мешает прописать весь регистр один раз целиком, задав одной записью необходимое состояние сразу всех ног? Аналогично и с остальными регистрами при инициализации - вы же знаете, что было записано в этот регистр (или вам не нужно предыдущее состояние в начале инициализации). Так запишите еще раз этот регистр полностью, но с измененными нужными битами. А вот если потребовалось изменить группу битов в регистре, состояние которого не может быть известно точно - тогда надо позаботиться о правильном состоянии всех битов. И не двумя операциями - сбросом и установкой, ведь в этом случае вы между этими операциями переводите регистр в совершенно ненужное состояние, а считыванием во временную переменную, изменением группы бит в этой переменной и записью назад в регистр за один раз уже конечного результата.

Здесь я с Вами полностью согласен и поддерживаю. Я раньше так и делал, но пару раз по ошибке запорол SWD и после этого я делаю инит всех устройств в начале проги учитывая состояние регистров по умолчанию из даташита. При чём я не пользуюсь при этой методе сторонними библиотеками, а всегда пишу свои. По этому я знаю какой бит в каком регистре установлен. И в своих библиотеках я не делаю инициализации устройств, она у меня всегда в начале программы и если мне надо что-то с устройствами сделать, то я лезу туда. sm.gif
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 19 2014, 18:16
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
И не двумя операциями - сбросом и установкой, ведь в этом случае вы между этими операциями переводите регистр в совершенно ненужное состояние, а считыванием во временную переменную, изменением группы бит в этой переменной и записью назад в регистр за один раз уже конечного результата.


Интересное замечание, всегда делал через 2 операции. Надо будет запомнить, спасибо...
Go to the top of the page
 
+Quote Post
glags
сообщение Jun 19 2014, 19:26
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



Интерфейс наконец то ожил.
Но стопор получается после передачи номера регистра.
Код
    uint_fast16_t I2C(void)
    {   uint32_t i;
        while ((I2C1->ISR & I2C_ISR_TXE)==0);    //while TXE ==0, buffer is full
        // Задать адрес приёмника и длину данных
        i=I2C1->CR2;
        i &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
        i |= ((0x90 & I2C_CR2_SADD) | ((1 << 16 ) & I2C_CR2_NBYTES) | I2C_CR2_RELOAD | I2C_CR2_START);
        I2C1->CR2=i;
        while ( (I2C1 -> ISR & I2C_ISR_TXIS) == 0);
         I2C1->TXDR = 0;//Передача номера регистра для чтения из STLM75
         while ((I2C1->ISR & I2C_ISR_TCR)==0);//ждём окончание передачи
    i=I2C1->CR2;
    i &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
    i |= ((0x90 & I2C_CR2_SADD) | ((2 << 16 ) & I2C_CR2_NBYTES) | I2C_CR2_RELOAD | I2C_CR2_RD_WRN | I2C_CR2_START);
    I2C1->CR2=i;
    while ( ( I2C1 -> ISR & I2C_ISR_RXNE ) == 0);//Виснет ТУТ!!!!!!!!!!!!
    i=I2C1->RXDR;
     i<<=8;
     while ( ( I2C1 -> ISR & I2C_ISR_RXNE ) == 0);
    i |=I2C1->RXDR;
         I2C1->CR2|=(90<<0)|(1<<16)| I2C_CR2_RELOAD;    //address SLAVE 7bits
         I2C1->CR2 &=~ I2C_CR2_RD_WRN;  //write
         I2C1->CR2 |= I2C_CR2_STOP; // Stop Transmit
        while ( ( I2C1 -> ISR & I2C_ISR_STOPF ) == 0 );
        I2C1 -> ICR = I2C_ICR_STOPCF;
        return i;}

Ниже привожу осцилограмку жёлтый данные, а синий синхро.


Сообщение отредактировал glags - Jun 19 2014, 19:27
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 19 2014, 19:33
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



>> Но стопор получается после передачи номера регистра.
все статусы проверяете. не догоню жёлтый луч - это датчик ACK не дал?

Цитата(glags @ Jun 19 2014, 10:19) *
А можно ссылочку на эту библиотеку. sm.gif

угу http://www.st.com/web/en/catalog/tools/PF257884# => http://www.st.com/st-web-ui/static/active/...dperiph_lib.zip
Go to the top of the page
 
+Quote Post
glags
сообщение Jun 19 2014, 19:50
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



Цитата(smalcom @ Jun 19 2014, 22:33) *
>> Но стопор получается после передачи номера регистра.
все статусы проверяете. не догоню жёлтый луч - это датчик ACK не дал?


угу http://www.st.com/web/en/catalog/tools/PF257884# => http://www.st.com/st-web-ui/static/active/...dperiph_lib.zip


Синий лучь в конце в низу это датчик синхру не отпускает. Я проверял отпаивая датчик.
Расшифровывая осцилограмку передаётся 0х90-адрес устройства и вслед 00-номер регистра. Точнее 0х9000. А дальше *опа, датчик держит линию синхронизации.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 19 2014, 21:09
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



>> Ниже привожу осцилограмку жёлтый данные, а синий синхро.
оказывается я очень внимательный человек.

хм, а точно датчик держит?
Go to the top of the page
 
+Quote Post
glags
сообщение Jun 20 2014, 03:59
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782



Цитата(smalcom @ Jun 20 2014, 00:09) *
>> Ниже привожу осцилограмку жёлтый данные, а синий синхро.
оказывается я очень внимательный человек.

хм, а точно датчик держит?

Ну я ж написал, что точно. Я его отпаял и синхра поднялась. Как мне ещё объяснить?
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 20 2014, 04:00
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Да. Датчик. Когда его убирали физически, этого нет, обе линии в 1 возвращаются.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 07:05
Сообщение #40


Гуру
******

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



Сейчас почитаю описание датчика, а пока небольшое замечание по стию.
Вот такую конструкцию
Цитата(glags @ Jun 19 2014, 22:26) *
Код
        while ((I2C1->ISR & I2C_ISR_TXE)==0);    //while TXE ==0, buffer is full
я всегда пишу так:

Код
        while ((I2C1->ISR & I2C_ISR_TXE)==0)     //while TXE ==0, buffer is full
            ;
Это и нагляднее и гораздо меньше вероятность допустить ошибку добавляя в этот цикл, скажем, тестовое махание ногой. Точка с запятой в вашем варианте не бросается в глаза (а именно она является ключевым моментом этого цикла), ее можно забыть поставить или убрать и в цикл случайно попадет следующее выражение или наоборот оно случайно окажется за циклом.

Цитата(glags @ Jun 19 2014, 22:26) *
Интерфейс наконец то ожил.
И в чем была причина? Во-первых нам любопытно, а во вторых, возможно, когда-нибудь на это обсуждение набредет кто-то с точно такой же проблемой и, разумеется, будет рад за вас, но ему информация "наконец-то ожил" не поможет никак. А ведь он будет тратить время, читать ветку... Представляете как ему будет обидно за потраченное на бесполезное чтение время?

Цитата(hd44780 @ Jun 20 2014, 07:00) *
Да. Датчик. Когда его убирали физически, этого нет, обе линии в 1 возвращаются.
Этого не может быть, потому что не может быть никогда:
Цитата
The LM75 operates as a slave on the I2C bus, so the SCL line is an input (no clock is generated by the LM75) and the SDA line is a bi-directional serial data path.


Вы случаем на датчике SDA и SCL не перепутали?


--------------------
На любой вопрос даю любой ответ
"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
smalcom
сообщение Jun 21 2014, 08:28
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Однако вселенная любит пошутить.
У меня сейчас на столе mega168+I2C 24C256C.
Правда память без блокировочных конденсаторов. Пишет по 64 байта только, при отправляемых 128, а при чтении в какойто момент зажимает SDA на землю.
Go to the top of the page
 
+Quote Post
Axel
сообщение Jun 21 2014, 08:55
Сообщение #42


Местный
***

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



Цитата(smalcom @ Jun 21 2014, 11:28) *
Однако вселенная любит пошутить.

Дык вселенная здесь не при чем. Источник шуток наверняка располагается где-то между стулом и клавиатурой. Вас не смущает, что у 24С256 размер страницы 64 байта?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 21 2014, 10:20
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



я её и не обвиняю. действительно, прочитал внимательнее всё, т.к. тестил на разных: у 512/256/128 разный размер страниц.
спасибо sm.gif

ОФФ:
ps. наврано даже на сайте атмел в описании 128-й
на страничке написано, что размер страницы 256 байт, а в доке - 64 байта.
Go to the top of the page
 
+Quote Post
Axel
сообщение Jun 21 2014, 10:37
Сообщение #44


Местный
***

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



Цитата(smalcom @ Jun 21 2014, 13:20) *
sm.gif

rolleyes.gif
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 23 2014, 07:49
Сообщение #45


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



По теме с "зажиманием" сигналов. Столкнулся с похожей ситуацией на АВР. Может и здесь подойдёт.
На самом деле никто и ничего не зажимает. Наступает неопределённое состояние контроллера из-за несвоевременной отправки STOP.
Причиной оказалась опечатка. Последний байт необходимо читать выставив NOACK, а по ошибке устанавливалось ACK. Контроллер
видя это неподобство просто складывал с себя полномочия.
Go to the top of the page
 
+Quote Post

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

 


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


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