Теперь осталось комплексно проверить прием/передачу без модема.
Потом проверить модем через тот же USB-UART.
прием передача работает, а модем я к usb-uart никак не подцеплю.
теперь застрял с TIMx - все перепробовал, никак не срабатывает TIM IRQhandler, нашел где то на форуме что поможет пересоздание проекта, создал новый краткий пример - не помогло. Попробовал через SPL - аналогично. Странность какая то. Причем внешние прерывания по нажатию кнопок работает без проблем.
У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?
В какой среде компилируешь? Если в ардуино то под каким аддоном? Используешь ли куб мх? Если поставить куб то по пути 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);
У тебя тоже кубофобия? Это первые версии были не очень. Сейчас на HAL драйверах почти всё поправили. А тратить время на ползанье по мануалу для каждого бита регистров мне уже неинтересно. Расскажи как проще? В условиях, когда уже не надо бороться за скорость и размер памяти можно экономить время, пользуясь проделанной индусами работой. Но всё равно мануал на процессор - главный источник информации.
Отвечу за dosikus, если вы пишите для себя или в единственном экземпляре, или самостоятельно делаете устройство, да пожалуйста, пишите на чем угодно. Но например в моем случае я тупо не смог с удалённым заказчиком прийти к единому знаменателю с софтом на компе + железо + в итоге это будет несколько десятков устройств и везде нужна совместимость, а все эти библиотеки каждый раз могут легко что то подправить и все... Устройство не взлетит.
Такое мог ляпнуть только тот кто своими руками в жизни ничего не сделал...
Это ты верно подметил, рукожопием не занимаюсь по одной причине, оно никогда не сравняется по качеству с промышленным производством. Утюг + руки из жопы всегда будут хуже, чем резонит + монтажник. На серийное производство с рукожопием даже замахиваться бессмысленно.
Вот только я могу и лут и плату подготовить для заказа и монтаж, я что можешь ты ?
Лут это форма рукожопия, я тебе уже сказал, что этим не занимаюсь. "Подготовить плату для заказа" надо полагать под этим ты понимаешь получение гербер-файлов. Так этому любую девочку можно научить. Или в твоем понимании это что-то ещё...? Монтаж? Этим монтажники занимаются профессионально, всяко лучше тебя и меня вместе взятых. Чем ты тут хотел удивить?
dosikus пишет:
Молоть на форумах языком, ась "нерукожопый"?
Это твоя прерогатива.
dosikus пишет:
И фотки были прототипа, на изготовление которого ушло 2 часа.
Что такое прототип ты естественно не знаешь...
У нас с тобой разные понятия о протипировании. В твоем понимании это нечто из говна и палок, в моем понимании это первый заказ в резоните из трех плат.
nik182 пишет:
И что ж ты делаешь на сайте,где рукожопие основной вид творчества?
С одной лишь целью, что бы знать ту грань, ниже которой начинается рукожопие.
Нужна помощь. А то мозг разорвет. Прислали имз питера три железки: STM32F103C8, USB-TTL CH340, STLink V2. ни одна тварь не затаботала. Все в упаковке (думаю с али)
На STM моргает 13 светодиод
СH340 учтановился, но ни flash loader demo, ни куб программерне видит контроллера.
STLink не хочет ставится в виде донгла, как устройство видно STM32 STLink и при попытке заменить на дравер донгла говорит что заменил но ничего не происходит.
2дня уже. голова взрывается. Хоть по какому то вопросу подкиньте. Вот уж не ожидал такой лажи от себя.
Поставить программу STLink. В ней обновить прошивку свистка STLink до последней версии. Поставить программу STCubeProgrammer. В ней обновить прошивку до совсем последней версии. Подключить свисток STlink четырьмя проводками к блюпилу, запустить программу STLink в ней соединится с блюпилом и посмотреть что залито в память.
СH340 учтановился, но ни flash loader demo, ни куб программерне видит контроллера.
куб и не увидит, а контролер надо ввести в режим загрузчика, есть перемычки BOOT0 и BOOT1 на плате, читайте инфы полно.
vganin пишет:
STLink не хочет ставится в виде донгла, как устройство видно STM32 STLink и при попытке заменить на дравер донгла говорит что заменил но ничего не происходит.
пральна, надо качать дрова с сайта ST, либо ставить программу для STLink-а, она сама дрова проставит.
Отсосикус, ты сначала разберись в назначении этой конструкции
#ifdef __cplusplus
extern "C"
#endif
Где её нужно применять, а где нет. И попытайся донести до остальных. А то среди вас, "гениев" нет понимания, одни советуют, не знают для чего, у других не компилится.
Andy, тут же много любителей, я например. Нарисуйте мне плиз код i2c на STM32F303ccT6 чтоб eeprom 23lc64 завёлся, раз вы такой крутой. Только плиз без HAL и SPL.
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));
}
}
Спасибо, попробую. У меня висло на разных вариантах на проверке флага TXE или TXIS. Видел вариант в цикле while добавляли проверку на timeout - спасает на случай неожиданных помех или slave устройство тупит.
и биты сбросил и настройки прописал, что то никак :(
Логический анализатор есть?
Логический анализатор есть?
к сожалению нет, чую и осциллограф придется покупать.
Тогда хотя бы через USB-UART убедиться что выхлоп есть ...
чую и осциллограф придется покупать.
Ох, как ты в правильную сторону чуешь. :) У меня теперь их два, хоть и дешевеньких
Тогда хотя бы через USB-UART убедиться что выхлоп есть ...
плата спаяна, подключиться проблематично, не думал что вылезут грабли.
спасибо, пошел думать....
Тогда хотя бы через USB-UART убедиться что выхлоп есть ...
спасибо огромное за направление, на 115200 все вышло, дело в модеме
сутки потерял зря :(
Теперь осталось комплексно проверить прием/передачу без модема.
Потом проверить модем через тот же USB-UART.
Теперь осталось комплексно проверить прием/передачу без модема.
Потом проверить модем через тот же USB-UART.
прием передача работает, а модем я к usb-uart никак не подцеплю.
теперь застрял с TIMx - все перепробовал, никак не срабатывает TIM IRQhandler, нашел где то на форуме что поможет пересоздание проекта, создал новый краткий пример - не помогло. Попробовал через SPL - аналогично. Странность какая то. Причем внешние прерывания по нажатию кнопок работает без проблем.
У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?
Какое прерывания таймера конкретно нужно?
Любой из TIM1...7 как счётчик тиков/времени.
Для этого специально есть SysTick
http://mcu.goodboard.ru/viewtopic.php?id=34
http://mcu.goodboard.ru/viewtopic.php?id=34
Спасибо, читал, не взлетело. Завтра ещё раз попробую, выложу код.
В какой среде компилируешь? Если в ардуино то под каким аддоном? Используешь ли куб мх? Если поставить куб то по пути 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 можно будет совместить.
Keil5 без использования библиотек, все через регистры.
nik182, никакие калокубы с ихними ляля и на не упали.
Все делается намного проще и действенней.
Надо не лениться и начать изучать документацию.
У тебя тоже кубофобия? Это первые версии были не очень. Сейчас на HAL драйверах почти всё поправили. А тратить время на ползанье по мануалу для каждого бита регистров мне уже неинтересно. Расскажи как проще? В условиях, когда уже не надо бороться за скорость и размер памяти можно экономить время, пользуясь проделанной индусами работой. Но всё равно мануал на процессор - главный источник информации.
У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?
У меня нет, но вот у интернета есть http://www.keil.com/download/docs/359.asp Посмотрите, может понравиться, особенно в файле stm32_init функция stm32_UsartSetup .
Отвечу за dosikus, если вы пишите для себя или в единственном экземпляре, или самостоятельно делаете устройство, да пожалуйста, пишите на чем угодно. Но например в моем случае я тупо не смог с удалённым заказчиком прийти к единому знаменателю с софтом на компе + железо + в итоге это будет несколько десятков устройств и везде нужна совместимость, а все эти библиотеки каждый раз могут легко что то подправить и все... Устройство не взлетит.
У Вас случайно нет кусочка работающего кода инициализации любого TIM и его IRQhandler ?
У меня нет, но вот у интернета есть http://www.keil.com/download/docs/359.asp Посмотрите, может понравиться, особенно в файле stm32_init функция stm32_UsartSetup .
Э...да я вообще-то usart не просил.
теперь застрял с TIMx - все перепробовал, никак не срабатывает TIM IRQhandler
не забываете его через экстерн обьявлять?
extern "C" void TIM2_IRQHandler(void) { }
Извините что то меня проклинило. Начинали uart. А инициализация таймера там тоже есть, и RTC и много прочего и всё на CMSIS и с комментариями.
Да, сейчас пишу только для себя. Развлекаюсь на новых корпусах. Народ пишет F уже не актуально. Надо на H переходить.
не забываете его через экстерн обьявлять?
extern "C" void TIM2_IRQHandler(void) { }
что то я не так делаю :(, так не работает:
- а так не компилируется
А что сие выкинул?
Первое включение прерывания по Update , второе запуск таймера.
Да и лучше так, чем размазывать по исходнику
А что сие выкинул?
да, спасибо, не внимательность :(
вчера ставил.
в итоге основной моей ошибкой было то, что я не устанавливал приоритет прерыванию.
Создание шаблона под кайло + Systick http://mcu.goodboard.ru/viewtopic.php?id=15
А в Китае еще дешевле. Вот только я могу и лут и плату подготовить для заказа и монтаж, я что можешь ты ?
Молоть на форумах языком, ась "нерукожопый"?
И фотки были прототипа, на изготовление которого ушло 2 часа.
Что такое прототип ты естественно не знаешь...
Это ты верно подметил, рукожопием не занимаюсь
Andy. если вы чего-то не умеете - не стоит подводить под это "принципиальные" соображения - смотритесь смешно.
Это ты верно подметил, рукожопием не занимаюсь ...
И что ж ты делаешь на сайте,где рукожопие основной вид творчества?
да оставьте вы его в покое, как черт какой то выпрыгнет погавкает и опять в конуру. не обращайте внимание сам испарится.
В тему ветки, имеет ли смысл включать и настраивать аналоговый и/или цифровой фильтр на интерфейсе I2C STM32?
Это сильно зависит от схемы, длины шины. И на всякий случай посмотрите 2.14.7 из . Оно конечно к другому процессору, но интересен сам факт.
Сперва лог.анализатор приобрети...
Сперва лог.анализатор приобрети...
Без него советы не даёте?
ОК :)
Без него в I2C и SPI будет весьма тяжко...
Что такое прототип ты естественно не знаешь...
Ну вот и раскрылась вся подноготная.
"нерукожопый" Andy даже развести и смонтировать плату не может, вместо него это делают девочки.
Такс, схемотехник из гего полный ноль .
В кодинге, судя по его постам , ниже плинтуса.
Так что ты здесь забыл "успешный" менагер.
Только поносишь все и ноешь , что другие нищеброды не могут купить то что ты покупаешь?
А может не ты а фирма?
Луччше заткнись и свали , моральный урод.
Без него в I2C и SPI будет весьма тяжко...
Да, не взлетает никак (
Нужна помощь. А то мозг разорвет. Прислали имз питера три железки: STM32F103C8, USB-TTL CH340, STLink V2. ни одна тварь не затаботала. Все в упаковке (думаю с али)
На STM моргает 13 светодиод
СH340 учтановился, но ни flash loader demo, ни куб программерне видит контроллера.
STLink не хочет ставится в виде донгла, как устройство видно STM32 STLink и при попытке заменить на дравер донгла говорит что заменил но ничего не происходит.
2дня уже. голова взрывается. Хоть по какому то вопросу подкиньте. Вот уж не ожидал такой лажи от себя.
Поставить программу STLink. В ней обновить прошивку свистка STLink до последней версии. Поставить программу STCubeProgrammer. В ней обновить прошивку до совсем последней версии. Подключить свисток STlink четырьмя проводками к блюпилу, запустить программу STLink в ней соединится с блюпилом и посмотреть что залито в память.
это нормально, залит блинк по умолчанию.
куб и не увидит, а контролер надо ввести в режим загрузчика, есть перемычки BOOT0 и BOOT1 на плате, читайте инфы полно.
пральна, надо качать дрова с сайта ST, либо ставить программу для STLink-а, она сама дрова проставит.
Такс, схемотехник из гего полный ноль .
В кодинге, судя по его постам , ниже плинтуса.
#ifdef __cplusplus
extern "C"
#endif
Где её нужно применять, а где нет. И попытайся донести до остальных. А то среди вас, "гениев" нет понимания, одни советуют, не знают для чего, у других не компилится.
Andy, тут же много любителей, я например. Нарисуйте мне плиз код i2c на STM32F303ccT6 чтоб eeprom 23lc64 завёлся, раз вы такой крутой. Только плиз без HAL и SPL.
Делал лет 5 назад для 103 камня и AT24C64 на SPL. Чем SPL не устраивает?
SPL это настройка над CMSIS, как HAL. Если они не нужны из функций SPL HAL, а лучше LL можно просто выковыривать CMSIS инструкции. Во первая попавшаяся короткая функция SPL - 16 и 21 строчки делают на CMSIS то, что описано. Кроме того можно посмотреть, как правильно кастовать типы (строка 21), что бы записать правильно в регистр. Иначе можно или не дописать или переписать лишние биты, а потом долго думать, почему работает не так как задумано.
Это для 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]
Спасибо, попробую. У меня висло на разных вариантах на проверке флага TXE или TXIS. Видел вариант в цикле while добавляли проверку на timeout - спасает на случай неожиданных помех или slave устройство тупит.
Дубль