|
STM32F051 Интерфейс I2C, + ЖКИ RDX0032-GC |
|
|
|
Jun 27 2013, 14:00
|
Частый гость
 
Группа: Свой
Сообщений: 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)); // Ждем освобождения буфера передачи Библиотеки не предлагать! Надеюсь на вашу помощь
Сообщение отредактировал IgorKossak - Jun 27 2013, 15:25
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Jun 27 2013, 20:22
|
Гуру
     
Группа: Свой
Сообщений: 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. Забыл сказать: ножку сброса индикатора ни в коем случае не оставляйте неподключенной, что бы там в документации ни писали ...
|
|
|
|
|
Jun 27 2013, 21:34
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 28 2013, 10:14
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(kovigor @ Jun 28 2013, 11:43)  В этом или не в этом - не важно. Но одного этого уже достаточно для того, чтобы индикаторы на этом чипе не использовать. Если это, конечно, не разовая поделка для себя ... "С LPC1114 ЖКИ нормально общался. ST, конечно, это совсем другой огород..." а что из этого достаточно ?
|
|
|
|
Сообщений в этой теме
Влад Р. STM32F051 Интерфейс I2C Jun 27 2013, 14:00 Genadi Zawidowski Цитата(Влад Р. @ Jun 27 2013, 18:00) Всем... Jun 27 2013, 16:14 Влад Р. Цитата(Genadi Zawidowski @ Jun 27 2013, 19... Jun 27 2013, 16:36  Golikov A. Цитата(Влад Р. @ Jun 27 2013, 20:36) Вы и... Jun 27 2013, 17:26   Влад Р. Цитата(Golikov A. @ Jun 27 2013, 20:06) Т... Jun 27 2013, 17:34 Golikov A. а вот это что делает?
I2C1->CR2 |= I2C_CR2_STAR... Jun 27 2013, 19:16 Golikov A. а как
Строка I2C1->CR2 |= I2C_CR2_START; говор... Jun 28 2013, 06:55 Влад Р. Цитата(Golikov A. @ Jun 28 2013, 09:55) а... Jun 28 2013, 11:11 Влад Р. Проблему решил одной строчкой кода (Alternate Fun... Jun 29 2013, 19:07 Golikov A. да чет сам писал, и сам не читал... правда ставит... Jun 30 2013, 14:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|