Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
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,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
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,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
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,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
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,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Прием знаковых данных по I2C HAL STM32

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

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, время: 18:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot