24.07.2016, 22:05
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Прием знаковых данных по 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, а в том как решить такую задачу - в первую очередь из интереса)
|
|
|
|
24.07.2016, 23:07
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Прием знаковых данных по I2C HAL STM32
В общем получил данные этой функцией (но даже если привести данные к знаковым данным типа x = (int16_t)XX, то х отрицательным все-равно не будет) и если число больше 32767 (в случае с 16 битным числом), то x = -((0xFFFF - x)+1), иначе х = х. Вот как-то так намудрил, но работает, кажется.
По-другому можно еще?
|
|
|
|
25.07.2016, 07:11
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Прием знаковых данных по I2C HAL STM32
uint8_t *pData в функции заменить на int8_t *pData.
И данные передаются только разрядностью 8 бит. 16-битные - не влезают, старшие 8 бит вместе с битом знака числа будут игнорированы.
|
|
|
|
25.07.2016, 08:29
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Прием знаковых данных по I2C HAL STM32
Сообщение от dimdidim
|
Вот как-то так намудрил
|
Эт точно.
Чем знаковое отличается от беззнакового? Только тем, воспринимается ли как знак старший разряд.
Можно через union объявить массив байтов и массив целых чисел (естественно, знаковых). И никаких проблем.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
25.07.2016, 17:50
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Прием знаковых данных по I2C HAL STM32
Сообщение от akegor
|
union
|
а ведь и правда! Спасибо
|
|
|
|
25.07.2016, 17:59
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Прием знаковых данных по I2C HAL STM32
Порядок байтов может быть "наоборот" при "массовом" считывании. Проверить надо.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
25.07.2016, 18:29
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Прием знаковых данных по I2C HAL STM32
Теоретически если задать структуру union с одинаковыми по типу данных переменными за исключением знаковости (union data {int8_t; uint8_t}), то считываем в беззнаковую переменную и так как знаковая переменная занимает ту же память, то эти данные будут восприниматься как знаковые при обращении к знаковой переменной. Верно? Почему наоборот?
|
|
|
|
25.07.2016, 19:21
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Прием знаковых данных по I2C HAL STM32
Сообщение от dimdidim
|
Почему наоборот?
|
При считывании может сначала идти старший байт, а может и младший. (Что за устройство?) А при записи в массив байтов, который и массив целых, в этих самых целых старший и младший могут быть попутаны. Надо проверить.
Если читаете не массивом, а побайтно, то спокойней заносить байты в знаковое целое с необходимым сдвигом.
Сообщение от dimdidim
|
union с одинаковыми по типу данных переменными за исключением знаковости (union data {int8_t; uint8_t})
|
Сразу не стал вникать.
Я имел ввиду вариант типа считывания сразу трех осей акселерометра, шести байтов.
Вот они читаются в массив байтов, а вытаскиваются из структуры, состоящей из трех знаковых целых.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 25.07.2016 в 19:24.
|
|
|
|
25.07.2016, 21:59
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: Прием знаковых данных по I2C HAL STM32
Я вас понял, наоборотность впринципе зависит только от того как расположены регистры в самом датчике (да,я как раз читаю три оси с HMC5883, пока запланировал проверить по-байтно как доберусь до компьютера) - там вроде все ровно.
не соображу только как массив организовать:
union {int8_t x; uint8_t ux;}data[6];
и достаем только знаковые байты и дальше уже склеиваем старший и младший байты и делаем с ними всякое
а как сразу вытаскивать значения трех осей?
|
|
|
|
25.07.2016, 22:35
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: Прием знаковых данных по I2C HAL STM32
union объединяет все в одной куче - каждую переменную (массив) с нулевого адреса.
Посему, объявляется союз массива из шести байтов и структуры, которая состоит из трех шестнадцатибитовых целых (естественно, знаковых). Типа,
PHP код:
|
struct Astruct { int16_t axi, ayi, azi; };
union Adata { uint8_t mas[6]; struct Astruct Acc; };
|
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:18.
|
|