Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 83

24C32 не могу подружить с STM32F103

28.01.2019, 22:43. Показов 5282. Ответов 12

Студворк — интернет-сервис помощи студентам
Пло почти написал проект, уперся в какую то хр*нь.
Фото проекта



не работает 24C32 на плате DS3231

Настройки I2C

C++
1
2
3
4
5
6
7
8
9
10
  // На этой же шине, часы. Теоретически тут не должно быть проблем.
  hi2c2.Instance = I2C2;
  hi2c2.Init.ClockSpeed = 100000;
  hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;


I2C_EEPROM.C

C++
1
2
3
4
5
6
7
8
#include "I2C_EEPROM.h" 
void I2C_EEPROM_write(I2C_HandleTypeDef hi, uint8_t *buff, uint16_t buff_size, uint16_t mem_adr){
    HAL_I2C_Mem_Write(&hi, (uint16_t)I2C1_DEVICE_ADDRESS, mem_adr, 1, buff, (uint16_t)buff_size, (5*buff_size)+5);  
    HAL_Delay((5*buff_size)+5);
}
void I2C_EEPROM_read(I2C_HandleTypeDef hi, uint8_t *buff, uint16_t buff_size, uint16_t mem_adr){
    HAL_I2C_Mem_Read(&hi, (uint16_t)I2C1_DEVICE_ADDRESS, mem_adr, 1, buff , buff_size, (5*buff_size)+5); 
}



на плате перемычки (А0-А2) запаял на землю
I2C_EEPROM.h

C++
1
2
3
4
5
#include "stm32f1xx_hal.h"
 
#define I2C1_DEVICE_ADDRESS      0xA0   /* A0 = A1 = A2 = 0 */
void I2C_EEPROM_write(I2C_HandleTypeDef hi, uint8_t *buff, uint16_t buff_size, uint16_t mem_adr);
void I2C_EEPROM_read(I2C_HandleTypeDef hi, uint8_t *buff, uint16_t buff_size, uint16_t mem_adr);


Использую в MAIN

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
I2C_HandleTypeDef hi2c2;
#define I2C_RTC hi2c2
 
uint8_t eeprom[9];
I2C_EEPROM_read(I2C_RTC, eeprom, 9, 0);
    
if(eeprom[0] == 255){
    eeprom[0] = 8;
    eeprom[1] = 0;
    eeprom[2] = 0;
    eeprom[3] = 23;
    eeprom[4] = 0;
    eeprom[5] = 0;
    eeprom[6] = 50;
    eeprom[7] = 50;
    eeprom[8] = 60;
    I2C_EEPROM_write(I2C_RTC, eeprom,9, 0);
    for (uint8_t i = 0;i<9;i++){
        eeprom[i] = 0;
    }
}
I2C_EEPROM_read(I2C_RTC, eeprom, 9, 0);

И получаю вот это:


чу за.. спасайте.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2019, 22:43
Ответы с готовыми решениями:

Не могу подружить 3G роутер с 3G
Помогите. Взял роутер Uplink Wi-Fi Router UR-312N4G. Компьютер его видит (подключен через шнур) и WiFi видит нормально. Вставляю USB модем...

Не могу подружить 2 рутера (
Рубета помогите пожалуйста. Уже 7 часов не могу сделать инет на 2 роутере. Имеется 2 роутера модели Zyxel. Между собой роутере...

Не могу подружить Joomla 3.3.6 и VirtueMart 3
Скачал-установил последний VirtueMart 3.0.4 на Joomla 3.3.6, но все страницы магазина ведут на чистую белую страницу. Попытки указывать...

12
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
28.01.2019, 23:13
В описании 24с32 указано, что она питается от 5 вольт, при этом уровень логической "единицы" составляет 0,7 от Up, то есть 3,5 вольт и выше. stm32fxxx имеют питание 3,3в. Как дружили питания/сигналы друг с другом?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
28.01.2019, 23:19
-VIRUS-, Есть подозрения что индусы в хале забыли добавить сдвиг байта адреса влево на один бит.
Попробуй так сделать
C
1
#define I2C1_DEVICE_ADDRESS      0xA0 << 1
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
28.01.2019, 23:22
alexey6689, нормально она от 3.3 Вольт пашет

Правда на 400 кГц надо 5 Вольт. На 100 кГц полет нормальный с 3.3
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
28.01.2019, 23:27
-VIRUS-, и кстати есть подозрения что
C
1
 HAL_I2C_Mem_Write(&hi, (uint16_t)I2C1_DEVICE_ADDRESS, mem_adr, 2, buff, (uint16_t)buff_size, (5*buff_size)+5);
Размерность байт в адресе ячейке все таки 2. А на 1.
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
28.01.2019, 23:35
Я вот сходу нашел PDF от MicroChip на нее на 5 вольт питания -)).
Про адрес устройства не очень понятно, но TC пишет, что с часами на той же шине у него все хорошо (правда адрес часов в HAL-нотации не указал).
0
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 83
28.01.2019, 23:43  [ТС]
По поводу адреса. Я изучал примеры те что предложил гугл. Ну все примеры по копирку с одним байтом. Используют адрес 0x50. И сдвигают его. Простите жена посадила с лялькой пока на кухне. Не удобно с мобилы.

Добавлено через 4 минуты
По поводу питания, в техже примерах везде 3.3
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
28.01.2019, 23:45
Да, тот pdf был 1996 года, думаю, они уже давно научились от 3 вольт работать.
Меня весь этот HAL вообще в дрожь бросает, стараюсь без него писать все.
0
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 83
29.01.2019, 00:59  [ТС]
во, сел за клаву)
0xA0 -> 10100000

вот кусок из примера
C++
1
2
3
4
5
#define I2C1_DEVICE_ADDRESS      0x50   /* A0 = A1 = A2 = 0 */
#define MEMORY_ADDRESS             0x08
 
xBuffer[0] = 'M'; //0x4D
HAL_I2C_Mem_Write(&hi2c1, (uint16_t) I2C1_DEVICE_ADDRESS<<1, MEMORY_ADDRESS, 1, xBuffer, 1, 5);  //write to memory address 08
еще не понятно почему в 8мую ячейку запись... для примера?

вот описание функции hal
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
  * @brief  Write an amount of data in blocking mode to a specific memory address
  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
  *                the configuration information for the specified I2C.
  * @param  DevAddress Target device address
  * @param  MemAddress Internal memory address
  * @param  MemAddSize Size of internal memory address
  * @param  pData Pointer to data buffer
  * @param  Size Amount of data to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
Добавлено через 29 минут
короче по пробовал сдвинуть 0xA0,
микросхема перестала читаться, I2C_EEPROM_read не изменяет буфер(полагаю hal понимает что нет ответов ask)
отсюда полагаю что чтение работает запись нет(пока только на уровне гипотезы). прогера жаль нет дома.

Добавлено через 39 минут
5 вольтовое питание тоже не помогает
0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
29.01.2019, 01:48
А этот HAL точно нормально поддерживает двухбайтовую адресацию? Может в этом дело.
0
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 83
29.01.2019, 02:17  [ТС]
Карочееее, все таки код корявый. Нашел либу EEPROM24xx

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

вот тут надо разбираться, да лениво что то. либо рабочая, спасибо чуваку с ником nimaltd
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#if ((_EEPROM_SIZE_KBIT==1) || (_EEPROM_SIZE_KBIT==2))
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xa0,Address,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
#elif   (_EEPROM_SIZE_KBIT==4)
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA0|(Address&0x0001),Address>>1,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
#elif   (_EEPROM_SIZE_KBIT==8)
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA0|(Address&0x0003),Address>>2,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
#elif   (_EEPROM_SIZE_KBIT==16)
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA0|(Address&0x0007),Address>>3,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
#else
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA0,Address,I2C_MEMADD_SIZE_16BIT,(uint8_t*)data,size_of_data,100) == HAL_OK)
#endif
{
    HAL_Delay(7);
    return true;
}
else
{
    return false;       
}
вот под правленый код
MyLIB.rar
0
2 / 2 / 1
Регистрация: 07.12.2013
Сообщений: 83
29.01.2019, 12:00  [ТС]
чет не спалось, сравнивая код, нашел ошибку
C++
1
2
#define I2C_MEMADD_SIZE_8BIT            0x00000001U
#define I2C_MEMADD_SIZE_16BIT           0x00000010U
я юзал

HAL_I2C_Mem_Write(&hi, (uint16_t)I2C1_DEVICE_ADDRESS, mem_adr, 1, buff, (uint16_t)buff_size, (5*buff_size)+5);

а надо было
HAL_I2C_Mem_Write(&hi, (uint16_t)I2C1_DEVICE_ADDRESS, mem_adr, 16, buff, (uint16_t)buff_size, (5*buff_size)+5);


и вот это я не пойму, в моем случае _EEPROM_SIZE_KBIT 32

#elif (_EEPROM_SIZE_KBIT==16)
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA0|(Address&0x0007),Address>>3,I2C_MEMADD_SIZE_8BIT,(uint8_t*)data,siz e_of_data,100) == HAL_OK)
#else
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA 0,Address,I2C_MEMADD_SIZE_16BIT,(uint8_t*)data,si ze_of_data,100) == HAL_OK)
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
29.01.2019, 14:24
-VIRUS-, да я тут немного ошибся размерность памяти в HAL указывается в битах, а не в байтах. Я думал что в байтах

Цитата Сообщение от -VIRUS- Посмотреть сообщение
и вот это я не пойму, в моем случае _EEPROM_SIZE_KBIT 32
#elif (_EEPROM_SIZE_KBIT==16)
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA 0|(Address&0x0007),Address>>3,I2C_MEMADD _SIZE_8BIT,(uint8_t*)data,size_of_data,1 00) == HAL_OK)
#else
if(HAL_I2C_Mem_Write(_EEPROM24XX_I2C,0xA 0,Address,I2C_MEMADD_SIZE_16BIT,(uint8_t *)data,size_of_data,100) == HAL_OK)
Это связано с тем, что у 16 битных епромок немного другой способ адресации. Там первым байт состоит из 4 бит адреса считай 0xA. Потом идут 3 старшие бита указывающие на номер блока блок памяти, и дальше 1 бит чтение/запись. Дальше вторым байтом досылается адрес внутри блока.
У меня есть стойкое подозрение, что у автора есть косяки с реализацией с16 епромок. Ибо он засовывает некорректно в первый байт данные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2019, 14:24
Помогаю со студенческими работами здесь

Не могу подружить мультиметр с ПК (решено)
http://s11.***********/i183/1207/35/b444d876f8cd.jpg Почитав хорошую статью по работе с LabView от Bomomda, загорелся таки подключить...

Не могу подружить jQuery и MooTools
Добрый вечер! Не могу подружить jQuery и MooTools, добавила на сайт aiContactSafe, теперь в ней либо не работает Капча и красивые...

Не могу подружить Eclispe и Tomcat
Привет всем). Не могли бы Вы, уважаемые форумчани, помочь решить проблему связи между Eclispe'ом и Tomcat'ом (ошибка на рисунку), вроде все...

Не могу подружить php и mysql
Итак, имеется php 5.5.3 и mysql 5.6.13.(ось Винда 8, сервер Апач 2.4.) По отдельности работают без проблем, а вот пхп видеть mysql не...

AT91sam7s128 не могу подружить с keil
Имеется небольшая платка с AT91SAM7S128, коленочной сборки, на ней обычная обвязка,Кварц 16 мгц, Вообщем все соединено согласно даташиту. И...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru