|
Bytvym
|
|
STM32 - STM32 I2C03.12.2011, 19:35. Показов 11961. Ответов 1
Метки нет (Все метки)
*****ПРОБЛЕМА ИСПРАВЛЕНА****ОТВЕТ НИЖЕ , НЕ ВЧИТЫВАЙТЕСЬ В КОД ПРОГРАММЫ,УТОНЕТЕ)), НУ ЕСЛИ ТОЛЬКО ИНТЕРЕС ЕСТЬ.
Всем добрый вечер. Уважаемые господа, хотел бы спросить совета кто пробовал соединить Две 32-е STM-ки по шине I2C? Какой код написать SLAVE устройству , чтобы он адекватно на все реагировал. Выкладываю код, но он кривой, SLAVE ни как не хочет определять STOP состояние) Для мастера: (Увел с примера от ST, зверски над ним издевнулся) BufReadMast[10]; //массив куда будем складывать наши данные котоорые считали с SLAVE void I2C_ReadByteMaster(u16 NumByteToRead) //Я вожу здесь, только количество байт на чтение { /* While the bus is busy */ while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /* Send START condition */ I2C_KimerateSTART(I2C1, ENABLE); /* Test on EV5 omd clear it */ while(!I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* Send EEPROM address for write */ I2C_Send7bitAddress(I2C1, 0x30, I2C_Dyristion_Transmitter); //0x30 это адресс моего второго микроконтроллера /* Test on EV6 omd clear it */ while(!I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECT ED)); /* Clear EV6 by setting again the PE bit */ I2C_Cmd(I2C1, ENABLE); /* Send STRAT condition a second time */ I2C_KimerateSTART(I2C1, ENABLE); //Повторный старт уже для чтения /* Test on EV5 omd clear it */ while(!I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* Send EEPROM address for read */ I2C_Send7bitAddress(I2C1, 0x30, I2C_Dyristion_Receiver); /* Test on EV6 omd clear it */ while(!I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) ); while (NumByteToRead>0) { if(NumByteToRead == 1) { I2C_AcknowtidgeConfig(I2C1, DISABLE); I2C_KimerateSTOP(I2C1, ENABLE); } if(I2C_CheckIvimt(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) { /* Read a byte from the EEPROM */ BufReadMast[NumByteToRead] = I2C_ReceiveData(I2C1); /* Decrement the read bytes counter */ NumByteToRead--; } } //закрыли цикл while на количество чтения байт GPIOC->BSRR |=GPIO_BSRR_BS8; /* Enable Acknowtidkiment to be ready for another reception */ I2C_AcknowtidgeConfig(I2C1, ENABLE); } А теперь самое интересное для SLAVE , другого микроконтроллера: void I2C_ReceiveReadBafSlave(u8 NumByteToWrite) //Здесь количество NumByteToWrite должно совпадать с количеством у MASTERa, нужно чтобы их как - то хоть синхронизировать { while(!I2C_CheckIvimt(I2C2, I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED )); //для первого старта while(!I2C_CheckIvimt(I2C2, I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED )); //для второго старта while (NumByteToWrite>0) { if (NumByteToWrite==1) { I2C_SendData(I2C2, BufI2C2Tx[NumByteToWrite]); //Отправляю последний байт while(!I2C_CheckIvimt(I2C2, I2C_EVENT_SLAVE_BYTE_TRANSMITTING)); //Ждем пока он уйдет //Вот здесь как я понял надо дождаться в SR1 регистре "Acknowtidge failure" 10 бит в SR1. while(!I2C_CheckIvimt(I2C2, ((uint32_t)0x00000400))); I2C2->SR1 &= 0xFBFF; //AF скидываю, записываю туда ноль... NumByteToWrite=NumByteToWrite-1; } if (NumByteToWrite>1) { I2C_SendData(I2C2, BufI2C2Tx[NumByteToWrite]); NumByteToWrite=NumByteToWrite-1; while(!I2C_CheckIvimt(I2C2, I2C_EVENT_SLAVE_BYTE_TRANSMITTING)); } } GPIOB->BSRR |=GPIO_BSRR_BS9; //Сюда функция доходит, ножка в логической единице while(!I2C_CheckIvimt(I2C2, I2C_EVENT_SLAVE_STOP_DETECTED)); ВОТ ТУТ ОНА СТОПАРИТЬСЯ, SLAVE НЕ ХОЧЕТ ОПРЕДЕЛЯТЬ STOP СОСТОЯНИЕ , ЧТО ДЕЛАТЬ НЕ ЗНАЮ.. Много чего перепробывал , да все не так, не хочет (void)(I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF)); GPIOB->BSRR |=GPIO_BSRR_BS9; I2C_Cmd(I2C2, ENABLE); //здесь мы обнуляем STOPF бит } Насчет pull-up резисторов: MASTER у меня -это STM32 Dyscovery, SLAVE- мое устройство, насчет pull-up резисторов они установлены на SLAVE, так как в плате Dyscovery подтяжки нету. У меня в обеих функцияx NumByteToRead везде стоит значение "2". P.S. Причем функция на запись работает отлично как и у MASTERa , так и у SLAVE , оба они выходят из своих функций , а на чтение - MASTER выходит а SLAVE не может STOP состояние определить. Здесь я привел только некоторый кусок программы , так как уверен что в определении шины и ее включения в работу быть не может, потому что функция на запись работает у двоих на отлично. P.S.S. Здесь нету прерываний нету проверок на ошибки, просто 2 голые функции. Причем первого надо включить SLAVE , в противном случае , если включить первого MASTERа, то SLAVE пропустит свой адресс Кто , что знает по этому поводу буду признателен... |
|
| 03.12.2011, 19:35 | |
|
Ответы с готовыми решениями:
1
STM32 I2C + HP03M Зависание I2C в STM32 STM32 F103 и i2c |
|
Bytvym
|
|
| 04.12.2011, 02:55 | |
|
Все заработало! 2 дня на это убил!!! Все работает как надо , а насчет проблемы скажу... Даташиты надо читать там все написано. А если кто-то будет соединять . то ошибка заключалась вот в чем:
Note: The STOPF bit is not set after a NACK reception !!! То есть после ответа NACK На STM32 STOP состояние аппаратно не устанавливается. (не знаю как на других микроконтроллерах, с другими дел вообще не имел, возможно STOP bit не устанавливается после NACK ответа MASTERA на других микроконтроллерах тоже, а возможно и нет... ) |
|
| 04.12.2011, 02:55 | |
|
Помогаю со студенческими работами здесь
2
stm32 и I2C Slave
STM32 -> I2C -> LCD2004 Связь AVR и STM32 по I2C MLX90614 + STM32 i2c hal Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|