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

 
 
 
Reply to this topicStart new topic
> STM32F051 Интерфейс I2C, + ЖКИ RDX0032-GC
Влад Р.
сообщение Jun 27 2013, 14:00
Сообщение #1


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Всем доброго времени суток!

Разбираюсь с I2C на STM32F051. В качействе слейва - ЖКИ RDX0032-GC. Процедура инициализации контроллера предварительно отработана на другом МК.

Шина SDA - на PB7, SCL - на PB6, Reset ЖКИ - на PB0. SDA и SDL к питанию подтянул. Номинал резисторов - 10 кОм.

Тактирую периферию, настраиваю, начинаю обмен и... ничего. Затык на первом же байте данных. Вероятно, неправильно адресую индикатор, но по неимению логического анализатора увидеть, что на самом деле отправляет МК, не могу.

Вот код:
CODE
/* Тактируем порт в/в B */
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;

/* Настраиваем пины */
GPIOB->MODER &= ~(GPIO_MODER_MODER0 | GPIO_MODER_MODER6 | GPIO_MODER_MODER7); // Срасываем настройки режима работы пинов
GPIOB->MODER |= GPIO_MODER_MODER0_0; // Режим выхода
GPIOB->OTYPER &= ~GPIO_OTYPER_OT_0; // Режим двухтактного выхода
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR0; // Отключаем подтягивающие резисторы
GPIOB->MODER |= GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1; // Режим альтернативной функции
GPIOB->OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7; // Режим выхода с открытым стоком

GPIOB->ODR |= GPIO_ODR_0; // Снять сброс
delay_ms(10);

/* Тактируем модуль периферии I2C1 */
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;

/* Включам модуль периферии I2C1 */
I2C1->CR1 &= ~I2C_CR1_PE; // Вылючаем интерфейс I2C
I2C1->CR1 &= ~(I2C_CR1_ANFOFF | I2C_CR1_DFN); // Включаем аналоговый и выключаем
// цировой фильтр шумов
I2C1->TIMINGR = (1<<28) | (0x4<<20) | (0x2<<16) | (0xF<<8) | (0x13<<0); // Настраиваем тайминги (пробовал и др. параметры)
I2C1->CR1 |= I2C_CR1_PE; // Включаем интерфейс I2C
I2C1->CR2 |= (8<<16) | I2C_CR2_AUTOEND | (0x38<<1); // Будет отправлено (записано) 8 байт данных
// и стоп-бит на 7-битный адрес 0b0111000
I2C1->CR2 |= I2C_CR2_START; // Генерируем старт-бит
while (!(I2C1->ISR & I2C_ISR_BUSY)); // Ждем, пока сгенерируется
I2C1->TXDR = 0xEB; // Первый байт инициализации ЖКИ
while (!(I2C1->ISR & I2C_ISR_TXE)); // Ждем освобождения буфера передачи


Библиотеки не предлагать! Надеюсь на вашу помощь sm.gif

Сообщение отредактировал IgorKossak - Jun 27 2013, 15:25
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jun 27 2013, 16:14
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(Влад Р. @ Jun 27 2013, 18:00) *
Всем доброго времени суток!

Разбираюсь с I2C на STM32F051. В качействе слейва - ЖКИ RDX0032-GC. Процедура инициализации контроллера предварительно отработана на другом МК.

Шина SDA - на PB7, SCL - на PB6, Reset ЖКИ - на PB0. SDA и SDL к питанию подтянул. Номинал резисторов - 10 кОм.

Библиотеки не предлагать! Надеюсь на вашу помощь sm.gif



http://subversion.assembla.com/svn/hfreciever/trunk/

http://subversion.assembla.com/svn/hfreciever/trunk/twi.c

Для начала, попробуйте с "ногдрыгательной" ревлизауией (в проекте есть) - убедитесь что аппаратура правильно подключена, затем подключайте аппаратную. К стати, там и инициализация uc1601s есть.

Резисторы подтяжки великоваты... 2.2к для 400 кГц, 4.7к для 100 кГц на практике достаточно. с номиналом 10к сбоит почти всегда.
В проекте I2C для STM32F1xx проверялось, для других STM32 не тестировалось.

Сообщение отредактировал Genadi Zawidowski - Jun 27 2013, 16:18
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 27 2013, 16:36
Сообщение #3


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(Genadi Zawidowski @ Jun 27 2013, 19:14) *
Резисторы подтяжки великоваты... 2.2к для 400 кГц, 4.7к для 100 кГц на практике достаточно. с номиналом 10к сбоит почти всегда.

Извиняюсь, номинал используемых резисторов действительно 4.7 кОм. Подзабыл уже... Давно запаивались.

Цитата(Genadi Zawidowski @ Jun 27 2013, 19:14) *
Для начала, попробуйте с "ногдрыгательной" ревлизауией (в проекте есть) - убедитесь что аппаратура правильно подключена, затем подключайте аппаратную.

Цитата(Влад Р. @ Jun 27 2013, 17:00) *
Библиотеки не предлагать!

Вы извините, но я буду дольше разбираться как вашу библиотеку портировать и не факт, что при этом новых ошибок не наделаю. Давайте исходить из того, что аппаратура подключена правильно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 27 2013, 17:26
Сообщение #4


Гуру
******

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



Цитата(Влад Р. @ Jun 27 2013, 20:36) *
Вы извините, но я буду дольше разбираться как вашу библиотеку портировать и не факт, что при этом новых ошибок не наделаю. Давайте исходить из того, что аппаратура подключена правильно.


Тогда лучше исходить из того что все работает....

Я немного не понял что не работает? Что значит процедура отлажена на другом контроллере? Был другой контроллер который этой последовательностью команд заинициализировал это же экран? Тогда как вы можете не правильно адресовать экран?

Какие средства диагностики есть? Есть возможность осциллографом посмотреть обмен?

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

Ну и обычные вопросы
Порты и периферия затактированы? Частота работы ножек настроена? Уровни выдаются? Яркость экранчика есть? Настроена?

На 534 странице реф мануала вижу несколько другую схему посылки данных.

А именно проверяется TXIS
This bit is set by hardware when the I2Cx_TXDR register is empty and the data to be
transmitted must be written in the I2Cx_TXDR register.

вместо
TXE


не ожидается бит BUSY
BUSY: Bus busy
This flag indicates that a communication is in progress on the bus. It is set by hardware when a
START condition is detected. It is cleared by hardware when a Stop condition is detected, or
when PE=0.


и бит START
This bit is set by software, and cleared by hardware after the Start followed by the address
sequence is sent, by an arbitration loss, by a timeout error detection, or when PE = 0. It can
also be cleared by software by writing ‘1’ to the ADDRCF bit in the I2Cx_ICR register

не можете вы его сами изменять... хотите сбросить надо в ICR регистр писать...



Надо аккуратно отладить обмен данными, а потом уже на экранчик говорить...
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 27 2013, 17:34
Сообщение #5


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(Golikov A. @ Jun 27 2013, 20:06) *
Тогда лучше исходить из того что все работает....

Я немного не понял что не работает? Что значит процедура отлажена на другом контроллере? Был другой контроллер который этой последовательностью команд заинициализировал это же экран? Тогда как вы можете не правильно адресовать экран?

Какие средства диагностики есть? Есть возможность осциллографом посмотреть обмен?

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

Ну и обычные вопросы
Порты и периферия затактированы? Частота работы ножек настроена? Уровни выдаются? Яркость экранчика есть? Настроена?


Итак, по порядку. Что не работает: не взводится флаг пустого буфера передачи. Но в STM32F051 нет флага ACK, поэтому отвечает ли ЖКИ на байт адреса я не могу проверить. А записав в буфер передачи первый байт данных, он не отсылается и буфер не освобожается. Вероятно это происходит потому, что дисплей не подтверждает байт адреса. Говоря о том, что процедура инициализации отлажена на другом МК, я имел в виду, что дисплей рабочий и с контроллера от другого производителя я им управлял. Естественно I2C на нем работает по-дугому и адрес слейва тоже задается по-другому.

Из средств диагностики только мультиметр. Осцилографа нет.

Порты и периферия затактированы - это видно из кода. Частота работы ножек не изменяется - по умолчанию 2 МГц. Что вы имели в виду на счет уровней? Происходит ли что-то на линиях? Да происходит, но невозможно посмотреть что именно. Яркость экранчика... Пока об этом думать рано. Программа висит на передачи первого же байта данных. Но если что, яркость есть и настроить - не проблема.


Цитата(Golikov A. @ Jun 27 2013, 20:06) *
На 534 странице реф мануала вижу несколько другую схему посылки данных.

А именно проверяется TXIS
This bit is set by hardware when the I2Cx_TXDR register is empty and the data to be
transmitted must be written in the I2Cx_TXDR register.

вместо
TXE


не ожидается бит BUSY
BUSY: Bus busy
This flag indicates that a communication is in progress on the bus. It is set by hardware when a
START condition is detected. It is cleared by hardware when a Stop condition is detected, or
when PE=0.


и бит START
This bit is set by software, and cleared by hardware after the Start followed by the address
sequence is sent, by an arbitration loss, by a timeout error detection, or when PE = 0. It can
also be cleared by software by writing ‘1’ to the ADDRCF bit in the I2Cx_ICR register

не можете вы его сами изменять... хотите сбросить надо в ICR регистр писать...



Надо аккуратно отладить обмен данными, а потом уже на экранчик говорить...

Замена TXE на TXIS результата не дает. Ожидание BUSY каши не испортит. Бит START должен сняться аппартно, когда слейв подтвердит адрес. Сам его очищать и не пытаюсь.

Сообщение отредактировал Влад Р. - Jun 27 2013, 18:15
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 27 2013, 19:16
Сообщение #6


Гуру
******

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



а вот это что делает?
I2C1->CR2 |= I2C_CR2_START;

а если шину ручками провалить? чтобы АКК создать?... пойдет следующий байтик? Я не помню точно спецификацию, вроде можно просто шину резистором подтянуть к земле(питанию?), сначала будет конфликтик, а потом АКК получится или нет?

и поглядеть пошло дело дальше или нет?

из адреса только посмотреть не включен ли 10 битный режим случаем... и второй вопрос старший и младший бит адреса не перепутан?

могу еще посоветовать сделать свой анализатор из ножки проца... пусть она в таймере уровни записывает, не много, но хоть что-то... заведите ее на шину, запускайте передачу, и таймер...

А еще я бы чисто на всякий случай проверил бы содержание регистров. Мало ли какие флаги не так обозначены или еще что...
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 27 2013, 20:22
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Влад Р. @ Jun 27 2013, 17:00) *
ЖКИ RDX0032-GC.

UC1601s - это капут. У него слабый передатчик, в результате уровень лог.0 на шине недопустимо завышен (~0.6V). Для некоторых МК это не важно, а для других - недопустимо. Например, у меня этот индикатор идеально работал на AVR и совершенно непредсказуемо работал на i.MX53 от FreeScale. исследование (длительное и основательное) и сравнение уровней, выдаваемых этой ущербной ИС с уровнями, формируемыми нормальными абонентами шины, говорит о том, что UC1601s на шине работает некорректно. Никакие подтяжки и проч. ситуацию не спасают - горбатого может исправить разве что могила. Лично я для себя решил никогда индикаторы на этом чипе не использовать ...
P.S. Забыл сказать: ножку сброса индикатора ни в коем случае не оставляйте неподключенной, что бы там в документации ни писали ...
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 27 2013, 21:34
Сообщение #8


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(Golikov A. @ Jun 27 2013, 22:16) *
а вот это что делает?
I2C1->CR2 |= I2C_CR2_START;

Строка I2C1->CR2 |= I2C_CR2_START; говорит модулю I2C, что можно начинать передачу (генерировать старт-бит).

Цитата(kovigor @ Jun 27 2013, 23:22) *
UC1601s - это капут. У него слабый передатчик, в результате уровень лог.0 на шине недопустимо завышен (~0.6V). Для некоторых МК это не важно, а для других - недопустимо. Например, у меня этот индикатор идеально работал на AVR и совершенно непредсказуемо работал на i.MX53 от FreeScale. исследование (длительное и основательное) и сравнение уровней, выдаваемых этой ущербной ИС с уровнями, формируемыми нормальными абонентами шины, говорит о том, что UC1601s на шине работает некорректно. Никакие подтяжки и проч. ситуацию не спасают - горбатого может исправить разве что могила. Лично я для себя решил никогда индикаторы на этом чипе не использовать ...
P.S. Забыл сказать: ножку сброса индикатора ни в коем случае не оставляйте неподключенной, что бы там в документации ни писали ...


Думаю, проблема не в этом. С LPC1114 ЖКИ нормально общался. ST, конечно, это совсем другой огород...

Кто-нибудь уже работал с I2C в режиме мастера-передатчика на этом камне?

Сообщение отредактировал Влад Р. - Jun 27 2013, 21:37
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 28 2013, 06:55
Сообщение #9


Гуру
******

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



а как
Строка I2C1->CR2 |= I2C_CR2_START; говорит модулю I2C, что можно начинать передачу (генерировать старт-бит).

есть бит СТАРТ в этом регистре нельзя записать? Это константа переопределена, другие биты что ли? Для того чтобы началась передача надо что-то другое делать ИМХО, с другими битами, а может и другими регистрами...
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 28 2013, 08:43
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Влад Р. @ Jun 28 2013, 00:34) *
Думаю, проблема не в этом. С LPC1114 ЖКИ нормально общался. ST, конечно, это совсем другой огород...

В этом или не в этом - не важно. Но одного этого уже достаточно для того, чтобы индикаторы на этом чипе не использовать. Если это, конечно, не разовая поделка для себя ...
Go to the top of the page
 
+Quote Post
alexdos
сообщение Jun 28 2013, 10:14
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(kovigor @ Jun 28 2013, 11:43) *
В этом или не в этом - не важно. Но одного этого уже достаточно для того, чтобы индикаторы на этом чипе не использовать. Если это, конечно, не разовая поделка для себя ...


"С LPC1114 ЖКИ нормально общался. ST, конечно, это совсем другой огород..." а что из этого достаточно ?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 28 2013, 10:24
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(alexdos @ Jun 28 2013, 13:14) *
а что из этого достаточно ?

Лично для меня достаточно того, что этот индикатор ведет себя на шине некорректно, посему использовать его в коммерческих проектах я бы не стал. Разбираться в правильном использовании компонента, который ведет себя некорректно, я бы тоже не стал, ибо не вижу в этом смысла. Вместо этого я бы просто подобрал другой индикатор ...
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 28 2013, 11:11
Сообщение #13


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(Golikov A. @ Jun 28 2013, 09:55) *
а как
Строка I2C1->CR2 |= I2C_CR2_START; говорит модулю I2C, что можно начинать передачу (генерировать старт-бит).

есть бит СТАРТ в этом регистре нельзя записать? Это константа переопределена, другие биты что ли? Для того чтобы началась передача надо что-то другое делать ИМХО, с другими битами, а может и другими регистрами...


Как же его нельзя писать, если вы сами мануал цитировали:

Цитата(Golikov A. @ Jun 27 2013, 20:26) *
бит START
This bit is set by software


И это видно из алгоритма передачи в режиме мастера на той же странице 534.

Сообщение отредактировал Влад Р. - Jun 28 2013, 11:11
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 29 2013, 19:07
Сообщение #14


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

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Проблему решил одной строчкой кода (Alternate Function включил, а какая именно AF не указал laughing.gif ):
Код
GPIOB->AFR[0] |= 0x11000000;


Всем спасибо за участие!

З.Ы. Дисплейчик инициализировался нормально.

Сообщение отредактировал Влад Р. - Jun 29 2013, 19:15
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 30 2013, 14:50
Сообщение #15


Гуру
******

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



да чет сам писал, и сам не читал... sm.gif правда ставится софтварно, стирается хардварно...


Ну и славно что заработал...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 16:18
Рейтинг@Mail.ru


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