Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Прием знаковых данных по I2C HAL STM32

Непрочитано 24.07.2016, 22:05  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Прием знаковых данных по I2C HAL STM32

Всем привет. Наткнулся на такую задачу: в библиотеке HAL для STM32 имеем функцию для чтения данных по I2C:
Код:
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
как принять знаковые данные?
(дело не в том, что можно без HAL управлять I2C, а в том как решить такую задачу - в первую очередь из интереса)
Реклама:
dimdidim вне форума  
Непрочитано 24.07.2016, 23:07  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

В общем получил данные этой функцией (но даже если привести данные к знаковым данным типа x = (int16_t)XX, то х отрицательным все-равно не будет) и если число больше 32767 (в случае с 16 битным числом), то x = -((0xFFFF - x)+1), иначе х = х. Вот как-то так намудрил, но работает, кажется.
По-другому можно еще?
dimdidim вне форума  
Непрочитано 25.07.2016, 07:11  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

uint8_t *pData в функции заменить на int8_t *pData.
И данные передаются только разрядностью 8 бит. 16-битные - не влезают, старшие 8 бит вместе с битом знака числа будут игнорированы.
NewWriter вне форума  
Непрочитано 25.07.2016, 08:29  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Сообщение от dimdidim Посмотреть сообщение
Вот как-то так намудрил
Эт точно.
Чем знаковое отличается от беззнакового? Только тем, воспринимается ли как знак старший разряд.
Можно через union объявить массив байтов и массив целых чисел (естественно, знаковых). И никаких проблем.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
dimdidim (25.07.2016)
Непрочитано 25.07.2016, 17:50  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Сообщение от akegor Посмотреть сообщение
union
а ведь и правда! Спасибо
dimdidim вне форума  
Непрочитано 25.07.2016, 17:59  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Порядок байтов может быть "наоборот" при "массовом" считывании. Проверить надо.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 25.07.2016, 18:29  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Теоретически если задать структуру union с одинаковыми по типу данных переменными за исключением знаковости (union data {int8_t; uint8_t}), то считываем в беззнаковую переменную и так как знаковая переменная занимает ту же память, то эти данные будут восприниматься как знаковые при обращении к знаковой переменной. Верно? Почему наоборот?
dimdidim вне форума  
Непрочитано 25.07.2016, 19:21  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Сообщение от dimdidim Посмотреть сообщение
Почему наоборот?
При считывании может сначала идти старший байт, а может и младший. (Что за устройство?) А при записи в массив байтов, который и массив целых, в этих самых целых старший и младший могут быть попутаны. Надо проверить.
Если читаете не массивом, а побайтно, то спокойней заносить байты в знаковое целое с необходимым сдвигом.

Сообщение от dimdidim Посмотреть сообщение
union с одинаковыми по типу данных переменными за исключением знаковости (union data {int8_t; uint8_t})
Сразу не стал вникать.
Я имел ввиду вариант типа считывания сразу трех осей акселерометра, шести байтов.
Вот они читаются в массив байтов, а вытаскиваются из структуры, состоящей из трех знаковых целых.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.

Последний раз редактировалось akegor; 25.07.2016 в 19:24.
akegor вне форума  
Непрочитано 25.07.2016, 21:59  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

Я вас понял, наоборотность впринципе зависит только от того как расположены регистры в самом датчике (да,я как раз читаю три оси с HMC5883, пока запланировал проверить по-байтно как доберусь до компьютера) - там вроде все ровно.

не соображу только как массив организовать:
union {int8_t x; uint8_t ux;}data[6];
и достаем только знаковые байты и дальше уже склеиваем старший и младший байты и делаем с ними всякое
а как сразу вытаскивать значения трех осей?
dimdidim вне форума  
Непрочитано 25.07.2016, 22:35  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

union объединяет все в одной куче - каждую переменную (массив) с нулевого адреса.
Посему, объявляется союз массива из шести байтов и структуры, которая состоит из трех шестнадцатибитовых целых (естественно, знаковых). Типа,
PHP код:
struct Astruct {
    int16_t axi, ayi, azi;
};

union Adata {
    uint8_t mas[6];
    struct Astruct Acc;
}; 
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Сказали "Спасибо" akegor
dimdidim (25.07.2016)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
I2C EEPROM. Нужно отследить факт передачи данных. ArtemKolesnikov Микроконтроллеры, АЦП, память и т.д 3 19.02.2013 14:42
Atmega, i2c и CodeVision deeman30rus AVR 3 21.01.2013 15:48
Как программно организовать передачу и прием данных ft232 tusya83 Микроконтроллеры, АЦП, память и т.д 19 01.04.2010 18:33
Proteus прием данных с COM zerion Микроконтроллеры, АЦП, память и т.д 10 28.04.2008 07:15
PIC16F877A pawelk Микроконтроллеры, АЦП, память и т.д 17 28.05.2005 23:54


Часовой пояс GMT +4, время: 12:14.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.