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

 
 
> 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
Ответов
Golikov A.
сообщение Jun 28 2013, 06:55
Сообщение #2


Гуру
******

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



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

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


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

Группа: Свой
Сообщений: 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



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

 


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


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