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

 
 
> 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
 
Start new topic
Ответов
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



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

 


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


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