Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/112: Рейтинг темы: голосов - 112, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.08.2015
Сообщений: 28

Как читать данные по I2C с помощью HAL?

27.09.2015, 14:55. Показов 23474. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
STM32F7
Пытаюсь прочитать данные по адресу, в итоге контроллер просто зависает
Code
1
2
3
4
5
6
7
8
9
10
11
uint8_t y2s_Buffer;
uint16_t addr = 0x8404;
 
if(HAL_I2C_Master_Transmit(&head_I2C, (uint16_t)(ADR), (uint8_t*)addr, 2, 100) != HAL_OK){ // На этом моменте все зависает
return 0;
}
 
// До сюда даже не доходит
if(HAL_I2C_Master_Receive(&head_I2C, (uint16_t)ADR, (uint8_t*)y2s_Buffer, 1, 100) != HAL_OK){
return 0;
}
Причем зависает именно на регистрах чтения
При записи все нормально
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2015, 14:55
Ответы с готовыми решениями:

Как читать данные из *.DBF с помощью ASP?
HELP! Дайте кто-нибудь толковый ответ на вопрос: 'Как прочитать данные из DBF-файла?' Вот кусок моего скрипта: ...

Как читать данные из *.DBF с помощью ASP?-II
С 19 февраля Relib.com и Издательство 'Питер' проводят конкурс на самых активных участников этих форумов с розыгрышем отличных призов....

Как читать и выводить данные из/в файл с помощью указателей
Здравствуйте! Вот не могу разобраться в простом вопросе: как читать и выводить из/в файл с помощью указателей? Я так понимаю, функция...

17
0 / 0 / 0
Регистрация: 22.08.2015
Сообщений: 28
27.09.2015, 15:17
А вот так ничего не зависает

Code
1
2
3
4
5
6
7
8
9
10
11
12
uint8_t y2s_Buffer[3];
 
uint16_t addr = 0x8404;
uint16_t val = 0x06;
 
y2s_Buffer[0] = (uint8_t)(addr >> 8);
y2s_Buffer[1] = (uint8_t)(addr & 0xFF);
y2s_Buffer[2] = (uint8_t)(val & 0xFF);
 
if(HAL_I2C_Master_Transmit(&head_I2C, (uint16_t)(ADR), (uint8_t*)y2s_Buffer, 3, 100) != HAL_OK){
return 0;
}
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 48
27.09.2015, 22:54
Цитата Сообщение от Fomykor
STM32F7
Пытаюсь прочитать данные по адресу, в итоге контроллер просто зависает
Код:
uint8_t y2s_Buffer;
uint16_t addr = 0x8404;

if(HAL_I2C_Master_Transmit(&head_I2C, (uint16_t)(ADR), (uint8_t*)addr, 2, 100) != HAL_OK){ // На этом моменте все зависает
return 0;
}

Третий параметр, который (uint8_t*)addr, должен быть указателем на буффер с данными, а вы подсовываете непонятную константу.
Для отправки SIZE байт по адресу устройства I2C_DevAddress надо писать:

Code
1
2
uint8_t y2s_Buffer[SIZE] = {0};
HAL_I2C_Master_Transmit(&head_I2C, I2C_DevAddress, &y2s_Buffer[0], SIZE, Timeout);
0
0 / 0 / 0
Регистрация: 22.08.2015
Сообщений: 28
28.09.2015, 11:55
Нет, сразу ошибка компилятора
expression must have pointer-to-object type
Все правильно я передаю, иначе устройство бы не инициализировалось таким кодом
Но вот данные по адресу не прочесть
0
hosh
28.09.2015, 14:14
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
result User_MPU6050_Test(void)
{
uint8_t data[1];
uint16_t div_adr;
 
div_adr = (MPU6050_DEFAULT_ADDRESS | MPU6050_WRITE);
data[0] = MPU6050_RA_WHO_AM_I;
 
HAL_I2C_Master_Transmit(&hy2s1,div_adr,(uint8_t*)data,1,200);
 
div_adr = (MPU6050_DEFAULT_ADDRESS);
HAL_I2C_Master_Receive(&hy2s1,div_adr,(uint8_t*)data,1,200);
 
if(data[0] == 0x68) return 1;
return 0;
}
SCL, SDA подтянуты на VCC ?
0 / 0 / 0
Регистрация: 22.08.2015
Сообщений: 28
28.09.2015, 18:00
Да, подтянуты, иначе я бы не смог инициализировать over 500 регистров
Мой код чтения не отличается от вашего, только названия другие
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
30.09.2015, 21:42
Да, подтянуты, иначе я бы не смог инициализировать over 500 регистров
А откуда вы знаете что они инициализировались, если не можете прочитать их?

У меня вот так читается и пишется:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
uint8_t I2C_Read_Byte(uint8_t addr)
{
uint8_t data = 0;
uint8_t d;
while (HAL_I2C_GetState(&hy2s1) != HAL_I2C_STATE_READY);
d = HAL_I2C_Master_Transmit(&hy2s1, SLAVE_ADDR, &addr, 1, TIMEOUT);
if ( d != HAL_OK) {
return d;
}
 
while (HAL_I2C_GetState(&hy2s1) != HAL_I2C_STATE_READY);
d = HAL_I2C_Master_Receive(&hy2s1, SLAVE_ADDR, &data, 1, TIMEOUT);
if ( d != HAL_OK) {
return d;
}
return data;
}
 
uint8_t I2C_Write_Byte(uint8_t addr, uint8_t data)
{
uint8_t buf[] = {addr, data};
uint8_t d;
while (HAL_I2C_GetState(&hy2s1) != HAL_I2C_STATE_READY);
d = HAL_I2C_Master_Transmit(&hy2s1, SLAVE_ADDR, buf, 2, TIMEOUT);
if ( d != HAL_OK) {
return d;
}
return HAL_OK;
}
соответственно сами вызовы:
Code
1
2
I2C_Write_Byte(0x40, 0xD0);
prymtf("0x40: %x\n", I2C_Read_Byte(0x40));
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
30.09.2015, 21:47
Обратите внимание, что SLAVE_ADDR у меня не модифицируется перед операцией записи. Это делается внутри HAL_I2C_Master_Transmit А если быть точным то в I2C_MasterRequestWrite:
Code
1
2
3
4
5
if(hy2s->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
{
/* Send slave address */
hy2s->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);
}
0
hosh
04.10.2015, 22:01
[QUOTE="otixsom"][QUOTE="Цитата:[/QUOTE]
...
У меня вот так читается и пишется:
Код:
...
d = HAL_I2C_Master_Receive(&hy2s1, SLAVE_ADDR, &data, 1, TIMEOUT);
if ( d != HAL_OK) {
return d;
}
return data;
...
}

<тю>
Code
1
2
3
4
5
6
7
typedef enum
{
HAL_OK       = 0x00,
HAL_ERROR    = 0x01,
HAL_BUSY     = 0x02,
HAL_TIMEOUT  = 0x03
} HAL_StatusTypeDef;
</бля>
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
05.10.2015, 00:17
Цитата Сообщение от hosh
<тю>Код:
typedef enum
{
HAL_OK = 0x00,
HAL_ERROR = 0x01,
HAL_BUSY = 0x02,
HAL_TIMEOUT = 0x03
} HAL_StatusTypeDef;</бля>
вы за return d; ? это у меня для дебага было выведено когда систематически падала передача.
Так вообще там должен быть вменяемый обработчик ошибки.
0
0 / 0 / 0
Регистрация: 22.08.2015
Сообщений: 28
05.10.2015, 15:52
Цитата Сообщение от otixsom
А откуда вы знаете что они инициализировались, если не можете прочитать их?
Камера переключает режимы, когда я отсылаю разные таблицы.
Все равно зависает, наверное дело в устройстве, буду разбираться
0
svidosh
05.10.2015, 21:42
А на основе прерываний кто-нибудь делал? Крутится несколько потоков FriiRTOS, не хочется их блокировать.
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
05.10.2015, 21:46
Есть полностью рабочий проект на прерываниях. Работаю с RTC. Завтра могу скинуть. Чтобы заставить "это" работать ушло почти 3 дня. Сейчас работает как часы, проверял на FriiRTOS (хотя там завязки особо никакой, разве что семафор по окончанию записи/чтения). Ну очень глючный I2C на STM. Объем errata по разделу ужасает.
0
svidosh
05.10.2015, 23:33
Если не трудно, скиньте, пожалуйста.
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
06.10.2015, 09:10
Прикладываю проект. Только что проверил - все работает. Камень STM32F103CB, CoIDE 1.7.8, часы DS3231 висят на I2C2, дебаг выводится в USORT2 на 115200N1. Впрочем это всё указано в файлах, коментов много. Раз в секунду читает часы, выводит дату/время + температуру. Крутится на FriiRTOS v8.2.2. http://disk.tom.ru/1lvej86
0
svidosh
06.10.2015, 21:33
Спасибо, скачал. Завтра буду пробовать.
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,183
06.10.2015, 22:07
А вы не смотрели что на линии происходит ЛА или осцилом? Смысл пробовать разные варианты, если не работает вышепредложенное.

Еще попробуйте просканировать весь диапазон адресов I2C (0x00-0xFF). камера может отвечать на двух разных блоках адресов, но на одном из них может не читать либо не писать. У меня так было с камерой ov7670 она отвечала на два адреса до 127 и на два адреса выше 127.
0
dsd_sorp
16.10.2015, 10:21
Цитата Сообщение от Fomykor
Все равно зависает, наверное дело в устройстве, буду разбираться
Ну конечно. Устройство виновато. Или инженеры ST... Или Билл Гейтс... Да кто угодно )

В параметрах вызова функций перед addr и y2s_Buffer амперсанды проставьте...
Где-то так:
Code
1
2
3
4
5
6
7
8
9
10
11
uint8_t y2s_Buffer;
uint16_t addr = 0x8404;
 
if(HAL_I2C_Master_Transmit(&head_I2C, (uint16_t)(ADR), (uint8_t*)&addr, 2, 100) != HAL_OK){ // На этом моменте все зависает
return 0;
}
 
// До сюда даже не доходит
if(HAL_I2C_Master_Receive(&head_I2C, (uint16_t)ADR, (uint8_t*)&y2s_Buffer, 1, 100) != HAL_OK){
return 0;
}
Объяснять нужно, что это и зачем? Или сами разберетесь? )
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.10.2015, 10:21
Помогаю со студенческими работами здесь

Чтение регистров на HAL по I2C
Приветствую всех! Подскажите, пожалуйста, так правильно читать регистры другой мс, подключенной по I2C? int16_t val = 0; ...

MLX90614 + STM32 i2c hal
Доброго времени суток. Возникла загвоздка в попытке оживить ИК термодатчик MLX90614 по y2s. Проект генерировал в Cube, работаю в...

Как, используя wiringPI, читать/писать 16-битные адреса регистров I2C?
Уже добрых два часа с MLX90640 бьюсь, все не могу понять: а чего это у меня регистры не пишутся? Копнул глубже: оказывается, wiringPi...

I2C, HAL, запись и чтение GT811
Привет! Столкнулся с такой вот досадной проблемой, предполагаю, что она решается довольно легко, просто я не вижу или не так понимаю чего...

STM32F4discovery Соединение 2-ух плат I2C. HAL.
Подключил 2 платы stm32 по I2C. Линии SDA и SCL подтянуты 10к к питанию +3В одной из плат. Земли объединены. Одна плата берёт питание от...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru