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

 
 
> 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



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

 


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


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