Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры ARM, Cortex, STM32

Войти
Регистрация
Восстановить пароль
 
 
vodym_123
0 / 0 / 0
Регистрация: 12.10.2014
Сообщений: 164
#1

I2C CMSIS - ARM, Cortex, STM32 микроконтроллер

06.12.2015, 09:26. Просмотров 8795. Ответов 36
Метки нет (Все метки)

всем привет кто работал с модулем I2C на STM32F103 используя только CMSIS скиньте пример инициализации таймингов и коммуникации
HELP !!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2015, 09:26
Я подобрал для вас темы с готовыми решениями и ответами на вопрос I2C CMSIS (ARM, Cortex, STM32 микроконтроллер):

Вопрос о CMSIS - ARM, Cortex, STM32 микроконтроллер
Здравствуйте ! В CMSIS запись в регистры делается так: 0x40010C10 адрес GPIOB_BSRR ...

CMSIS-DAP - ARM, Cortex, STM32 микроконтроллер
Кто-нибудь пробовал ? У меня в Keil проходит 50% программирование и останавливается. http://www.keil.som/support/man/docs/da ......

CMSIS и STM32F4 - ARM, Cortex, STM32 микроконтроллер
Имеется Dyscovery c STM32F4 на борту. От SPL решил отказаться и использовать только CMSIS. CMSIS взял из официальной сборки SPL для своей...

CMSIS | StdPeriph (Холивар) - ARM, Cortex, STM32 микроконтроллер
Всем доброго времени суток! Не так давно начал осваивать Sortix-M3 на примере STM32F103RET6. Периферии у STMов много а режимов её...

stm32F407 CMSIS инициализация - ARM, Cortex, STM32 микроконтроллер
Ку всем Прошу помощи, у тех, кто занимался инициализацией данного камня, используя CMSIS билиотеку. Вопрос собственно, что за чем...

Частота кварца и CMSIS - ARM, Cortex, STM32 микроконтроллер
Помогите разобраться. В учебном курсе по STM32 есть фраза: Это пояснение к макросам CMSIS. То есть я не могу задавать задавать...

36
SoBo31Rus
0 / 0 / 0
Регистрация: 13.08.2017
Сообщений: 11
17.08.2017, 16:39 #31
Вобщем дополню после чтения errata появился ногодрыг в инициализации:
Кусок
Код
//------------------------Грабли из Errata-------------------------------------------//
GPIOB->CRL &= ~(GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
GPIOB->CRL |= GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
I2C1->CR1 &= ~I2C_CR1_PE;
GPIOB->ODR |= GPIO_ODR_ODR6 | GPIO_ODR_ODR7;
while(!(GPIOB->IDR &(GPIO_IDR_IDR6 | GPIO_IDR_IDR7)));

GPIOB->ODR &= ~(GPIO_ODR_ODR6);
while(GPIOB->IDR & GPIO_IDR_IDR6);
GPIOB->ODR &= ~(GPIO_ODR_ODR7);
while(GPIOB->IDR & GPIO_IDR_IDR7 );

GPIOB->ODR |= GPIO_ODR_ODR6;
while(!(GPIOB->IDR & GPIO_IDR_IDR6));
GPIOB->ODR |= GPIO_ODR_ODR7;
while(!(GPIOB->IDR & GPIO_IDR_IDR7));

GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7;
I2C1->CR1 |= I2C_CR1_SWRST;
I2C1->CR1 &= ~I2C_CR1_SWRST;
I2C1->CR2 &= ~I2C_CR2_FREQ;
I2C1->CR2 |= 8;
I2C1->CCR &= ~I2C_CCR_CCR;
I2C1->CCR = 80;
I2C1->TRISE = 3;
I2C1->CR1 |= I2C_CR1_ACK;
I2C1->CR1 |= I2C_CR1_PE;
I2C1->CR1 |= I2C_CR1_START;
//------------------------------------------------------------------------------------//
целиком
Код
/*
* main.c
*
*  Created on: 14 авг. 2017 г.
*      Author: SoBo31Rus@Mail.ru
*/

#ymstude "stm32f10x.h"

uint8_t tids = 0;
uint16_t reg_check;

void Sys_config(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
RCC->CR |= RCC_CR_HSEON; //включаем HSE

//ждем переключения на HSE
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

//Проверяем
if ((RCC->CR & RCC_CR_HSERDY) != RESIT)
HSEStatus = (uint32_t)0x01;
else
HSEStatus = (uint32_t)0x00;

//Если всё в порядке
if (HSEStatus == (uint32_t)0x01)
{
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; //Задержки для работы FLASH

/*  Конфигурация PLL */
RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL);//сбрасывем источник предделитель и множитель
RCC->CFGR |= RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9; //предделитель кварца(16мгц) на 2(8мгц) множитеь на 9(72мгц)
RCC->CFGR |= RCC_CFGR_HPRE_3; //делитель AHB на 2(36мгц)
/* Включаем PLL */
RCC->CR |= RCC_CR_PLLON;

//Ожидание работы PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0);

//Переключение на рабочую частоту
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CFGR |= RCC_CFGR_SW_PLL;

// Ожидание выхода на рабочую частоту
while ((RCC->CFGR & RCC_CFGR_SWS) != (uint32_t)0x08);
//SystemCoreClock = (uint32_t) 36000000;
}

//Не прокатило
else
{
}
}

void timer_config(void)
{
NVIC_SetPriority(TIM2_IRQn,1); //Ставим приоритет прерывания таймера
NVIC_EnableIRQ(TIM2_IRQn); //Включаем прерывание в NVIC
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //Включаем тактирование таймера на шине APB1
TIM2->PSC = 8000-1;//предделитель таймера
TIM2->ARR = 1000-1;//считаем до 2000-1
TIM2->DIER |= TIM_DIER_UIE;//Разрешаем обновление прерывания?
TIM2->CR1 |= TIM_CR1_CEN;//Включаем счетчик
}

void TIM2_IRQHomdler(void)
{
TIM2->SR &= ~TIM_SR_UIF; //Сбрасываем флаг прерывания чтоб следом не улететь в прерывание
GPIOC->ODR ^= GPIO_ODR_ODR13;//Инвертируем состояние пина
}

int main(void)
{

//   Sys_config();

//   RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; //Включаем тактирование GPIOC
//   GPIOC->CRH |= GPIO_CRH_MODE13_1; //GPIOC13 выход
//   GPIOC->CRH &= ~GPIO_CRH_CNF13; //GPIOC13 push/pull

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //Включаем тактирование Шины и GPIOB
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
GPIOB->CRL |= GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7;

I2C1->CR1 |= I2C_CR1_PE;
I2C1->CR1 |= I2C_CR1_START;
//------------------------Грабли из Errata-------------------------------------------//
GPIOB->CRL &= ~(GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
GPIOB->CRL |= GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
I2C1->CR1 &= ~I2C_CR1_PE;
GPIOB->ODR |= GPIO_ODR_ODR6 | GPIO_ODR_ODR7;
while(!(GPIOB->IDR &(GPIO_IDR_IDR6 | GPIO_IDR_IDR7)));

GPIOB->ODR &= ~(GPIO_ODR_ODR6);
while(GPIOB->IDR & GPIO_IDR_IDR6);
GPIOB->ODR &= ~(GPIO_ODR_ODR7);
while(GPIOB->IDR & GPIO_IDR_IDR7 );

GPIOB->ODR |= GPIO_ODR_ODR6;
while(!(GPIOB->IDR & GPIO_IDR_IDR6));
GPIOB->ODR |= GPIO_ODR_ODR7;
while(!(GPIOB->IDR & GPIO_IDR_IDR7));

GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7;
I2C1->CR1 |= I2C_CR1_SWRST;
I2C1->CR1 &= ~I2C_CR1_SWRST;
I2C1->CR2 &= ~I2C_CR2_FREQ;
I2C1->CR2 |= 8;
I2C1->CCR &= ~I2C_CCR_CCR;
I2C1->CCR = 80;
I2C1->TRISE = 3;
I2C1->CR1 |= I2C_CR1_ACK;
I2C1->CR1 |= I2C_CR1_PE;
I2C1->CR1 |= I2C_CR1_START;
//------------------------------------------------------------------------------------//

while (!(I2C1->SR1 & I2C_SR1_SB));
reg_check = I2C1->SR1;
// передаем адрес ведомого
I2C1->DR = 0x50;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
reg_check = I2C1->SR1;
reg_check = I2C1->SR2;
I2C1->DR = 0;
while (!(I2C1->SR1 & I2C_SR1_BTF));
I2C1->CR1 |= I2C_CR1_START;

// ждем окончания формирования сигнала "Повторный Старт"
while (!(I2C1->SR1 & I2C_SR1_SB));
reg_check = I2C1->SR1;

// передаем адрес ведомого + чтение
I2C1->DR = 0x51;

// ожидаем окончания передачи адреса
while (!(I2C1->SR1 & I2C_SR1_ADDR));
reg_check = I2C1->SR1;
reg_check = I2C1->SR2;

// ожидаем окончания приема данных
while (!(I2C1->SR1 & I2C_SR1_RXNE));
volatile uint16_t data;
data = I2C1->DR;
I2C1->CR1 |= I2C_CR1_STOP;

//   timer_config();

while(1)
{

}
}
до чтения errata висло в ожидании SB сразу после старта, теперь стартует но виснет в чтении ADDR
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 16:42 #32
SoBo31Rus, адрес то верный?
0
SoBo31Rus
0 / 0 / 0
Регистрация: 13.08.2017
Сообщений: 11
17.08.2017, 16:45 #33
Адрес был получен ардуиной, с программой которая адреса на шине ищет
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 16:57 #34
SoBo31Rus, озвучь и адрес и что есть слейв .
0
SoBo31Rus
0 / 0 / 0
Регистрация: 13.08.2017
Сообщений: 11
17.08.2017, 16:58 #35
А линии шины подтянуты через резисторы к питанию(5-10кОм в зависимости от длинны и скорости)?
Какая скорость шины? Что подключено к устройству?
Поддянуты 4.7кОм, скорость пробовал 100, подключено EEPROM 24c02

Цитата Сообщение от dosykus_2
озвучь и адрес и что есть слейв .
Адрес 0х50, EEPROM Slave
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
17.08.2017, 17:04 #36
Для F4 , F1 сей адрес 0xA0.
Запомните раз и навсегда как определяется адрес у I2C :
Старшие 7 бит адрес устройства , самый младший бит(бит 0) признак чтения/записи.
Так что , то что вам выдала ваша аурдунья надо сдвигать влево на 1.
И надо не упорото уверовать в аурдуино-облегчалкам , а читать документацию на сабж.
Берите калькулятор и натыкивайте по битам, дабы на всю жизнь запомнить.



0
SoBo31Rus
0 / 0 / 0
Регистрация: 13.08.2017
Сообщений: 11
17.08.2017, 17:21 #37
Цитата Сообщение от dosykus_2
Для F4 , F1 сей адрес 0xA0.
Запомните раз и навсегда как определяется адрес у I2C :
Старшие 7 бит адрес устройства , самый младший бит(бит 0) признак чтения/записи.
Так что , то что вам выдала ваша аурдунья надо сдвигать влево на 1.
И надо не упорото уверовать в аурдуино-облегчалкам , а читать документацию на сабж.
Берите калькулятор и натыкивайте по битам, дабы на всю жизнь запомнить.
Виноват =) стыдно, действительно всё работает) но без граблей из errata всё равно не стартует, у вас тут плюсики ставятся?
0
17.08.2017, 17:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2017, 17:21
Привет! Вот еще темы с ответами:

CMSIS, TIM6 и DMA1 - ARM, Cortex, STM32 микроконтроллер
На плате F429Dyscovery настроил TIM6 чтоб генерил реквесты к DMA1 Stream1 Channel7, согласно референсу именно этот канал срабатывает на...

openocd + cmsis-svd - ARM, Cortex, STM32 микроконтроллер
В openocd, кроме встроенного gdb сервера, есть также встроенные telnet сервер и скриптовый язык tcl. Это позволяет делать отладку и...

Заводим USB STM32 на CMSIS - ARM, Cortex, STM32 микроконтроллер
Приветствую форумчан! Вот уже 4-й месяц (с перерывами конечно :) ) бьюсь об USB, но он никак не хочет работать. Сейчас происходит...

CMSIS-DSP и БИХ фильтр - ARM, Cortex, STM32 микроконтроллер
Всем доброго времени суток! Кто-нибудь работал с CMSIS-DSP и реализацией БИХ фильтра? Есть документация:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru