Программирование 32-х разрядных МК

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

и биты сбросил и настройки прописал, что то никак :(

    //USART3->BRR = 0xEA6; //   9600 ->     234.375 -   324->0xEA   0.375*16=6=0x6
    USART3->BRR = 0x753; //   19200 ->    117.1875 -  117->0x75   0.1875*16=3=0x3
    //USART3->BRR = 0x271; //     57600 ->    39.0625 -   39->0x27    0.0625*16=1=0x1
    //USART3->BRR = 0x138; //   115200 ->   19.5 -     19->0x13    0.5*16=8=0x8
    //USART3->BRR = 0x4E2; //  72MHz 57600 ->   78.125 -      78->0x4E    0.125*16=2=0x2
    USART3->CR1 |= USART_CR1_UE|USART_CR1_TE|USART_CR1_RE; // Вкл. uart, приема и передачи    
    USART3->CR1 |= USART_CR1_RXNEIE; // Разрешаем генерировать прерывание по приему
    USART3->CR1 &= ~USART_CR1_M; // UART_WORDLENGTH_8B
    USART3->CR1 &= ~USART_CR1_PCE; // UART_PARITY_NONE
    USART3->CR2 &= ~USART_CR2_STOP; // 00 - 1 stop bit
    USART3->CR1 &= ~USART_CR1_OVER8; // UART_OVERSAMPLING_16
 

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Логический анализатор есть?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

Логический анализатор есть?

к сожалению нет, чую и осциллограф придется покупать.

 

dosikus
Offline
Зарегистрирован: 11.03.2017

 Тогда хотя бы через USB-UART убедиться что выхлоп есть ...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

andycat пишет:

чую и осциллограф придется покупать.

Ох, как ты в правильную сторону чуешь.  :)   У меня теперь их два, хоть и дешевеньких

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

 Тогда хотя бы через USB-UART убедиться что выхлоп есть ...

плата спаяна, подключиться проблематично, не думал что вылезут грабли.

спасибо, пошел думать....

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

 Тогда хотя бы через USB-UART убедиться что выхлоп есть ...

спасибо огромное за направление, на 115200 все вышло, дело в модеме

сутки потерял зря :(

 

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Теперь осталось комплексно проверить прием/передачу без модема.

Потом проверить модем через тот же USB-UART.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

Теперь осталось комплексно проверить прием/передачу без модема.

Потом проверить модем через тот же USB-UART.

прием передача работает, а модем я к usb-uart никак не подцеплю.

теперь застрял с TIMx - все перепробовал, никак не срабатывает TIM IRQhandler, нашел где то на форуме что поможет пересоздание проекта, создал новый краткий пример - не помогло. Попробовал через SPL - аналогично. Странность какая то. Причем внешние прерывания по нажатию кнопок работает без проблем.

У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Какое прерывания таймера конкретно нужно?

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Любой из TIM1...7 как счётчик тиков/времени.

rkit
Offline
Зарегистрирован: 23.11.2016

Для этого специально есть SysTick

dosikus
Offline
Зарегистрирован: 11.03.2017
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017


Спасибо, читал, не взлетело. Завтра ещё раз попробую, выложу код.

nik182
Offline
Зарегистрирован: 04.05.2015

В какой среде компилируешь? Если в ардуино то под каким аддоном? Используешь ли куб мх? Если поставить куб то по пути c:\Users\1\STM32Cube\Repository\STM32Cube_FW_F3_V1.11.0\Projects\STM32F334R8-Nucleo\Examples_LL\USART\USART_SyncCommunication_FullDuplex_IT\ лежат примеры. В данном случае инициализации uart для прерываний на LL драйверах. Можно посмотреть последовательность. LL имеют очень говорящие имена. Всё документировано. Вот инициализация UART. Надеюсь название вызываемых функций в примере и битов в регистрах по CMSIS можно будет совместить. 

  USARTx_GPIO_CLK_ENABLE();

  /* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
  LL_GPIO_SetPinMode(USARTx_TX_GPIO_PORT, USARTx_TX_PIN, LL_GPIO_MODE_ALTERNATE);
  USARTx_SET_TX_GPIO_AF();
  LL_GPIO_SetPinSpeed(USARTx_TX_GPIO_PORT, USARTx_TX_PIN, LL_GPIO_SPEED_FREQ_HIGH);
  LL_GPIO_SetPinOutputType(USARTx_TX_GPIO_PORT, USARTx_TX_PIN, LL_GPIO_OUTPUT_PUSHPULL);
  LL_GPIO_SetPinPull(USARTx_TX_GPIO_PORT, USARTx_TX_PIN, LL_GPIO_PULL_UP);

  /* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
  LL_GPIO_SetPinMode(USARTx_RX_GPIO_PORT, USARTx_RX_PIN, LL_GPIO_MODE_ALTERNATE);
  USARTx_SET_RX_GPIO_AF();
  LL_GPIO_SetPinSpeed(USARTx_RX_GPIO_PORT, USARTx_RX_PIN, LL_GPIO_SPEED_FREQ_HIGH);
  LL_GPIO_SetPinOutputType(USARTx_RX_GPIO_PORT, USARTx_RX_PIN, LL_GPIO_OUTPUT_PUSHPULL);
  LL_GPIO_SetPinPull(USARTx_RX_GPIO_PORT, USARTx_RX_PIN, LL_GPIO_PULL_UP);

  /* (2) NVIC Configuration for USART interrupts */
  /*  - Set priority for USARTx_IRQn */
  /*  - Enable USARTx_IRQn */
  NVIC_SetPriority(USARTx_IRQn, 0);  
  NVIC_EnableIRQ(USARTx_IRQn);

  /* (3) Enable USART peripheral clock and clock source ***********************/
  USARTx_CLK_ENABLE();

  /* TX/RX direction */
  LL_USART_SetTransferDirection(USARTx_INSTANCE, LL_USART_DIRECTION_TX_RX);

  /* 8 data bit, 1 start bit, 1 stop bit, no parity */
  LL_USART_ConfigCharacter(USARTx_INSTANCE, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);

  /* No Hardware Flow control */
  /* Reset value is LL_USART_HWCONTROL_NONE */
  // LL_USART_SetHWFlowCtrl(USARTx_INSTANCE, LL_USART_HWCONTROL_NONE);

  /* Oversampling by 16 */
  /* Reset value is LL_USART_OVERSAMPLING_16 */
  // LL_USART_SetOverSampling(USARTx_INSTANCE, LL_USART_OVERSAMPLING_16);

  /* Set Baudrate to 115200 using APB frequency set to 32000000 Hz */
  /* Frequency available for USART peripheral can also be calculated through LL RCC macro */
  /* Ex :
      Periphclk = LL_RCC_GetUSARTClockFreq(Instance); or LL_RCC_GetUARTClockFreq(Instance); depending on USART/UART instance
  
      In this example, Peripheral Clock is expected to be equal to 32000000 Hz => equal to SystemCoreClock/2
  */
  LL_USART_SetBaudRate(USARTx_INSTANCE, SystemCoreClock/2, LL_USART_OVERSAMPLING_16, 115200); 

  /* (5) Enable USART *********************************************************/
  LL_USART_Enable(USARTx_INSTANCE);
  /* Clear Overrun flag, in case characters have already been sent to USART */
  LL_USART_ClearFlag_ORE(USARTx_INSTANCE);

  /* Enable RXNE and Error interrupts */
  LL_USART_EnableIT_RXNE(USARTx_INSTANCE);
  LL_USART_EnableIT_ERROR(USARTx_INSTANCE);


 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Keil5 без использования библиотек, все через регистры.

dosikus
Offline
Зарегистрирован: 11.03.2017

nik182, никакие калокубы с ихними ляля и на не упали.

Все делается намного проще и действенней.

Надо не лениться и начать изучать документацию.

nik182
Offline
Зарегистрирован: 04.05.2015

У тебя тоже кубофобия? Это первые версии были не очень. Сейчас на HAL драйверах почти всё поправили. А тратить время на ползанье по мануалу для каждого бита регистров мне уже неинтересно. Расскажи как проще? В условиях, когда уже не надо бороться за скорость и размер памяти можно экономить время, пользуясь проделанной индусами работой. Но всё равно мануал на процессор - главный источник информации.  

nik182
Offline
Зарегистрирован: 04.05.2015

andycat пишет:

У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?

У меня нет, но вот у интернета есть http://www.keil.com/download/docs/359.asp Посмотрите, может понравиться, особенно в файле stm32_init функция stm32_UsartSetup .

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Отвечу за dosikus, если вы пишите для себя или в единственном экземпляре, или самостоятельно делаете устройство, да пожалуйста, пишите на чем угодно. Но например в моем случае я тупо не смог с удалённым заказчиком прийти к единому знаменателю с софтом на компе + железо + в итоге это будет несколько десятков устройств и везде нужна совместимость, а все эти библиотеки каждый раз могут легко что то подправить и все... Устройство не взлетит.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

nik182 пишет:

andycat пишет:

У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?

У меня нет, но вот у интернета есть http://www.keil.com/download/docs/359.asp Посмотрите, может понравиться, особенно в файле stm32_init функция stm32_UsartSetup .

Э...да я вообще-то usart не просил.

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

теперь застрял с TIMx - все перепробовал, никак не срабатывает TIM IRQhandler

не забываете его через экстерн обьявлять?

extern "C" void TIM2_IRQHandler(void) {  }

nik182
Offline
Зарегистрирован: 04.05.2015

Извините что то меня проклинило. Начинали uart. А инициализация таймера там тоже есть, и RTC и много прочего и всё на CMSIS и с комментариями.

Да, сейчас пишу только для себя. Развлекаюсь на новых корпусах. Народ пишет F уже не актуально. Надо на H переходить.   

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

b707 пишет:

не забываете его через экстерн обьявлять?

extern "C" void TIM2_IRQHandler(void) {  }

что то я не так делаю :(, так не работает:

#ifdef __cplusplus
 extern "C" {
#endif 

void TIM2_IRQHandler(void);

#ifdef __cplusplus
}
#endif



volatile unsigned long tics;
#define TIMx_CLK                SystemCoreClock // Hz 
#define TIMx_Internal_Frequency 1000UL     // Hz 
#define TIMx_Out_Frequency      2UL        // Hz
#define Prescaler (TIMx_CLK/TIMx_Internal_Frequency)-1UL
#define Period (TIMx_Internal_Frequency/TIMx_Out_Frequency)-1UL
void initTIM2(void) {
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    TIM2->PSC = Prescaler;
    TIM2->ARR = Period;
    NVIC_SetPriority(TIM2_IRQn,0);
	NVIC_EnableIRQ(TIM2_IRQn);
}
void TIM2_IRQHandler(void)
{
	++tics;
	TIM2->SR = ~TIM_SR_UIF;
}

- а так не компилируется

extern "C" void TIM2_IRQHandler(void)
{
	++tics;
	TIM2->SR = ~TIM_SR_UIF;
}

 

dosikus
Offline
Зарегистрирован: 11.03.2017

А что сие выкинул? 

TIM2->DIER |= TIM_DIER_UIE;
	TIM2->CR1|=TIM_CR1_CEN;

Первое включение прерывания по Update , второе запуск таймера.

 

Да и лучше так, чем размазывать по исходнику

#ifdef __cplusplus
 extern "C" {
#endif
void TIM2_IRQHandler(void)
{
    ++tics;
    TIM2->SR = ~TIM_SR_UIF;
}
#ifdef __cplusplus
}
#endif

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

А что сие выкинул? 

да, спасибо, не внимательность :(

вчера ставил.

в итоге основной моей ошибкой было то, что я не устанавливал приоритет прерыванию.

dosikus
Offline
Зарегистрирован: 11.03.2017

Создание шаблона под кайло + Systick http://mcu.goodboard.ru/viewtopic.php?id=15

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

dosikus пишет:
Такое мог ляпнуть только тот кто своими руками в жизни ничего не сделал...
Это ты верно подметил, рукожопием не занимаюсь по одной причине, оно никогда не сравняется по качеству с промышленным производством. Утюг + руки из жопы всегда будут хуже, чем резонит + монтажник. На серийное производство с рукожопием даже замахиваться бессмысленно.

dosikus
Offline
Зарегистрирован: 11.03.2017

А в Китае еще дешевле. Вот только я могу и лут и плату подготовить для заказа и монтаж, я что можешь ты ?

Молоть на форумах языком, ась "нерукожопый"?

И фотки были прототипа, на изготовление которого ушло 2 часа.

Что такое прототип ты естественно не знаешь...

b707
Offline
Зарегистрирован: 26.05.2017

Andy пишет:

Это ты верно подметил, рукожопием не занимаюсь

Andy. если вы чего-то не умеете - не стоит подводить под это "принципиальные" соображения - смотритесь смешно.

nik182
Offline
Зарегистрирован: 04.05.2015

Andy пишет:

Это ты верно подметил, рукожопием не занимаюсь ...

И что ж ты делаешь на сайте,где рукожопие основной вид творчества? 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да оставьте вы его в покое, как черт какой то выпрыгнет погавкает и опять в конуру. не обращайте внимание сам испарится.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

В тему ветки, имеет ли смысл включать и настраивать аналоговый и/или цифровой фильтр на интерфейсе I2C STM32?

nik182
Offline
Зарегистрирован: 04.05.2015

Это сильно зависит от схемы, длины шины. И на всякий случай посмотрите 2.14.7  из . Оно конечно к другому процессору, но интересен сам факт.

dosikus
Offline
Зарегистрирован: 11.03.2017

Сперва лог.анализатор приобрети...

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

Сперва лог.анализатор приобрети...

Без него советы не даёте?
ОК :)

dosikus
Offline
Зарегистрирован: 11.03.2017

Без него в I2C и SPI  будет весьма тяжко...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

dosikus пишет:
Вот только я могу и лут и плату подготовить для заказа и монтаж, я что можешь ты ?
Лут это форма рукожопия, я тебе уже сказал, что этим не занимаюсь. "Подготовить плату для заказа" надо полагать под этим ты понимаешь получение гербер-файлов. Так этому любую девочку можно научить. Или в твоем понимании это что-то ещё...? Монтаж? Этим монтажники занимаются профессионально, всяко лучше тебя и меня вместе взятых. Чем ты тут хотел удивить?

dosikus пишет:
Молоть на форумах языком, ась "нерукожопый"?
Это твоя прерогатива.

dosikus пишет:
И фотки были прототипа, на изготовление которого ушло 2 часа.

Что такое прототип ты естественно не знаешь...

У нас с тобой разные понятия о протипировании. В твоем понимании это нечто из говна и палок, в моем понимании это первый заказ в резоните из трех плат.

nik182 пишет:
И что ж ты делаешь на сайте,где рукожопие основной вид творчества?
С одной лишь целью, что бы знать ту грань, ниже которой начинается рукожопие.

dosikus
Offline
Зарегистрирован: 11.03.2017

Ну вот и раскрылась вся подноготная.

"нерукожопый" Andy даже развести и смонтировать плату не может, вместо него это делают девочки.

Такс, схемотехник из гего полный ноль .

В кодинге, судя по его постам , ниже плинтуса.

Так что ты здесь забыл "успешный" менагер.

Только поносишь все и ноешь , что другие нищеброды не могут купить то что ты покупаешь?

А может не ты а фирма?

Луччше заткнись и свали , моральный урод.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

dosikus пишет:

Без него в I2C и SPI  будет весьма тяжко...

Да, не взлетает никак (

vganin
Offline
Зарегистрирован: 03.07.2019

Нужна помощь. А то мозг разорвет. Прислали имз питера три железки: STM32F103C8, USB-TTL CH340, STLink V2. ни одна тварь не затаботала. Все в упаковке (думаю с али)

На STM моргает 13 светодиод

СH340 учтановился, но ни flash loader demo, ни куб программерне видит контроллера.

STLink не хочет ставится в виде донгла, как устройство видно  STM32 STLink и при попытке заменить на дравер донгла говорит что заменил но ничего не происходит.

2дня уже. голова взрывается. Хоть по какому то вопросу подкиньте. Вот уж не ожидал такой лажи от себя.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Поставить программу STLink. В ней обновить прошивку свистка STLink до последней версии. Поставить программу STCubeProgrammer. В ней обновить прошивку до совсем последней версии. Подключить свисток STlink четырьмя проводками к блюпилу, запустить программу STLink в ней соединится с блюпилом и посмотреть что залито в память.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

vganin пишет:
На STM моргает 13 светодиод

это нормально, залит блинк по умолчанию.

vganin пишет:
СH340 учтановился, но ни flash loader demo, ни куб программерне видит контроллера.

куб и не увидит, а контролер надо ввести в режим загрузчика, есть перемычки BOOT0 и BOOT1 на плате, читайте инфы полно.

vganin пишет:
STLink не хочет ставится в виде донгла, как устройство видно  STM32 STLink и при попытке заменить на дравер донгла говорит что заменил но ничего не происходит.

пральна, надо качать дрова с сайта ST, либо ставить программу для STLink-а, она сама дрова проставит.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

dosikus пишет:

Такс, схемотехник из гего полный ноль .

В кодинге, судя по его постам , ниже плинтуса.

Отсосикус, ты сначала разберись в назначении этой конструкции

#ifdef __cplusplus

extern "C"

#endif

Где её нужно применять, а где нет. И попытайся донести до остальных. А то среди вас, "гениев" нет понимания, одни советуют, не знают для чего, у других не компилится.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Andy, тут же много любителей, я например. Нарисуйте мне плиз код i2c на STM32F303ccT6 чтоб eeprom 23lc64 завёлся, раз вы такой крутой. Только плиз без HAL и SPL.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Делал лет 5 назад для 103 камня и AT24C64 на SPL. Чем SPL не устраивает?

nik182
Offline
Зарегистрирован: 04.05.2015

SPL это настройка над CMSIS, как HAL. Если они не нужны из функций SPL HAL, а лучше LL можно просто выковыривать CMSIS инструкции. Во первая попавшаяся короткая функция SPL - 16 и 21 строчки делают на CMSIS то, что описано. Кроме того можно посмотреть, как правильно кастовать типы (строка 21), что бы записать правильно в регистр. Иначе можно или не дописать или переписать лишние биты, а потом долго думать, почему работает не так как задумано.     

/**
  * @brief  Enables or disables the TIM peripheral Main Outputs.
  * @param  TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral.
  * @param  NewState: new state of the TIM peripheral Main Outputs.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_TIM_LIST2_PERIPH(TIMx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    /* Enable the TIM Main Output */
    TIMx->BDTR |= TIM_BDTR_MOE;
  }
  else
  {
    /* Disable the TIM Main Output */
    TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_BDTR_MOE));
  }  
}

 

dosikus
Offline
Зарегистрирован: 11.03.2017

Это для F0, У F0 и F3 одинаковые модули.
Единственное - надо таймауты сделать в циклах ожидания флагов.

[spoiler]
#define RDA5807_OWN_ADDRESS (0x11)
#define EEPROM_OWN_ADDRESS (0x50)

void i2c_init(void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;

RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
RCC->CFGR3 |= RCC_CFGR3_I2C1SW;

GPIOB->AFR[0] |= (1<<(4*6)) |(1<<(4*7));
GPIOB->MODER &= ~(GPIO_MODER_MODER6 |GPIO_MODER_MODER7);
GPIOB->MODER |= (GPIO_MODER_MODER6_1 |GPIO_MODER_MODER7_1);
GPIOB->OTYPER |=(GPIO_OTYPER_OT_6 |GPIO_OTYPER_OT_7);

I2C1->TIMINGR = (uint32_t)0x00B01A4B;
I2C1->CR1 = I2C_CR1_PE;

}

uint16_t rda5807_read16_reg(uint8_t reg)
{
uint16_t temp=0;
I2C1->CR2 = (1<<16) | (RDA5807_OWN_ADDRESS<<1);
while (!(I2C1->ISR & I2C_ISR_TXE) );
I2C1->TXDR = reg; /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */
while (!(I2C1->ISR & I2C_ISR_TC) ){};
I2C1->CR2 = I2C_CR2_AUTOEND | (2<<16) |
(RDA5807_OWN_ADDRESS<<1) |
I2C_CR2_RD_WRN |
I2C_CR2_NACK;
I2C1->CR2 |= I2C_CR2_START; /* Go */
while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
temp = (uint16_t)(I2C1->RXDR <<8);
while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
temp |= (uint16_t)I2C1->RXDR;
return temp;
}

void rda5807_write16_reg(uint8_t reg, uint16_t data )
{
I2C1->CR2 = I2C_CR2_AUTOEND | (3<<16) | (RDA5807_OWN_ADDRESS<<1);

/* Check Tx empty */
while (!(I2C1->ISR & I2C_ISR_TXE) );

I2C1->TXDR = reg; /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */

while (!(I2C1->ISR & I2C_ISR_TXIS) );
I2C1->TXDR = (uint8_t)(data>>8); /* Byte to send */
while (!(I2C1->ISR & I2C_ISR_TXIS) );

I2C1->TXDR = (uint8_t)(data &0x00FF); /* Byte to send */

}

uint8_t eeprom_read(uint16_t address)
{
uint8_t temp=0;
I2C1->CR2 = (2<<16) | (EEPROM_OWN_ADDRESS<<1);
while (!(I2C1->ISR & I2C_ISR_TXE) );
I2C1->TXDR = (uint8_t) (address>>8); /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */
while (!(I2C1->ISR & I2C_ISR_TXIS) );
I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
while (!(I2C1->ISR & I2C_ISR_TC) ){};
I2C1->CR2 = I2C_CR2_AUTOEND |
(1<<16) |
(EEPROM_OWN_ADDRESS<<1) |
I2C_CR2_RD_WRN |
I2C_CR2_NACK;
I2C1->CR2 |= I2C_CR2_START; /* Go */
while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
temp = I2C1->RXDR ;

return temp;
}

void eeprom_write(uint16_t address, uint8_t data)
{

I2C1->CR2 = I2C_CR2_AUTOEND | (3<<16) | (EEPROM_OWN_ADDRESS<<1);

/* Check Tx empty */
while (!(I2C1->ISR & I2C_ISR_TXE) );

I2C1->TXDR =(uint8_t) (address>>8); /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */

while (!(I2C1->ISR & I2C_ISR_TXIS) );
I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */

while (!(I2C1->ISR & I2C_ISR_TXIS) );

I2C1->TXDR = data ; /* Byte to send */

}

void eeprom_pagewrite(uint16_t address, uint8_t *buf,uint8_t nbytes)
{
uint8_t index=0;
I2C1->CR2 = I2C_CR2_AUTOEND | ((2+nbytes)<<16) | (EEPROM_OWN_ADDRESS<<1);

/* Check Tx empty */
while (!(I2C1->ISR & I2C_ISR_TXE) );

I2C1->TXDR =(uint8_t) (address>>8); /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */

while (!(I2C1->ISR & I2C_ISR_TXIS) );
I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
for(index=0;index<=nbytes-1;index++)
{
while (!(I2C1->ISR & I2C_ISR_TXIS) );

I2C1->TXDR = buf[index] ; /* Byte to send */
}
}

void eeprom_pageread(uint16_t address,uint8_t* buf,uint8_t nbytes)
{

uint8_t index=0;
I2C1->CR2 = (2<<16) | (EEPROM_OWN_ADDRESS<<1);
while (!(I2C1->ISR & I2C_ISR_TXE) );
I2C1->TXDR = (uint8_t) (address>>8); /* Byte to send */
I2C1->CR2 |= I2C_CR2_START; /* Go */
while (!(I2C1->ISR & I2C_ISR_TXIS) );
I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
while (!(I2C1->ISR & I2C_ISR_TC) ){};
I2C1->CR2 = I2C_CR2_AUTOEND |
(nbytes<<16) |
(EEPROM_OWN_ADDRESS<<1) |
I2C_CR2_RD_WRN |
I2C_CR2_NACK;
I2C1->CR2 |= I2C_CR2_START; /* Go */
for(index=0;index<=nbytes-1;index++)
{
while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
buf[index] = I2C1->RXDR ;

}
}
[/spoiler]

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Спасибо, попробую. У меня висло на разных вариантах на проверке флага TXE или TXIS. Видел вариант в цикле while добавляли проверку на timeout - спасает на случай неожиданных помех или slave устройство тупит.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Дубль